Docker Registryまたは「Registry」は、Dockerイメージの保存と配布に使用できる、オープンソースで拡張性の高いサーバー側アプリケーションです。これは、DockerHubの背後にあるサーバー側のアプリケーションでした。ほとんどのユースケースでは、アプリケーション開発にCI / CDシステムを実装する場合、Dockerレジストリは優れたソリューションです。プライベートDockerレジストリは、アプリケーションのすべてのカスタムDockerイメージを一元化することで、開発および本番サイクルのパフォーマンスを向上させます。
このチュートリアルでは、Ubuntu18.04サーバーにプライベートDockerレジストリをインストールして構成する方法を説明します。 Nginxウェブサーバーを使用し、ユーザー名とパスワードでレジストリを保護します(基本認証)。
前提条件
- Ubuntu18.04サーバー
- root権限
何をしますか?
- 依存関係のインストール
- DockerとDocker-composeをインストールします
- プライベートDockerレジストリを設定する
- テスト
まず、プライベートDockerレジストリをデプロイするためのパッケージの依存関係をいくつかインストールします。
次のコマンドを使用して、パッケージの依存関係をインストールします。
sudo apt install -y gnupg2 pass apache2-utils httpie
gnupg2およびpassパッケージは、パスワード認証をDockerレジストリに保存するために使用されます。また、apache2-utilsは基本認証の生成に使用され、httpieはテストに使用されます。
次に、公式のUbuntuリポジトリからdockerとdocker-composeをインストールします。
次のコマンドを実行して、DockerとDocker-composeをインストールします。
sudo apt install -y docker.io docker-compose -y
インストールが完了したら、Dockerサービスを開始し、起動時間に追加します。
sudo systemctl start docker
sudo systemctl enable docker
Dockerが稼働しており、Docker-composeがインストールされています。以下のコマンドを使用して確認してください。
docker version
docker-compose version
また、システムにインストールされているDockerとDocker-composeのバージョンが表示されます。
このステップでは、いくつかのディレクトリ環境を作成してDockerレジストリ環境を構成し、docker-compose.yml、nginx仮想ホスト、追加の構成などを含むいくつかの構成を作成します。
-プロジェクトディレクトリを作成する
「registry」というプロジェクトの新しいディレクトリを作成し、その中に「nginx」および「auth」ディレクトリを作成します。
mkdir -p registry/{nginx,auth}
その後、ディレクトリ「registry」に移動し、「nginx」内に新しいディレクトリを再度作成します。
cd registry/
mkdir -p nginx/{conf.d/,ssl}
その結果、プロジェクトディレクトリは次のようになります。
tree
-Dockerの作成-スクリプトの作成
次に、Dockerレジストリをデプロイするための新しいdocker-compose.ymlスクリプトを作成します。
'registry'ディレクトリに移動し、新しい構成ファイル'docker-compose.yml'を作成します。
cd registry/
vim docker-compose.yml
まず、使用する作成バージョンとサービスを定義します。
version: '3'
services:
その後、「レジストリ」という名前の最初のサービスを追加します。 Docker Registryサービスは、docker team'registry:2によって提供されるdockerイメージを使用します。 Dockerボリューム「registrydata」と基本認証ファイル「registry.passwd」を含む「auth」という名前のローカルディレクトリをマウントします。そして最後に、「mynet」という名前のカスタムDockerイメージで実行され、コンテナとホストの両方でポート5000を公開します。
#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
次に、HTTPおよびHTTPSポートを実行し、仮想ホスト構成用にローカルディレクトリ「conf.d」をマウントし、ssl証明書用に「ssl」をマウントする「nginx」サービスの構成。
#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
最後に、カスタムネットワーク「mynet」をブリッジドライバーで定義し、「registrydata」をローカルドライバーで定義します。
#Docker Networks networks: mynet: driver: bridge #Volumes volumes: registrydata: driver: local
構成を保存して閉じます。
完全な構成は次のとおりです。
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
-Nginx仮想ホストを構成する
docker-composeスクリプトを作成した後、nginxサービスの仮想ホストと追加の構成を作成します。
'nginx / conf.d /'ディレクトリに移動し、'registry.conf'という名前の新しい仮想ホストファイルを作成します。
cd nginx/conf.d/
vim registry.conf
次の構成を貼り付けます。
upstream docker-registry { server registry:5000; } server { listen 80; server_name registry.hakase-labs.io; return 301 https://registry.hakase-labs.io$request_uri; } server { listen 443 ssl http2; server_name registry.hakase-labs.io; 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; } }
保存して閉じます。
次に、nginxのmax_body_sizeを増やすための追加の構成を作成します。これにより、最大サイズ2GBのDockerイメージをアップロードできるようになります。
vim additional.conf
以下に構成を貼り付けます。
client_max_body_size 2G;
保存して閉じます。
-SSL証明書と基本認証を構成する
ドメインのSSL証明書ファイルを「ssl」ディレクトリにコピーします。
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
次に、「auth」ディレクトリに移動して、新しいパスワードファイル「registry.passwd」を生成します。
cd auth/
ユーザーhakaseの新しいパスワードを生成します。
htpasswd -Bc registry.passwd hakase
TYPE THE STRONG PASSWORD
そして、プライベートDockerレジストリをデプロイするための環境設定が完了しました。
以下は、環境ファイルとディレクトリのスクリーンショットです。
tree
-Dockerレジストリを実行します
以下のdocker-composeコマンドを使用してDockerレジストリを実行します。
docker-compose up -d
そして、以下のような結果が得られます。
その後、レジストリとnginxサービスが稼働していることを確認します。次のコマンドを使用して確認してください。
docker-compose ps
netstat -plntu
また、「レジストリ」サービスがポート「5000」で実行されていることが示され、「nginx」サービスは以下のようにHTTPポートとHTTPSポートを公開します。
プライベートDockerレジストリをテストする前に、ルートCA証明書をDocker自体とシステムに追加する必要があります。
pemファイル証明書を使用している場合は、OpenSSLコマンドを使用して.crtファイルにエクスポートします。
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
次に、Docker証明書用の新しいディレクトリを作成し、ルートCA証明書をそのディレクトリにコピーします。
mkdir -p /etc/docker/certs.d/registry.hakase-labs.io/
cp rootCA.crt /etc/docker/certs.d/registry.hakase-labs.io/
次に、新しいディレクトリ'/ usr / share / ca-certificate / extra'を作成し、ルートCA証明書をそのディレクトリにコピーします。
mkdir -p /usr/share/ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
その後、「ca-certificate」パッケージを再構成し、Dockerサービスを再起動します。
dpkg-reconfigure ca-certificates
systemctl restart docker
-Dockerイメージをダウンロード
次のコマンドを使用して、新しいDockerイメージをダウンロードします。
docker pull ubuntu:16.04
完了したら、以下のコマンドを使用してプライベートレジストリのイメージにタグを付けます。
docker image tag ubuntu:16.04 registry.hakase-labs.io/ubuntu16
システム上のDockerイメージのリストをもう一度確認すると、次のように新しいイメージが取得されます。
docker images
-画像をプライベートローカルレジストリにプッシュ
次のコマンドを使用して、プライベートDockerレジストリにログインします。
docker login https://registry.hakase-labs.io/v2/
'registry.htpasswd'ファイルに基づいてユーザー名とパスワードを入力します。
次に、レジストリで利用可能なDockerイメージを確認します。
http -a hakase https://registry.hakase-labs.io/v2/_catalog
また、レジストリにDockerイメージはありません。
次に、カスタムイメージをプライベートDockerレジストリにプッシュします。
docker push registry.hakase-labs.io/ubuntu16
もう一度確認して、プライベートリポジトリに「ubuntu16」Dockerイメージが含まれていることを確認してください。
http -a hakase https://registry.hakase-labs.io/v2/_catalog
そして最後に、Nginxと基本認証を使用したプライベートDockerレジストリのインストールと構成が正常に完了しました。