hirosanote’s blog

検証環境の構築手順やネットワーク機器のテスト結果、関連する事について記載します。このブログは個人で行っており、所属する会社とは関係ありません。

Docker プライベートレジストリを構築する手順

Dockerのプライベートレジストリ ( リポジトリ )を構築するする手順を記載します。以下のサイトを参考および翻訳しました。サイト管理者には、翻訳しブログに掲載することの許可は得ています。
www.itzgeek.com

Dockerレジストリは、Dockerイメージを社内(組織内)に格納して配布するためのアプリケーションです。 Dockerには、Dockerハブと呼ばれる公開レジストリがあり、Dockerイメージを自由に保存できます。
しかし、Docker公開レジストリの問題は、アップロードしたイメージが一般公開されることです。 これは、イメージを構築するために長時間働いたときに貴方や貴方の組織が期待するものではありません。この問題を克服するために、プロジェクトのDockerレジストリを非公開に設定することで、貴方または貴方の組織だけがDockerイメージをそこに保存し、同僚に配布できるようにすることができます。

このテクニカルガイドでは、CentOS 7 / Ubuntu 16.04 / Fedora 27にDocker Private Registryを設定する方法について説明します。


インフラ
f:id:hirosanote:20180623185823p:plain

ホスト名 IPアドレス OS 目的
registry.itzgeek.local 192.168.12.10 CentOS 7 Dockerプライベートレジストリサーバーとして動作します。
build.itzgeek.local 192.168.12.20 Ubuntu 16.04 開発者がdockerファイルまたはdockerを使用してDockerイメージを作成し、それらのイメージをdockerプライベートレジストリサーバーにアップロードするDockerエンジンノードとして機能します。
deploy.itzgeek.local 192.168.12.30 Fedora27 プライベートレジストリサーバからダウンロードされた(プル)コンテナをデプロイするDockerエンジンノードとして動作します。

ノート:ここでは、混合(OS)環境を使ってデモンストレーションしています。 トラブルシューティングのために簡単な同種の環境だけを使用することをお勧めします。


前提条件
すべてのノードにDockerエンジンをインストールし、Dockerサービスが起動していることを確認してください。
以下を参考にして下さい。

CentOS 7にDockerをインストールする手順 - hirosanote’s blog
Ubuntu 16.04にDockerをインストールする手順 - hirosanote’s blog
Fedora 27にDockerをインストールする手順 - hirosanote’s blog

先に記載したホスト名を、各ノードに設定します。
先に記載したホスト名、IPアドレスを各ノードのhostsファイルに設定します。

# vi /etc/hosts


Dokerプライベートレジストリの設定
レジストリノードにログインし、Docker Hubからレジストリイメージを取得します。

[root@registry ~]# docker pull registry

プレーンまたはセキュアドッカーレジストリのどちらを使用するかを選択します。


プレーンドッカーレジストリ

[root@registry ~]# docker run -dit -p 5000:5000 --name registry registry


セキュアドカープライベートレジストリ
デフォルトでは、Dockerノードは、TLSを介した安全な接続を使用して、プライベートレジストリとの間でイメージをアップロードまたはダウンロードします。 CAによって署名されたTLS証明書、またはレジストリサーバーで自己署名されたTLS証明書を使用できます。
ここでは、Dockerレジストリを保護するために自己署名証明書を使用します。 次のコマンドを使用して自己署名証明書を作成しましょう。

