Docker

コンテナのプライベートリポジトリを作る。
$は一般user、#はrootを示す。

Dockerのインストール

最初にdockerのインストールが必要。
CentOSの場合は以下のとおり。

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
$ sudo systemctl start docker
$ sudo systemctl enable docker

コンテナが実行できるか確認。

$ sudo docker run hello-world

参考

レジストリのコンテナ

dockerレジストリ用のコンテナでレポジトリを作成できる。

$ sudo docker run --restart=always -d -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 -p 5000:5000 --name registry registry:2

docker hubから、alpineのコンテナイメージを落としてきて、ローカルレジストリにpushしてみる。

$ sudo docker pull alpine:3.8.4
3.8.4: Pulling from library/alpine
Digest: sha256:04696b491e0cc3c58a75bace8941c14c924b9f313b03ce5029ebbc040ed9dcd9
Status: Image is up to date for alpine:3.8.4
docker.io/library/alpine:3.8.4
# docker image tag alpine:3.8.4 localhost:5000/local-alpine
# docker push localhost:5000/local-alpine
The push refers to repository [localhost:5000/local-alpine]
d9ff549177a9: Pushed
latest: digest: sha256:899a03e9816e5283edba63d71ea528cd83576b28a7586cf617ce78af5526f209 size: 528

コンテナイメージをダウンロードできているようである。

リモートマシンからのダウンロード

リポジトリはセキュアな環境である必要がある。
ここでは簡単なテストのため、インセキュアな環境で試してみる。

docker ホストマシン上で以下のように設定する。
daemon.jsonというファイルを作成する。

# cat /etc/docker/daemon.json
{
  "insecure-registries" : ["<ホストマシンのIP>:5000"]
}

別のクライアントマシンからイメージをpullしてみる。
ここでは、vagrantでクライアント用のVMを起動する。
また、今回はデーモンレスのコンテナエンジンであるpodmanを使ってみる。

$ vagrant init centos/7
$ vagrant up
$ vagrant ssh
$ sudo yum install -y podman

インセキュアなアクセスのため、クライアントマシン上で以下の編集をする。

# /etc/containers/registries.conf
[registries.insecure]
registries = ['<dockerホストのIP>:5000']

イメージをpullしてみる。podmanは、dockerと同様なコマンドライン指定で動作する。

$ sudo podman pull 192.168.56.101:5000/local-alpine
Trying to pull 192.168.56.101:5000/local-alpine...Getting image source signatures
Copying blob c87736221ed0 done
Copying config dac7051149 done
Writing manifest to image destination
Storing signatures
dac7051149965716b0acdcab16380b5f4ab6f2a1565c86ed5f651e954d1e615c
$ sudo podman images
REPOSITORY                         TAG      IMAGE ID       CREATED         SIZE
192.168.56.101:5000/local-alpine   latest   dac705114996   12 months ago   4.67 MB

コンテナを起動してみる。

$ sudo podman run -it --rm  --name test-container local-alpine ash -c "hostname"
1b866c0253cc

コンテナイメージは、以下にダウンロードされていることを確認できる。

# ls /var/lib/containers/storage/overlay/d9ff549177a94a413c425ffe14ae1cc0aa254bc9c7df781add08e7d2fba25d27/
diff  empty  link  merged  work

削除してみる。

# podman images
REPOSITORY                         TAG      IMAGE ID       CREATED         SIZE
192.168.56.101:5000/local-alpine   latest   dac705114996   12 months ago   4.67 MB
# podman rmi 192.168.56.101:5000/local-alpine
dac7051149965716b0acdcab16380b5f4ab6f2a1565c86ed5f651e954d1e615c
# ls /var/lib/containers/storage/overlay/
backingFsBlockDev  l

セキュアな環境(自己署名)

今回はテストのため自己署名で確認する。
まずは、365日間有効な自己署名X.509証明書を作成する。

# mkdir -p /root/docker/registry/certs
# cd /root/docker/registry/certs
# openssl req -x509 -nodes -days 365 -subj '/C=JP/ST=Ca/L=Tokyo/CN=registry.example.com/O=MyOrg Inc' -newkey rsa:2048 -keyout server.key -out server.crt

参考 https://www.openssl.org/docs/man1.1.1/man1/req.html

docker registryに証明書を指定し起動する。

# docker run -d \
  --restart=always \
  --name registry \
  -v /root/docker/registry/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
  -p 443:443 \
  registry:2

自己署名なので、クライアントからアクセスしても拒否される。

x509: certificate signed by unknown authority

/etc/docker/certs.dにホスト名と同じ名前のディレクトリを作成し、そこに証明書を置く。

# mkdir -p /etc/docker/certs.d/<myhostname>
# cp /root/docker/registry/certs/*.crt /etc/docker/certs.d/<myhostname>/
# systemctl restart docker

参考

クライアント側では、インセキュアなレジストリとして登録する。

# /etc/containers/registries.conf
[registries.insecure]
registries = ['<dockerホストのIP>']

ここでは、適当にregistry.example.comというホスト名を使い、/etc/hostsにも登録する。
レジストリから適当なイメージをpullすると上手くいく。

$ sudo podman pull registry.example.com/my-ubuntu
Trying to pull registry.example.com/my-ubuntu...Getting image source signatures
Copying blob f9df1fafd224 done
Copying blob a645a4b887f9 done
Copying blob 57db7fe0b522 done
Copying blob fe703b657a32 done
Copying config 77be327e4b done
Writing manifest to image destination
Storing signatures
77be327e4b63498e0faaa065d30d7c0e5499e42a09275ee19e27fd9a93cde7d7

HTTPサーバをproxyにするには以下。

参考リンク


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP