GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

UbuntuLinuxでプライベートDockerレジストリを作成する方法

個人的なプロジェクト用にカスタムビルドされた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;

構成は次のようになります。

SSLの設定

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認証を設定します。そして、最後にレジストリから画像をプッシュおよびプルしました。

では、どのパッケージをレジストリにプッシュする予定ですか?


Docker
  1. RockyLinux8でプライベートDockerレジストリをセットアップする方法

  2. Ubuntu 18.04 / Ubuntu 18.10 /Ubuntu19.04にDockerをインストールする方法

  3. Ubuntu 18.04にDockerをインストールする方法は?

  1. プライベートDockerレジストリを設定して使用する方法

  2. Ubuntu22.04にDockerをインストールする方法

  3. LinuxでDockerコンテナを作成、一覧表示、削除する方法

  1. Linuxで起動可能なUbuntuUSBスティックを作成する方法

  2. Kubernetes(k8s)でプライベートDockerレジストリを設定する方法

  3. Ubuntu20.04でプライベートDockerレジストリを設定する方法