[root@registry ~]# mkdir -p /certs
[root@registry ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /certs/ca.key -x509 -days 365 -out /certs/ca.crt
Generating a 2048 bit RSA private key
......................+++
..........................+++
writing new private key to '/certs/ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:test
Locality Name (eg, city) [Default City]:test
Organization Name (eg, company) [Default Company Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server's hostname) []:registry.itzgeek.local
Email Address []:admin@itzgeek.local
[root@registry ~]#

"registry.itzgeek.local"をあなたのレジストリサーバーのFQDNに置き換えます。
生成された証明書 "ca.crt"は、この証明書を信頼するためにすべてのビルド/デプロイメントノードに配置する必要があります。

Dockerレジストリコンテナを証明書情報を使用して開始します。

docker run -d -p 5000:5000 --restart=always --name registry -v /certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key registry

これで、"registry.itzgeek.local"で実行されている"registry"という名前のレジストリ・サーバー・コンテナが作成されました。

[root@registry ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
45a3531aad19        registry            "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   registry


FireWall
Dockerレジストリがネットワーク外で利用できるようにするには、ファイアウォールの次のポートを開く必要があります(build.itzgeek.local / deploy.itzgeek.localへの通信)

Dockerレジストリが、CentOS7, Fedora27の場合:

# firewall-cmd --permanent --add-port=5000/tcp
# firewall-cmd --reload

Dockerレジストリが、Ubuntu16.4の場合:

# ufw status
# ufw allow 5000/tcp
# ufw reload ufw enable


Dockerイメージを作成してプライベートレジストリサーバーにアップロード
Build Dockerエンジンノードにログインしてください。 "build.itzgeek.local"


Dockerイメージのビルド
プライベートレジストリサーバーにアップロードするためのDockerイメージ(カスタマイズされたドッカーコンテナー用)を作成しましょう。 3つの方法で、コンテナイメージを構築/作成できます。
1. Commit
2. Dockerfile
3. Docker Compose

上記の方法のいずれかを実行することによって、アップロード用のドッカーイメージを作成し、維持することができます。

私は "build.itzgeek.local"に "hello-world:latest"と呼ばれるドッカーイメージを持っています。これをプライベートレジストリサーバにアップロードします。

root@build:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              e38bc07ac18e        2 months ago        1.85kB
root@build:~#

ここで、dockerイメージの名前をregistryserver:portnumber/image name:tagのように変更します。

イメージ名が指定された形式と一致しない場合、docker pushまたはpullコマンドは、プライベートレジストリからではなく、パブリックレジストリからイメージをアップロードまたはダウンロードしようとします。

Dockerイメージの名前を変更するには、dockerタグコマンドを使用します。

root@build:~# docker tag hello-world:latest registry.itzgeek.local:5000/hello-world:latest

Dockerイメージのリストを確認します。

root@build:~# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
registry.itzgeek.local:5000/hello-world   latest              e38bc07ac18e        2 months ago        1.85kB
hello-world                               latest              e38bc07ac18e        2 months ago        1.85kB


Dockerイメージのアップロード
Dockerレジストリの通信モード(セキュアまたは非セキュア)に応じて、以下のいずれかの方法を実行します。

ノンセキュア (プレーンHTTPレジストリ)
“/etc/docker/”ディレクトリに、“daemon.json” ファイルを編集/作成します。

root@build:~# vi /etc/docker/daemon.json

以下のコメントを追加します。

{
  "insecure-registries" : ["registry.itzgeek.local:5000"]
}


セキュア (自己署名)
レジストリサーバ "registry.itzgeek.local"から "build.itzgeek.local"の "/etc/docker/certs.d/registry.itzgeek.local:5000/ca.crt"に証明書 "ca.crt"をコピーします。

root@build:~# mkdir -p /etc/docker/certs.d/registry.itzgeek.local:5000/
root@build:~# scp -pr root@registry.itzgeek.local:/certs/ca.crt /etc/docker/certs.d/registry.itzgeek.local:5000/


ノンセキュア、セキュア両方のケースで、Dockerエンジンサービスを再起動します。

root@build:~# systemctl restart docker

以下のコマンドを使用して、Dockerイメージファイルをプライベートレジストリサーバーへアップロードします。

root@build:~# docker push registry.itzgeek.local:5000/hello-world:latest


プライベートレジストリサーバーからDockerコンテナイメージをダウンロードして展開
デプロイDockerエンジンノードにログインしてください。 "deploy.itzgeek.local"


ノンセキュア (プレインHTTPレジストリ)
“/etc/docker/”ディレクトリに、“daemon.json” ファイルを編集/作成します。

root@deploy:~# vi /etc/docker/daemon.json

以下のコメントを追加します。

{
  "insecure-registries" : ["registry.itzgeek.local:5000"]
}


セキュア (自己署名)
レジストリサーバ "registry.itzgeek.local"の"ca.crt"証明書を "deploy.itzgeek.local"の "/etc/docker/certs.d/registry.itzgeek.local:5000/にコピーします。

root@deploy:~# mkdir -p /etc/docker/certs.d/registry.itzgeek.local:5000/
root@deploy:~# scp -pr root@registry.itzgeek.local:/certs/ca.crt /etc/docker/certs.d/registry.itzgeek.local:5000/


ノンセキュア、セキュア両方のケースで、Dockerエンジンサービスを再起動します。

root@deploy:~# systemctl restart docker

以下のコマンドを使用して、プライベートレジストリサーバーからDockerイメージをダウンロードします。

root@deploy:~# docker pull registry.itzgeek.local:5000/hello-world:latest

"docker images"コマンドを使って利用可能なイメージのリストを確認します。

[root@deploy ~]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
fedora                                    latest              cc510acfcd70        7 weeks ago         253MB
registry.itzgeek.local:5000/hello-world   latest              e38bc07ac18e        2 months ago        1.85kB

Dockerイメージが準備されています。