6
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

proxy環境下でDocker Registryの構築

Last updated at Posted at 2019-12-05

自分たちで開発した Docker コンテナをイントラネット内で使ってもらうために、Docker Registry を構築しました。構築時、proxyでハマったので簡単に手順を残します。
OS は CentOS7.7 を使用します。この構築手順は OS のインストール直後を想定しています。また、証明書や認証の設定については、省略させていただきます。

Docker Registry とは

社内のみで Docker イメージを登録、取得したいケースがあります。このような場合、Dockerイメージが大量に保存されている Docker Hub を利用するのではなく、社内用のDockerイメージの保管庫が必要になります。Docker Registry は、Docker イメージを保存しておいて、提供するサービスです。Docker Registry を 利用することで、社内で Docker イメージの登録(docker push)、取得(docker pull)が可能になります。
Docker Registry も Docker イメージとして、Docker Hub に登録されていて、取得(docker pull)して、それを使ってコンテナを起動させることで、Docker Registry を構築することができます。

詳細は公式サイト Docker Registry で紹介しています。

Docker のインストール

Docker Registry をインストールする前に、まず、Docker をインストールします。

各種設定

yum に proxy の設定を追加するために /etc/yum.conf を編集します。

$ sudo vi /etc/yum.conf

以下を yum.conf に追加します。proxy の利用に認証が必要な場合、proxy_username, proxy_passwird も追加して下さい。今回は省略します。

/etc/yum.conf
proxy=http://<proxy_host>:<proxy_port>

デフォルトのリポジトリ設定では、yum 実行時にタイムアウトになる可能性がありますので、/etc/yum.repos.d/CentOS-Base.repo を編集します。

$ sudo vi /etc/yum.repos.d/CentOS-Base.repo

[base], [update], [extras], [centosplus] の baseurl を以下のように置き換えます。

/etc/yum.repos.d/CentOS-Base.repo
[base]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
[updates]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/updates/$basearch/
[extras]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/extras/$basearch/
[centosplus]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/centosplus/$basearch/

yum update を実行して、各パッケージを最新にします。

$ sudo yum update

Docker のインストール

公式な手順 Get Docker Engine - Community for CentOS に従って、以下のようにDockerのインストールを進めます。

古いバージョンの Docker パッケージをアンインストールします。

$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

Docker のインストールに必要な yum-utils, device-mapper-persistent-data, lvm2 パッケージをインストールします。

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Docker インストール用リポジトリを yum に追加します。

$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

リポジトリーの構成を表示して、docker-ce-stable が含まれていれば問題ありません。

$ sudo yum repolist
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo ID                         repo name                         status
base/7/x86_64                   CentOS-7 - Base                   10,097
docker-ce-stable/x86_64         Docker CE Stable - x86_64             61
extras/7/x86_64                 CentOS-7 - Extras                    305
updates/7/x86_64                CentOS-7 - Updates                   711

Docker をインストールします。

$ sudo yum install docker-ce docker-ce-cli containerd.io

docker -v で Docker がインストールされたか確認できます。

$ sudo docker -v
Docker version 19.03.4, build 9013bf583a

Docker を起動します。

$ sudo systemctl start docker

以下で Docker の起動を確認します。エラーが出力されなければ、Docker は起動されています。

$ sudo docker search hello-world

Docker の設定

sudo を使用しなくても Docker が使用できるように、現在のユーザーを docker グループに追加します(docker グループは、Docker インストール後、追加されている)。

$ sudo usermod -aG docker $USER

docker のプロキシを設定します。詳細は公式サイトの Control Docker with systemd に記述されています。

$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf

以下のように、http-proxy.conf に proxy の情報を記述します。

/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://<proxy_host>:<proxy_port>" "HTTPS_PROXY=http://<proxy_host>:<proxy_port>" "NO_PROXY=localhost,127.0.0.1"

設定を反映して、Docker を再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

docker info で proxy が設定されたか確認ができます。最後の方で以下のように表示されます。

$ docker info
 HTTP Proxy: http://<proxy_host>:<proxy_port>
 HTTPS Proxy: http://<proxy_host>:<proxy_port>
 No Proxy: localhost, 127.0.0.1

以下で、OS 起動時に Docker を自動起動にします。詳細は公式サイトの Configure Docker to start on boot に記述されています。

$ sudo systemctl enable docker

Docker Registry の構築

インストールした Docker を用いて、Docker Registory を構築していきます。

イメージの取得

はじめに、Docker Registry イメージの確認をします。

$ docker search registry

docker pull で Docker Registry イメージを取得します。

