Ubuntu 20.04
Sponsored Link

Docker : Registry を利用する
2020/08/06
 
Registry をインストールして、Docker イメージのプライベートレジストリーサーバーを構築します。
[1] Registry をインストールします。
root@dlp:~#
apt -y install docker-registry
[2] Registry の設定です。
HTTP 通信 且つ 認証なしの場合の設定です。
root@dlp:~#
vi /etc/docker/registry/config.yml
# 認証なしの場合は以下のように [auth] セクションはコメント化

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/docker-registry
  delete:
    enabled: true
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
#auth:
#  htpasswd:
#    realm: basic-realm
#    path: /etc/docker/registry
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

root@dlp:~#
systemctl restart docker-registry
# 任意のクライアントからアクセス可能か確認

# HTTP 通信の場合はそれぞれのクライアントノードに [insecure-registries] の登録が必要

root@dlp:~#
vi /etc/docker/daemon.json
# 新規作成 または 追記

# HTTP を許可するホストを追加

{
  "insecure-registries":
    [
      "docker.internal:5000",
      "dlp.srv.world:5000"
    ]
}

root@dlp:~#
systemctl restart docker
# ローカルホストから [push]

root@dlp:~#
docker tag nginx localhost:5000/nginx:my-registry

root@dlp:~#
docker push localhost:5000/nginx:my-registry

root@dlp:~#
docker images

REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
nginx                  latest              08393e824c32        29 hours ago        132MB
localhost:5000/nginx   my-registry         08393e824c32        29 hours ago        132MB

# 他ノードから [pull]

root@node01:~#
docker pull dlp.srv.world:5000/nginx:my-registry

root@node01:~#
docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
dlp.srv.world:5000/nginx   my-registry         08393e824c32        29 hours ago        132MB
[3] Basic 認証を有効にする場合は以下のように設定します。
root@dlp:~#
apt -y install apache2-utils
root@dlp:~#
vi /etc/docker/registry/config.yml
# [auth] セクションをコメント解除して passwd ファイルのパスを指定

.....
.....
auth:
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/.htpasswd
.....
.....

root@dlp:~#
systemctl restart docker-registry
# 任意のユーザー登録

# [-c] オプションは新規ファイル作成のため初回のみ付与

root@dlp:~#
htpasswd -Bc /etc/docker/registry/.htpasswd ubuntu

New password:
Re-type new password:
Adding password for user ubuntu

# 任意のノードでアクセス確認

# 認証していない場合はエラー

root@node01:~#
docker pull dlp.srv.world:5000/nginx:my-registry

Error response from daemon: Get http://dlp.srv.world:5000/v2/nginx/manifests/my-registry: no basic auth credentials
# [htpasswd] で登録したユーザーで認証

root@node01:~#
docker login dlp.srv.world:5000

Username: ubuntu
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
root@node01:~#
docker pull dlp.srv.world:5000/nginx:my-registry

root@node01:~#
docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
dlp.srv.world:5000/nginx   my-registry         08393e824c32        30 hours ago        132MB
[4] HTTPS でアクセスする場合 且つ Let's Encrypt 等から取得した有効な SSL/TLS 証明書 を使用する場合は以下のように設定します。
当例では、SSL 証明書はリンク先の例のように [/etc/letsencrypt/live/dlp.srv.world] 配下に取得している前提で進めます。
root@dlp:~#
mkdir /etc/docker/certs.d

root@dlp:~#
cp -p /etc/letsencrypt/live/dlp.srv.world/{fullchain,privkey}.pem /etc/docker/certs.d/

root@dlp:~#
chown docker-registry /etc/docker/certs.d/{fullchain,privkey}.pem

root@dlp:~#
vi /etc/docker/registry/config.yml
# [http] セクション配下に [tls] セクションを追記して証明書を指定

.....
.....
http:
  addr: :5000
  tls:
    certificate: /etc/docker/certs.d/fullchain.pem
    key: /etc/docker/certs.d/privkey.pem
  headers:
    X-Content-Type-Options: [nosniff]
.....
.....

root@dlp:~#
systemctl restart docker-registry
# 任意のノードでアクセス確認

# HTTPS のため [insecure-registries] の登録不要

root@node01:~#
docker pull dlp.srv.world:5000/nginx:my-registry

root@node01:~#
docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
dlp.srv.world:5000/nginx   my-registry         08393e824c32        31 hours ago        132MB
[5] HTTPS でアクセスする場合 且つ 自己署名の SSL/TLS 証明書 を使用する場合は以下のように設定します。
当例では、SSL 証明書はリンク先の例のように [/etc/ssl/private] 配下に証明書を作成している前提で進めます。
root@dlp:~#
mkdir -p /etc/docker/certs.d/dlp.srv.world:5000

root@dlp:~#
cp -p /etc/ssl/private/server.{crt,key} /etc/docker/certs.d/dlp.srv.world:5000/

root@dlp:~#
chown docker-registry /etc/docker/certs.d/dlp.srv.world:5000/server.{crt,key}

root@dlp:~#
vi /etc/docker/registry/config.yml
# [http] セクション配下に [tls] セクションを追記して証明書を指定

.....
.....
http:
  addr: :5000
  tls:
    certificate: /etc/docker/certs.d/dlp.srv.world:5000/server.crt
    key: /etc/docker/certs.d/dlp.srv.world:5000/server.key
  headers:
    X-Content-Type-Options: [nosniff]
.....
.....

root@dlp:~#
systemctl restart docker-registry
# 任意のノードでアクセス確認

# 自己署名の証明書の場合は以下のようにエラーになる

root@node01:~#
docker pull dlp.srv.world:5000/nginx:my-registry

Error response from daemon: Get https://dlp.srv.world:5000/v2/: x509: certificate signed by unknown authority
# registry サーバー側の証明書をクライアント側にコピーする

root@node01:~#
mkdir -p /etc/docker/certs.d/dlp.srv.world:5000

root@node01:~#
scp root@dlp.srv.world:"/etc/docker/certs.d/dlp.srv.world:5000/server.crt" /etc/docker/certs.d/dlp.srv.world:5000/ca.crt

root@node01:~#
docker pull dlp.srv.world:5000/nginx:my-registry

root@node01:~#
docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
dlp.srv.world:5000/nginx   my-registry         08393e824c32        32 hours ago        132MB
関連コンテンツ