GNU/Linux >> Linux の 問題 >  >> Rocky Linux

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

組織で働いていて、Dockerイメージを社内に保持して迅速にデプロイしたい場合は、プライベートDockerリポジトリをホストするのが最適です。プライベートDockerレジストリを使用すると、イメージ配布パイプラインを所有し、イメージの保存と配布をより厳密に制御できます。レジストリをCI/CDシステムと統合して、ワークフローを改善できます。

このチュートリアルでは、Amazon S3をストレージの場所として使用して、RockyLinux8ベースのサーバーでプライベートDockerレジストリを設定して使用する方法を説明します。

前提条件
  • Rocky Linux 8を搭載した2台のLinuxサーバー。1台のサーバーはレジストリホストとして機能し、もう1台はクライアントとして使用されてリクエストを送信したりホストから画像を受信したりします。
  • ホストサーバーを指す登録済みドメイン名。 registry.example.comを使用します チュートリアル用です。
  • 両方のマシンでsudo権限を持つroot以外のユーザー。
ステップ1-ファイアウォールを構成する

最初のステップは、ファイアウォールを構成することです。 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
ステップ3-Dockerレジストリを構成する ユーザーディレクトリを作成する

レジストリ構成用のディレクトリを作成します。

$ 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と入力します プロンプトが表示されたら。

作成ファイルに設定した内容を見ていきましょう。

  1. 最初のステップは、ハブからDockerレジストリのバージョン2の最新イメージを取得することです。最新のタグは、メジャーバージョンのアップグレード時に問題が発生する可能性があるため、使用していません。 2に設定すると、次のメジャーバージョンへの自動アップグレードを防ぎながら、すべての2.xアップデートを取得できます。これにより、重大な変更が発生する可能性があります。

  2. レジストリコンテナは、障害や予期しないシャットダウンが発生した場合に常に再起動するように設定されています。

  3. 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に設定しないと問題が発生する可能性があります。
  4. Dockerレジストリはポート5000を介して通信します。これは、サーバーでDockerに公開されているものです。

  5. ./auth:/etc/nginx/conf.d マッピングにより、Nginxのすべての設定がコンテナで利用可能になります。

  6. ./auth/nginx.conf:/etc/nginx/nginx.conf:ro Nginx設定ファイルをシステムから読み取り専用モードのコンテナー内のファイルにマップします。

  7. ./logs:/var/log/nginx コンテナ内のNginxログディレクトリにマッピングすることで、システム上のNginxのログにアクセスできるようにします。

  8. 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

これで、ファイルは認証のためにレジストリコンテナにマップされます。

ステップ4-SSLをインストールする

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
ステップ5-Nginxを設定する

次のステップでは、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
ステップ6-Dockerレジストリを起動します

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レジストリを設定するためのチュートリアルは終了です。ご不明な点がございましたら、下のコメント欄に投稿してください。


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

  2. AlmaLinux /RockyLinuxにDockerをインストールする方法

  3. RockyLinux8にDockerContainerをインストールしてセットアップする方法

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

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

  3. DockerとDockerをインストールする方法-RockyLinux8で作成する

  1. RockyLinux8にPadlocPasswordManagerをインストールする方法

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

  3. RockyLinux8にDockerをインストールする方法