- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Docker/プライベートレジストリの構築 へ行く。
- 1 (2020-03-14 (土) 21:18:03)
- 2 (2020-03-15 (日) 00:00:09)
- 3 (2020-03-15 (日) 12:26:50)
- 4 (2020-03-15 (日) 15:12:38)
- 5 (2020-03-17 (火) 01:22:16)
コンテナのプライベートリポジトリを作る。
$
は一般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
参考
- http://docs.docker.jp/engine/security/certificates.html
- https://docs.docker.com/engine/security/certificates/
クライアント側では、インセキュアなレジストリとして登録する。
# /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にするには以下。
- https://docs.docker.com/registry/recipes/nginx/
- https://www.codeflow.site/ja/article/how-to-set-up-a-private-docker-registry-on-ubuntu-18-04
参考リンク †
- Docker Registry - on https://docs.docker.com/registry/
- Deploy a registry server - on https://docs.docker.com/registry/deploying/
- HTTP API V2 - on https://docs.docker.com/registry/spec/api/
- https://github.com/docker-library/docs/tree/master/registry
- https://qiita.com/zknzfz/items/13d5d07ab5bb0feb1fd1
- http://docs.docker.jp/v1.9/index.html
- Configuring a registry - on https://docs.docker.com/registry/configuration/
- OpenSSL
- Oracle® Linux セキュリティ・ガイド リリース63.3.1 opensslコマンドについて - on https://docs.oracle.com/cd/E39368_01/E36387/html/ol_openssl_sec.html
- UNIX/Linuxの部屋 opensslコマンドの使い方 - on http://x68000.q-e-d.net/~68user/unix/pickup?openssl
- いますぐ実践! Linux システム管理 / Vol.252 - on http://www.usupi.org/sysad/252.html
- https://qiita.com/kunichiko/items/12cbccaadcbf41c72735
- https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/
- https://qiita.com/takech9203/items/5206f8e2572e95209bbc
- Ansible Crypto modules- on https://docs.ansible.com/ansible/latest/modules/list_of_crypto_modules.html