$ docker pull registry
Using default tag: latest
latest: Pulling from library/registry
c87736221ed0: Pull complete 
1cc8e0bb44df: Pull complete 
54d33bcb37f5: Pull complete 
e8afc091c171: Pull complete 
b4541f6d3db6: Pull complete 
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

docker images で registry イメージが取得できていることを確認します。

$ docker images
REPOSITORY          TAG       IMAGE ID         CREATED             SIZE
registry            latest    f32a97de94e1     8 months ago        25.8MB

コンテナの起動

ホスト側に、push されたイメージを保存するために以下のディレクトリを作成します。

/root/docker/registry/

取得した registry イメージをもとに Docker Registry 用のコンテナを docker run で起動します。ポートは5000番を使用します。

$ docker run -d -p 5000:5000 registry
$ docker run -d -p 5000:5000 -v /root/docker/registry/data:/var/lib/registry --restart=always --name registry01 registry:latest

docker ps で Docker Registry コンテナが動作していることを確認します。

$ docker ps
CONTAINER ID  IMAGE            COMMAND                 CREATED        STATUS      PORTS                   NAMES
091ea25e90fe  registry:latest  "/entrypoint.sh /etc…"  8 seconds ago  Up 25 hours 0.0.0.0:5000->5000/tcp  registry01

他 Docker Client から Docker Registry コンテナにアクセス

各種設定

他の環境で、前述と同じように [Dockerのインストール](# Docker のインストール)を行います。

以下のように、http-proxy.conf の NO_PROXYに Docker Registry のIPアドレスまたはサーバ名を記述します。

/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://<proxy_host>:<proxy_port>" "HTTPS_PROXY=http://<proxy_host>:<proxy_port>" "NO_PROXY=localhost,127.0.0.1,<registry_host>"

insecure registry の設定

Registry が暗号化されていないhttp通信の場合は、insecure registry にその Registry を登録しないと、Dockerイメージをpullすることができないので、設定します。

$ sudo vi /etc/docker/daemon.json

/etc/docker/daemon.json に以下を追加します。

/etc/docker/daemon.json
{ "insecure-registries":["<registry_host>:<registry_port>"] }

設定を反映して、Docker を再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

イメージの登録

まず、 Docker Registry に登録するイメージを準備する。今回は確認のために hello-world イメージを docker pull します。

$ docker pull hello-world

イメージを Docker Registry に登録するために、hello-world イメージにタグを付けます。

$ docker tag hello-world <registry_host>:5000/hello-world

docker images で <registry_host>:5000/hello-world が作成されていることを確認します。

$ docker images 
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
hello-world                       latest              fce289e99eb9        10 months ago       1.84kB
<registry_host>:5000/hello-world  latest              fce289e99eb9        10 months ago       1.84kB

docker push で <registry_host>:5000/hello-world イメージを Docker Registry に登録します。

$ docker push <registry_host>:5000/hello-world
The push refers to repository [<registry_host>:5000/hello-world]
af0b15c8625b: Pushed 
latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524

イメージの取得

Docker Registry からイメージの取得する前に、確認のため、ローカルのイメージを削除します。

$ docker rmi <registry_host>:5000/hello-world

docker images で <registry_host>:5000/hello-world が削除されていることを確認します。

$ docker images 
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
hello-world                       latest              fce289e99eb9        10 months ago       1.84kB

docker pull で <registry_host>:5000/hello-world イメージを Docker Registry から取得します。

$ docker pull <registry_host>:5000/hello-world
Using default tag: latest
latest: Pulling from hello-world
Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
Status: Downloaded newer image for <registry_host>:5000/hello-world:latest

docker images で <registry_host>:5000/hello-world が取得されていることを確認します。

$ docker images 
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
hello-world                       latest              fce289e99eb9        10 months ago       1.84kB
<registry_host>:5000/hello-world  latest              fce289e99eb9        10 months ago       1.84kB

registry のイメージ一覧の取得

以下の方法で registry のイメージ一覧を取得できます。

$ curl --noproxy <registry_host> http://<registry_host>:5000/v2/_catalog
{"repositories":["hello-world"]}

まとめ

Docker Registry も Docker イメージとして、Docker Hub に登録されていて、取得して、それを使ってコンテナを起動させることで、Docker Registry を構築することができました。Docker Registry コンテナをイントラネット内で使用するためには、proxyの設定が不可欠です。proxy 設定と proxy を使わない設定を正しくできると動作まで辿り着けます。

もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。

参考

Docker 公式サイト他に以下の記事を参考にさせていただきました。

6
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?