個人的なプロジェクト用にカスタムビルドされたDockerイメージを安全に保存する場所、または組織内でそれらを使用する場所を探していますか?それとも、継続的インテグレーションとデプロイメントのプロセスを管理するための集中型システムですか?アプリケーション用にカスタムビルドされたイメージを自由にプルしてアップロードし、展開率を向上させることができる場所ですか?
これ以上探さない!プライベートDockerレジストリは、そのすべてを可能にします!このステップバイステップのチュートリアルでは、独自のプライベートDockerレジストリを構築する方法について説明します。始めましょう!
前提条件
このチュートリアルを続けるには、必ず次のものを用意してください。
- 2つのUbuntu20.04 LTS デバイス。 1つはDockerレジストリをホストし、もう1つはクライアントマシンとして機能してDockerレジストリにリクエストを送信します。
- NGINX SSL暗号化とHTTP認証を設定するためにホストマシンでのみ必要です。
- 登録済みのドメイン名。 NGINXは、登録されたドメイン名へのトラフィックを、コンテナーで実行されているDockerレジストリにルーティングします。
- このチュートリアルでは、ホストマシンとクライアントマシンの両方にDockerが必要です。デフォルトのインストールで十分です。
- ドッカー作成 Dockerレジストリホストマシンで、Dockerレジストリのコンポーネントをセットアップして起動します。 関連:DockerComposeの使用について知っておくべきことすべて
Dockerレジストリの設定
実行する必要のある最初のステップは、DockerHubに無料のイメージとして提供されているホストデバイスにDockerレジストリを設定することです。
このタスクを実行するためにDockerコマンドの発行に制限される代わりに、docker-compose.yml
を作成します ファイル。このファイルはdocker-composeファイル形式を使用しており、Dockerレジストリに必要なコンポーネントを比較的簡単にセットアップできます。
フォローするには、お気に入りのSSHクライアントを開き、レジストリサーバーとなるデバイスに接続します。
1. / home ディレクトリ、 docker-registryというディレクトリを作成します mkdir
を使用 コマンド:
# Creating working directory
mkdir docker-registry
2. docker-registryに移動します ディレクトリ:
# Navigate to the working directory
cd ~/docker-registry
3. docker-registryの内部 ディレクトリ、 dataというサブディレクトリを作成します 。 データの内部 ディレクトリは、DockerレジストリがDockerイメージを保存する場所です。 データ ディレクトリは、Dockerイメージを保持するためのDockerレジストリのファイルシステムとして機能します。
# Create filesystem to persist data
mkdir data
4. docker-registryの内部 ディレクトリに、 docker-compose.ymlを作成します ファイル:
# Create the docker-compose file
nano docker-compose.yml
レジストリを設定するための構成は、新しく作成されたファイルにあります。設定の中で、次のことに気付くでしょう:
registry
を設定しますregistry:latest
を使用したサービスlatest
の画像 タグ。registry
の再起動ポリシーを設定しますalways
へのサービス 。 Dockerエンジンが実行されている場合、registry
サービスは停止すると常に再起動します。ports
セクションはポートをマップします5000
レジストリコンテナ内のポート5000
ホストマシン上。registry
environment
でのサービス セクションは、環境変数REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
を設定します データへ 以前に作成されたディレクトリ。- Dockerには、Dockerイメージを
registry
に永続化するためのボリュームが必要です。 容器。volumes
を追加します /データをマッピングするオブジェクト ホストマシンのディレクトリから/data
コンテナ内のディレクトリ。
マッピングは、コンテナ内ではなく、ホストマシンのファイルシステムにデータを保存します。 Dockerはデータをホストマシンに保存するようになったため、データのバックアップ、移行、暗号化、または置換を行うことができます。
以下に、Dockerレジストリを起動して実行するために必要なコンポーネントの完全なYAML構成を示します。以下のYAMLコードをコピーして、 docker-compose.ymlに貼り付けます。 作成したファイルをCTRL + S
で保存します CTRL + X
を押します 終了するには:
version: '3.3'
services:
registry:
image: registry:latest
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- ./data:/data
Docker-composeは、複数のコンテナーを単一のアプリケーションとして実行します。
docker-compose.yml
ファイルは、これらの複数のコンテナをサービスの一部として構成します。
5.ここで、docker-composeファイルを実行し、Dockerレジストリを作成して開始します。
# Start docker registry application
sudo docker-compose up
以下のコマンド出力では、Dockerレジストリが実行されていることがわかります。アプリケーションを閉じるには、CTRL + C
を押します。 。
NGINXの設定
Dockerレジストリーをセットアップしたので、ホストマシンでNGINXをセットアップします。 NGINXは、クライアントデバイスからDockerレジストリにトラフィックを転送します。このチュートリアルでは、ドメイン名を介してトラフィックを転送します。このステップに取り組むために読んでください。
最初に、 / etc / nginx / sites-available / your_domain_nameを介してドメインのNGINXポート転送を設定する必要があります ファイル。
1.次のコマンドを使用してファイルを作成します。
# Creating configuration for your domain
sudo nano /etc/nginx/sites-available/your_domain_name
多くの参照があります your_domain_name次のセクション 。 この文字列はプレースホルダーです。コマンドを自分で試すときは、自分が所有するドメイン名に置き換えることを忘れないでください。例では Registry.joeshiett.xyzは選択されたドメイン名です。
2.次のNGINX構成をコピーして、 your_domain_nameに追加します 作成したファイル:
server {
listen 80;
# Replace your_domain_name with your domain name
server_name your_domain_name;
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://localhost:5000;
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;
}
}
3.ポートフォワーディングはまだ完了していません。最初にシンボリックリンクを添付する必要があります。 / etc / nginx / sites-available / your_domain_nameにリンクします / etc / nginx /sites-enabled/への構成ファイル。 完全なコマンドは次のとおりです。
cd /etc/nginx/sites-enabled/ && sudo ln -s /etc/nginx/sites-available/your_domain_name .
4.シンボリックリンクを作成した後、NGINXサービスを再起動します。
# Restarting Nginx service
sudo systemctl restart nginx
クライアントデバイスでブラウザを開き、https://your_domain_name/v2/
に移動します v2
にアクセスするには エンドポイント、DockerHTTPAPI。
次の画像は、リンクに移動した後のホスト端末からの期待される出力を示しています。この画像は、ブラウザがGET
を送信したことも示しています v2
を介したDockerHTTPAPIへのリクエスト 終点。
v2
に移動した後 リンクを介したエンドポイント、空のJSONオブジェクト– {}
–ブラウザのウィンドウに表示されます。
NGINXファイルのアップロードサイズの構成
NGINXのデフォルトのアップロードサイズ制限は1m
、ここでm
メガバイトを表します。 Dockerイメージをレジストリにアップロードするには、デフォルトの制限では十分ではありません。この値を変更するには、 nginx.confを編集します そのため、NGINXは大きなファイルのアップロードを受け入れます。
1.もう一度、ホストマシンにログインします。
2. /etc/nginx/nginx.confを編集します ファイル:
3. http
の下 nginx.conf
のセクション ファイルに次の行を追加して、8,192メガバイトに対応するようにアップロードサイズを増やし、ファイルを保存します。
client_max_body_size 8192m;
構成は次のようになります。
Dockerレジストリへの接続を保護するには、SSL証明書が必要です。 SSL証明書を追加するには、レジストリホストにCertbotをインストールする必要があります。
スナップパッケージマネージャーを使用してCertbotをインストールできます。 SnapパッケージマネージャーはすでにUbuntu20.04にプリインストールされています。
1. Certbotをインストールするには、ホストマシンで次のコマンドを実行します。
# Install certbot using the snap package manager
sudo snap install --classic certbot
2. CertbotをPATHに追加して、シンボリックリンクを作成することでCertbotコマンドが機能できるようにします。
# Attaching certbot to PATH
sudo ln -s /snap/bin/certbot /usr/bin/certbot
3.このコマンドを実行して証明書を取得し、CertbotにNGINX構成を自動的に編集させ、ドメインのHTTPSアクセスを有効にします。
# Creating a certificate and enabling HTTPS access
sudo certbot --nginx
Certbotはyour_domain_nameを変更します / etc / nginx / sites-enabled /にある構成ファイル ディレクトリを作成し、SSL証明書をドメイン名に適用します。
次の画像は、 / etc / nginx / sites-enabled / your_domain_nameの最終的な構成を示しています。 Certbotが証明書を適用した後のファイルは次のようになります。
https://your_domain_name/
にアクセスした場合 、Certbotからの証明書で安全であることがわかります。
DockerレジストリのHTTP認証の設定
優れたセキュリティ対策を講じることは常に良い考えです。そのため、Dockerレジストリを保護し、アクセスを自分と追加したい他のユーザーのみに制限します。 HTTP Basic Authによって提供されるHTTP認証を使用します 。
1.HTTP認証にはhtpasswdが必要です ユーザー名とパスワードを使用してファイルします。 htpasswdを作成するには 認証には、apache2-utils
をインストールする必要があります パッケージ:
# Installing apache2-utils package
sudo apt-get install apache2-utils
2. apache2-utils
をインストールした後 registerry.credentialsを作成します / etc / nginx内のファイル httpasswd
のあるディレクトリ 指図。 your_username
を置き換えて、優先ユーザー名を追加します 以下のコマンドで。次に、プロンプトが表示されたら、好みのパスワードを追加します。完全なコマンドとその出力は以下のとおりです。
# Creating to creating auth credentials
sudo htpasswd -c /etc/nginx/registry.credentials your_username
3. registerry.credentialsを作成した後 ファイルの場合は、DockerレジストリのNGINX構成ファイル( / etc / nginx / sites-available / your_domain_name )に移動します。 。 server
のNGINX構成ファイルに次のテキストを追加します セクション:
server {
...
...
location / {
...
auth_basic "Basic Auth";
auth_basic_user_file "/etc/nginx/registry.credentials";
...
}
}
4. NGINXをもう一度再起動し、次のコマンドを使用して構成を再適用します。
# Restarting nginx
sudo systemctl restart nginx
下の画像は、 https:// your_domain_name /にアクセスしようとしたときに表示されます ブラウザで、ユーザー名とパスワードの入力を求められます。このチュートリアルでは、Dockerレジストリはサブドメイン registerry.joeshiett.xyzで実行されます 、SSLが有効になっています。
画像をプライベートDockerリポジトリにプッシュする
Dockerレジストリが実行され、より大きなファイルのアップロードを受け入れることができるようになったので、それにイメージをプッシュします。イメージをDockerレジストリにプッシュするには、クライアントマシンにアクセスする必要があります。
クライアントマシンにローカルに保存されているDockerイメージがない場合は、DockerHubから無料のイメージをプルできます。
1.次のコマンドを実行して、DockerハブからAlpine Linuxイメージをプルし、イメージの名前をtest-image
として設定します。 、およびインタラクティブシェルでコンテナを実行します:
# Pull and run Alpine container
sudo docker run --name test-image -it alpine:latest /bin/sh
2. Alpineコンテナ内に入ると、 TESTというファイルを作成します。 。このファイルは、Dockerレジストリからプルするイメージが現在変更しているイメージであることを確認するものになります。
# create a file called TEST
touch /TEST
3. exit
と入力して、インタラクティブシェルを終了します。 ターミナルで。
4.次に、test-image
という名前のAlpineDockerコンテナからDockerイメージを作成します。 、カスタマイズしました:
# Creating Docker image
sudo docker commit test-image your_domain_name/test-image:latest
以前にプルしてカスタマイズしたAlpineイメージは、your_domain_name/test-image
というリポジトリを使用してローカルで利用できるようになりました。 latest
にタグを付けます 。
5.新しく作成したイメージをDockerレジストリにプッシュするには、次のコマンドを使用してDockerレジストリにログインします。
# Login to Docker registry
sudo docker login https://your_domain_name
前のセクションで設定したユーザー名とパスワードを入力するように求められます。出力は次のようになります:
...
Login Succeeded
...
6.ログイン後、タグ付けされたイメージをDockerリポジトリにプッシュします。# Pushing docker image sudo docker push your_domain_name/test-image:latest
# Pushing docker image
sudo docker push your_domain_name/test-image:latest
コマンドの出力は次のようになります。
プライベートDockerリポジトリから画像をプルする
DockerイメージをプライベートDockerリポジトリに正常にプッシュしたので、プッシュしたばかりのイメージをプルします。
1.まず、プライベートDockerリポジトリにログインする必要があります。# Login to Docker registry sudo docker login https://your_domain_name
# Login to Docker registry
sudo docker login https://your_domain_name
2.ログイン後、前に作成したDockerイメージをプルします:
# Pull Docker image from Docker registry
sudo docker pull your_domain_name/test-image
下の画像から、Dockerがtest-image
をプルしていることがわかります。 正常に。
3.インタラクティブシェルを実行する時間:
sudo docker run -it your_domain_name/test-image /bin/sh
4.対話型シェルで、次のコマンドを実行します。
ls
下の画像から、 TEST 以前に作成されたファイルはコンテナ内にあります。
これで、Dockerレジストリのテストに成功し、準備が整いました。
結論
このチュートリアルでは、独自のプライベートDockerレジストリを作成しました。必要な前提条件をインストールしました。 SSLおよびHTTP認証を設定します。そして、最後にレジストリから画像をプッシュおよびプルしました。
では、どのパッケージをレジストリにプッシュする予定ですか?