はじめに
Dockerプラットフォームを使用してスムーズなCI/CD開発を保証したい場合は、プライベートDockerレジストリを設定することを検討してください。配信を高速化するだけでなく、リソースを分散し、コンテナ間でDockerイメージを共有する実用的な方法でもあります。
このチュートリアルでは、プライベートDockerレジストリを設定し、外部からアクセスできるように構成する方法を学びます。
前提条件
- sudoを使用したユーザーアカウントへのアクセス またはルート 特権
- クライアントサーバー
- プライベートDockerレジストリ用のサーバー
- ドッカー およびDocker–Compose 両方のサーバーで
- Nginx プライベートDockerレジストリサーバー上
プライベートDockerレジストリとは
Dockerレジストリ はサーバー側のアプリケーションであり、DockerのPlatform-as-a-Service製品の一部です。これにより、すべてのDockerイメージを1つの集中管理された場所にローカルに保存できます。
プライベートレジストリを設定するときは、インターネット経由でDockerHubと通信するサーバーを割り当てます。サーバーの役割は、イメージをプルおよびプッシュし、ローカルに保存して、他のDockerホスト間で共有することです。
外部からアクセス可能なレジストリを実行することにより、貴重なリソースを節約し、プロセスをスピードアップできます。このソフトウェアを使用すると、Docker Hubに接続しなくてもイメージをプルできるため、帯域幅を節約し、潜在的なオンラインの脅威からシステムを保護できます。
Dockerホストは、安全な接続を介してローカルリポジトリにアクセスし、ローカルレジストリからイメージをコピーして、独自のコンテナを構築できます。
始める前に
前提条件のセクションに記載されているように、このガイドでは、すべてのサーバーにDockerとDocker-Composeが既にインストールされていることを前提としています。
必要なソフトウェアがあることを確認するには、次のコマンドを使用してリリースバージョンを確認できます。
docker version
docker-compose version
確認したいもう1つのことは、Dockerサービスが開始され、起動時に有効になるように設定されていることです。
sudo systemctl start docker
sudo systemctl enable docker
プライベートDockerレジストリのインストールと構成
ステップ1:レジストリディレクトリを作成する
プライベートレジストリをホストするサーバーの構成を開始します。まず、必要なすべての構成ファイルを保存する新しいディレクトリを作成します。
1.次のコマンドは、registry
というラベルの付いた新しいプロジェクトディレクトリを作成します および2つのサブディレクトリ-nginx
およびauth
:
mkdir -p registry/{nginx, auth}
2.registry
に移動します nginx
内に2つの新しいディレクトリを作成します :
cd registry/
mkdir -p nginx/{conf.d/,ssl}
3.次のように入力して、新しく作成されたディレクトリの階層を確認します。
tree
ステップ2:Dockerを作成する-スクリプトを作成してサービスを定義する
次に、新しい docker-compose.yml
を作成して構成する必要があります 脚本。このスクリプトは、Docker-Composeのバージョンと、プライベートレジストリを設定するために必要なサービスを定義します。
1.registry
で新しいファイルを作成します ディレクトリ、お好みのテキストエディタ付き:
nano docker-compose.yml
2.この構成ファイルで定義する必要があることがいくつかあるので、注意深くフォローし、コンテンツの各セクションを注意深く追加してください。
version: '3'
services:
#Registry
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- registrydata:/data
- ./auth:/auth
networks:
- mynet
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
registrydata:
driver: local
3.ファイルを保存して閉じます。
構成の説明:
まず、使用するDocker-Composeのバージョンを定義します。この例では、 version: '3'
。次に、 #Registry
から始めて、Dockerレジストリのすべてのコンポーネントの定義に進みます。 サービス。
Docker Registryは、基本的にレジストリイメージを実行するコンテナであるため、イメージは registry:2
として定義されます。 。
restart: always
を追加する lineは、システムを起動するとすぐにDockerレジストリをサービスとして開始することを保証します。
ポートの決定5000:5000
ホストと実行中のコンテナーが定義されたポート番号を介して通信することをDockerに指示します。
このサービスは、Dockerボリュームの registrydata
をマウントします およびローカルディレクトリauth
、認証ファイル registry.passwd
。
次の要素は#Nginx Service
です 。構成の概要は、ポート 80:80
で実行されるサービスです。 (HTTPS)および 443:443
(HTTPS)。仮想構成用のローカルディレクトリをマウントします( conf.d
)およびSSL証明書( ssl
。
最後に、 mynet
を設定します ブリッジドライバーとregistrydata
カスタムネットワークのパラメータとしてローカルドライバを使用します。
ステップ3:Nginxポートフォワーディングを設定する
次のステップは、Nginx仮想ホストを構成し、Nginxサービス用に構成することです。
1. nginx/conf.d/
に移動します 前の手順で作成したディレクトリ:
cd nginx/conf.d/
2. registry.conf
という名前の新しい仮想ホストファイルを作成します :
nano registry.conf
3.次のコンテンツを追加します:
upstream docker-registry {
server registry:5000;
}
server {
listen 80;
server_name registry.example-server.com;
return 301 https://registry.example-server.com$request_uri;
}
server {
listen 443 ssl http2;
server_name registry.example-server.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# Log files for Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
# 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;
}
proxy_pass http://docker-registry;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
4.ファイルを保存して、ターミナルシェルに戻ります。
ステップ4:Nginxファイルのアップロードサイズを増やす
デフォルトでは、Nginxはファイルのアップロードサイズを 1MBに制限しています 。多くのDockerイメージがこの数を超えるため、ベストプラクティスはNginxの最大ファイルサイズを増やすことです。 max_body_size
を設定して、ファイルサイズが大きい画像をアップロードできることを確認してください 2GB 。
1.次のコマンドを使用して追加の構成ファイルを作成します:
nano additional.conf
2.ファイルに次の行を追加します。
client_max_body_size 2G;
3.ファイルを保存して閉じます。
ステップ5:SSL証明書と基本認証を構成する
1.ドメインのSSL証明書ファイルをssl
にコピーする必要があります ディレクトリ。これを行うには、次のコマンドを実行します。
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
2.次に、 auth
に移動します ディレクトリ:
cd auth
3.そして、 registry.passwd
という名前の新しいパスワードファイルをリクエストします ユーザー向け:
htpasswd -Bc registry.passwd example
4.強力なパスワードを入力し、再入力して確認します。これで、ユーザーのパスワードが追加されました。
ステップ6:ルートCA証明書を追加する
次に、ルートCA証明書をDockerと作業中のシステムに追加する必要があります。
1. .crt
をエクスポートします 次のように入力して、OpenSSLでファイルを作成します:
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
2.ルート証明書をDocker証明書用の新しいディレクトリにコピーします。
mkdir -p /etc/docker/certs.d/registry.example-server.com/
cp rootCA.crt /etc/docker/certs.d/example-server.com/
3.次に、同じ証明書を /usr/share/ca-certificate/extra
という名前で別の新しいディレクトリにコピーします。 :
mkdir -p .usr.share.ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
4.新しく作成されたca-certificate
を再構成します 次のように入力してパッケージ化します:
dpkg-reconfigure ca-certificates
5.最後に、Dockerサービスを再起動します。
systemctl restart docker
ステップ7:Dockerレジストリを実行する
すべての設定と準備が整ったら、Docker-Composeを使用してDockerレジストリコンテナを構築できます:
docker-compose up -d
レジストリとNginxサービスが実行されているかどうかを確認します:
docker-compose ps
netstat -plntu
出力には、サービスとそれに割り当てられたポートが表示されます。
DockerHubからプライベートレジストリにイメージをプルする
1. Docker Hubからプライベートレジストリにイメージをローカルに保存するには、 docker pull
を使用します コマンド:
docker pull [docker_image]
2.画像にタグを追加して、プライベートレジストリ用にラベルを付けます。
docker image tag [docker_image] registry.example-server.com/[new_image_name]
3.ローカルに保存されているすべてのイメージを一覧表示するようにシステムに指示することで、Dockerイメージがローカルで利用可能かどうかを確認できます。
docker images
Dockerイメージをプライベートレジストリにプッシュする方法
1. DockerホストからプライベートDockerレジストリサーバーにイメージをプッシュするには、最初に次のコマンドを使用してレジストリにログインする必要があります。
docker login https://registry.example-server.com/v2/
2.ユーザー名を入力します およびパスワード 仮想ホスト用に定義しました。
3.これで、次のコマンドを使用してイメージをプライベートレジストリにプッシュできます:
docker push registry.example-server.com/[new_image_name]
4.プライベートDockerレジストリに保存されているイメージのリストを参照してください:
http -a example https://registry.example-server.com/v2/_catalog