組織で働いていて、Dockerイメージを社内に保持して迅速にデプロイしたい場合は、プライベートDockerリポジトリをホストするのが最適です。プライベートDockerレジストリを使用すると、イメージ配布パイプラインを所有し、イメージの保存と配布をより厳密に制御できます。レジストリをCI/CDシステムと統合して、ワークフローを改善できます。
このチュートリアルでは、Amazon S3をストレージの場所として使用して、RockyLinux8ベースのサーバーでプライベートDockerレジストリを設定して使用する方法を説明します。
- Rocky Linux 8を搭載した2台のLinuxサーバー。1台のサーバーはレジストリホストとして機能し、もう1台はクライアントとして使用されてリクエストを送信したりホストから画像を受信したりします。
- ホストサーバーを指す登録済みドメイン名。
registry.example.com
を使用します チュートリアル用です。 - 両方のマシンでsudo権限を持つroot以外のユーザー。
最初のステップは、ファイアウォールを構成することです。 RockyLinuxはFirewalledFirewallを使用しています。ファイアウォールのステータスを確認してください。
$ sudo firewall-cmd --state running
ファイアウォールはさまざまなゾーンで機能し、パブリックゾーンがデフォルトで使用されます。ファイアウォールでアクティブなすべてのサービスとポートを一覧表示します。
$ sudo firewall-cmd --permanent --list-services
次の出力が表示されます。
cockpit dhcpv6-client ssh
HTTPおよびHTTPSポートを許可します。
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https
ファイアウォールのステータスを再確認してください。
$ sudo firewall-cmd --permanent --list-services
同様の出力が表示されるはずです。
cockpit dhcpv6-client http https ssh
ファイアウォールをリロードして変更を有効にします。
$ sudo firewall-cmd --reload
ステップ2-DockerとDockerComposeをインストールします
この手順は、サーバーとクライアントマシンの両方で必要です。
公式のDockerリポジトリをインストールします。
$ sudo dnf install yum-utils $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Dockerをインストールします。
$ sudo dnf install docker-ce docker-ce-cli containerd.io
Dockerデーモンを有効にして実行します。
$ sudo systemctl enable docker --now
sudo
の使用を避けるために、システムユーザーをDockerグループに追加します Dockerコマンドを実行します。
$ sudo usermod -aG docker $(whoami)
ログアウトしてからサーバーに再度ログインして、変更を有効にします。
DockerComposeの最新の安定したリリースをダウンロードしてインストールします。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
ダウンロードしたバイナリファイルに実行可能権限を適用します。
$ sudo chmod +x /usr/local/bin/docker-compose
Docker-composeBashCompletionスクリプトをインストールします。
$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-compose
プロファイル設定をリロードして、bash-completionを機能させます。
$ source ~/.bashrc
レジストリ構成用のディレクトリを作成します。
$ mkdir ~/docker-registry
docker-registry
に切り替えます ディレクトリ。
$ cd ~/docker-registry
HTTP認証パスワード、Nginx構成ファイル、およびSSL証明書を格納するディレクトリを作成します。
$ mkdir auth
Nginxログを保存する別のディレクトリを作成します。
$ mkdir logs
AmazonS3バケットを作成
レジストリデータとイメージをサーバーに保存するか、クラウドホスティングサービスを使用できます。チュートリアルでは、AmazonS3クラウドサービスを使用します。
次のステップは、いくつかの重要な設定を使用して構成ファイルをセットアップすることです。これらの設定は、docker-compose.yml
でも定義できます。 ファイルですが、別のファイルを使用する方がはるかに優れています。
次の設定でバケットを作成します。
- ACLを無効にする必要があります。
- バケットへのパブリックアクセスを無効にする必要があります。
- バケットのバージョン管理を無効にする必要があります。
- AmazonS3管理対象キーを使用してバケット暗号化を有効にします。 (SSE-S3)
- オブジェクトロックを無効にする必要があります。
次のポリシーを使用してIAMユーザーを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws:s3:::S3_BUCKET_NAME" }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::S3_BUCKET_NAME/*" } ] }
S3_BUCKET_NAME
を置き換えます S3バケットの名前を使用します。
後で使用するバケットの秘密鍵、秘密値、およびバケット領域を書き留めます。
Docker作成ファイルを作成
docker-compose.yml
を作成します ファイルを開いて編集します。
$ nano docker-compose.yml
次のコードを貼り付けます。
version: '3.3' services: registry: image: registry:2 restart: always environment: - REGISTRY_STORAGE=s3 - REGISTRY_STORAGE_S3_REGION=us-west-2 - REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry - REGISTRY_STORAGE_S3_ENCRYPT=true - REGISTRY_STORAGE_S3_CHUNKSIZE=5242880 - REGISTRY_STORAGE_S3_SECURE=true - REGISTRY_STORAGE_S3_ACCESSKEY=AKIA3FIG4NVFCJ6STMUA - REGISTRY_STORAGE_S3_SECRETKEY=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 - REGISTRY_STORAGE_S3_V4AUTH=true - REGISTRY_STORAGE_S3_ROOTDIRECTORY=/image-registry - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=inmemory - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED=false nginx: image: "nginx:alpine" ports: - 443:443 links: - registry:registry volumes: - ./auth:/etc/nginx/conf.d - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro - ./logs:/var/log/nginx - /etc/letsencrypt:/etc/letsencrypt
Ctrl + Xを押してファイルを保存します Yと入力します プロンプトが表示されたら。
作成ファイルに設定した内容を見ていきましょう。
-
最初のステップは、ハブからDockerレジストリのバージョン2の最新イメージを取得することです。最新のタグは、メジャーバージョンのアップグレード時に問題が発生する可能性があるため、使用していません。 2に設定すると、次のメジャーバージョンへの自動アップグレードを防ぎながら、すべての2.xアップデートを取得できます。これにより、重大な変更が発生する可能性があります。
-
レジストリコンテナは、障害や予期しないシャットダウンが発生した場合に常に再起動するように設定されています。
-
AmazonS3ストレージにさまざまな環境変数を設定しました。それらをすばやく確認しましょう。
- REGISTRY_STORAGE ストレージのタイプを設定します。 s3を選択しました AmazonS3を使用しているため。
- REGISTRY_STORAGE_S3_REGION S3バケットのリージョンを設定します。
- REGISTRY_STORAGE_S3_BUCKET S3バケットの名前を設定します。
- REGISTRY_STORAGE_S3_ENCRYPT -バケット暗号化を有効にしている場合は、trueに設定します。
- REGISTRY_STORAGE_S3_CHUNKSIZE アップロードチャンクのサイズを設定します。 5MB(5 * 1024 * 1024)より大きくする必要があります。
- REGISTRY_STORAGE_S3_SECURE -HTTPSを使用する場合は、trueに設定します。
- REGISTRY_STORAGE_S3_ACCESSKEY およびREGISTRY_STORAGE_S3_SECRETKEY -IAMユーザーの作成後に取得したユーザー資格情報。
- REGISTRY_STORAGE_S3_V4AUTH -AWS認証のv4を使用する場合は、trueに設定します。 S3ログインに関連するエラーが発生した場合は、falseに設定してください。
- REGISTRY_STORAGE_S3_ROOTDIRECTORY -レジストリデータが保存されるバケットにルートディレクトリを設定します。
- REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR -キャッシュの場所を設定します。私たちの場合、それをメモリに保存しています。 Redisを使用するように設定することもできます。
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED -レジストリのストレージヘルスチェックサービスを無効にするには、falseに設定します。レジストリにバグがあり、falseに設定しないと問題が発生する可能性があります。
-
Dockerレジストリはポート5000を介して通信します。これは、サーバーでDockerに公開されているものです。
-
./auth:/etc/nginx/conf.d
マッピングにより、Nginxのすべての設定がコンテナで利用可能になります。 -
./auth/nginx.conf:/etc/nginx/nginx.conf:ro
Nginx設定ファイルをシステムから読み取り専用モードのコンテナー内のファイルにマップします。 -
./logs:/var/log/nginx
コンテナ内のNginxログディレクトリにマッピングすることで、システム上のNginxのログにアクセスできるようにします。 -
Dockerレジストリの設定は、
/etc/docker/registry/config.yml
に保存されます コンテナ内のファイルをconfig.yml
にマッピングしました 次のステップで作成する現在のディレクトリのファイル。
HTTP認証を設定するには、httpd-tools
をインストールする必要があります パッケージ。
$ sudo dnf install httpd-tools
~/docker-registry/auth
にパスワードファイルを作成します ディレクトリ。
$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1 New password: Re-type new password: Adding password for user user1
-c
flagは、コマンドに新しいファイルを作成するように指示し、-B
フラグは、Dockerでサポートされているbcryptアルゴリズムを使用することです。 user1
を置き換えます 選択したユーザー名で。
さらにユーザーを追加する場合は、-c
を使用せずに、コマンドを再実行します。 フラグ。
$ htpasswd -B ~/docker-registry/auth/registry.password user2
これで、ファイルは認証のためにレジストリコンテナにマップされます。
Let's Encryptを使用してSSL証明書をインストールするには、Epelリポジトリから入手できるCertbotツールをダウンロードする必要があります。
EPELリポジトリとCertbotをインストールします。
$ sudo dnf install epel-release $ sudo dnf install certbot
SSL証明書を生成します。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d registry.example.com
上記のコマンドは、証明書を/etc/letsencrypt/live/registry.example.com
にダウンロードします。 サーバー上のディレクトリ。
Diffie-Hellmanグループを生成します 証明書。
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
証明書の更新をテストします。
$ sudo certbot renew --dry-run
ドライランが成功すると、証明書が自動的に更新されます。
Dhparamファイルをコンテナにコピーします
Diffie-Hellmanグループをコピーします ~/docker-registry/auth
への証明書 コンテナにマップされるディレクトリ。
$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth
次のステップでは、NginxサーバーをDockerレジストリサーバーのフロントエンドプロキシとして構成します。 Dockerレジストリには、ポート5000で動作する組み込みサーバーが付属しています。Nginxの背後に配置します。
ファイル~/docker-registry/auth/nginx.conf
を作成して開きます 編集用。
$ sudo nano ~/docker-registry/auth/nginx.conf
次のコードを貼り付けます。
events { worker_connections 1024; } http { upstream docker-registry { server registry:5000; } ## Set a variable to help us decide if we need to add the ## 'Docker-Distribution-Api-Version' header. ## The registry always sets this header. ## In the case of nginx performing auth, the header is unset ## since nginx is auth-ing before proxying. map $upstream_http_docker_distribution_api_version $docker_distribution_api_version { '' 'registry/2.0'; } server { listen 443 ssl http2; server_name registry.example.com; # SSL ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/registry.example.com/chain.pem; access_log /var/log/nginx/registry.access.log; error_log /var/log/nginx/registry.error.log; # Recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; ssl_session_cache shared:SSL:10m; ssl_dhparam /etc/nginx.d/conf.d/dhparam.pem; resolver 8.8.8.8; # disable any limits to avoid HTTP 413 for large image uploads client_max_body_size 0; # required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486) chunked_transfer_encoding on; location /v2/ { # Do not allow connections from docker 1.5 and earlier # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) { return 404; } # To add basic authentication to v2 use auth_basic setting. auth_basic "Registry realm"; auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd; ## If $docker_distribution_api_version is empty, the header is not added. ## See the map directive above where this variable is defined. add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always; proxy_pass http://docker-registry; proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } } }
Ctrl + Xを押してファイルを保存します Yと入力します 終了したらプロンプトが表示されたら。
プライベートDockerレジストリのネットワーク接続を許可するようにSELinuxを設定します。
$ sudo setsebool -P httpd_can_network_connect on
Dockerレジストリのディレクトリに切り替えます。
$ cd ~/docker-registry
Dockerコンテナを起動します。
$ docker-compose up -d
コンテナのステータスを確認してください。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88d6addc1687 nginx:alpine "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp docker-registry_nginx_1 2b112edc1c72 registry:2 "/entrypoint.sh /etc…" 5 minutes ago Up 5 minutes 5000/tcp docker-registry_registry_1
Dockerレジストリにログインします。
$ docker login -u=testuser -p=testpassword https://registry.example.com
URL https://registry.example.com/v2/
を開くこともできます ブラウザで、ユーザー名とパスワードを要求されます。 {}の空のページが表示されます その上で。
curl
を使用して端末のURLを確認できます 。
$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/ Enter host password for user 'testuser': {}
最新のUbuntuDockerイメージをダウンロードします。
$ docker pull ubuntu:latest
この画像にプライベートレジストリのタグを付けます。
$ docker tag ubuntu:latest registry.example.com/ubuntu2004
イメージをレジストリにプッシュします。
$ docker push registry.example.com/ubuntu2004
プッシュが成功したかどうかをテストします。
$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/_catalog Enter host password for user 'testuser': {"repositories":["ubuntu2004"]}
プロンプトが表示されたらNginx認証パスワードを入力すると、レジストリから利用できるリポジトリのリストが表示されます。
現在使用可能なDockerイメージのリストを確認してください。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry 2 d3241e050fc9 5 days ago 24.2MB nginx alpine 53722defe627 5 days ago 23.4MB httpd 2 118b6abfbf55 5 days ago 144MB ubuntu latest ff0fea8310f3 2 weeks ago 72.8MB registry.nspeaks.xyz/ubuntu2004 latest ff0fea8310f3 2 weeks ago 72.8MB
ステップ7-クライアントマシンからDockerレジストリにアクセスして使用する
クライアントサーバーにログインします。手順1では、クライアントマシンにDockerをインストールしました。
クライアントマシンからプライベートDockerレジストリにログインします。
$ docker login -u=testuser -p=testpassword https://registry.example.com
レジストリからUbuntuイメージをプルします。
$ docker pull registry.example.com/ubuntu2004
クライアントマシン上のすべてのイメージを一覧表示します。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.nspeaks.xyz/ubuntu2004 latest ff0fea8310f3 2 weeks ago 72.8MB
ダウンロードしたイメージを使用してコンテナを作成して起動します。
$ docker run -it registry.example.com/ubuntu2004 /bin/bash
Ubuntuコンテナ内のシェルにログインします。
[email protected]:
次のコマンドを実行して、Linuxのバージョンを確認します。
[email protected]$ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.4 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.4 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal
これで、クライアントマシンからDockerレジストリの使用を開始できます。
これで、AmazonS3をストレージとして使用するRockyLinux8ベースのサーバーでプライベートDockerレジストリを設定するためのチュートリアルは終了です。ご不明な点がございましたら、下のコメント欄に投稿してください。