はじめに
DockerHub にいろいろとイメージがあるものの、自分で作った Docker image を自分のRegistry において好きな時にダウンロードして起動したいと思ってきた。
Dockerfile を用意して DockerHub からダウンロードした Docker image から作成してもいいのだけど意外と時間がかかるので、準備完了状態のイメージを用意して、どっかの Docker のサーバーに置いておきたい。
HTTPS で証明書登録した通信もできるが、内部的な利用のためあくまで、さくっと利用できる環境を用意する方法です。
サーバとクライアントで2つの環境 (VMなど) を用意しておいてください。
手順
大まかに以下の手順
- docker のインストール
- docker の起動
- Docker Registry の用意
- サーバ側でイメージの用意(ダウンロードとRegistry)
- Docker Registry からイメージのダウンロード
- サーバ側でダウンロード
- クライアント側でダウンロード
Docker のインストール
Redistry のサーバ、クライアント側にインストールする必要がある。
docker を rpm インストールするにはダウンロード先登録が必要。
yum -y install yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
Docker の起動
Redistry のサーバ、クライアント側で docker のサービスを起動し、OS起動時に自動起動させる。
systemctl start docker
systemctl enable docker
Docker Registry の用意
Registry のサーバで、Registry のイメージをダウンロードする
docker pull registry
以下のように docker image が追加される
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 2d4f4b5309b1 3 months ago 26.2MB
Docker Registry の起動
Docker Registry を起動する。
このとき、Registry 上のイメージを永続化させたいのでホスト OS のディレクトリをコンテナにマウントさせる。
docker run -d -p 5000:5000 \
-v /var/opt:/var/lib/registry \
registry
コンテナが起動したことを確認
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35b3882b8536 registry "/entrypoint.sh /etc…" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp dreamy_roentgen
ホスト OS に以下のようなディレクトリができて、この下にマウントされる。
ls /var/opt/docker/registry/v2/
blobs repositories
イメージを登録すると以下のように repositories 以下にイメージが保存されるディレクトリである。
ls -l /var/opt/docker/registry/v2/repositories/aaa
合計 0
drwxr-xr-x 5 root root 55 9月 16 15:33 centos_local
サーバ側でイメージの用意(ダウンロードとRegistry)
ローカルの Repository サーバに登録する元のイメージをダウンロード
なんでもいいが、とりあえず CentOS をダウンロード
docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
ダウンロードできたことを確認
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 5 weeks ago 215MB
registry latest 2d4f4b5309b1 2 months ago 26.2MB
docker Resistry へ登録するイメージを作成(タグ付け)
本来は Dockerfile などを利用して様々なツールや設定をしたイメージを作るのだが、今回は単純にダウンロードした CentOS のイメージをそのまま使う
docker tag centos localhost:5000/aaa/centos_local:1.0
タグ付けをすると以下のようにイメージができる
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 5 weeks ago 215MB
localhost:5000/aaa/centos_local 1.0 0d120b6ccaa8 5 weeks ago 215MB
registry latest 2d4f4b5309b1 2 months ago 26.2MB
docker Resistry へイメージを登録
タグ付けしたイメージを docker Registry へ登録する
docker push localhost:5000/aaa/centos_local:1.0
The push refers to repository [localhost:5000/iseki/centos_local]
291f6e44771a: Pushed
1.0: digest: sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71 size: 529
登録後は、イメージは不要になるので削除
docker rmi localhost:5000/iseki/centos_local:1.0
Untagged: localhost:5000/iseki/centos_local:1.0
Untagged: localhost:5000/iseki/centos_local@sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71
削除後、一覧にイメージがないことを確認
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 5 weeks ago 215MB
registry latest 2d4f4b5309b1 2 months ago 26.2MB
Docker Registry からイメージのダウンロード
サーバ側でダウンロード
サーバからからは以下のコマンドを実行してダウンロードできる
docker pull localhost:5000/aaa/centos_local:1.0
クライアント側でダウンロード
クライアント側からは、「クライアント側」に以下の設定を入れないと接続ができない
cat /etc/docker/daemon.json
{ "insecure-registries":["<Docker RegistoryのサーバーIP、またはホスト名>:5000"] }
上記の設定をして、docker のサービスを再起動
systemctl restart docker
この状態で、docker Registroy サーバからイメージを取得するコマンドを実行する。
docker pull 10.1.5.25:5000/aaa/centos_local:1.0
1.0: Pulling from iseki/centos_local
3c72a8ed6814: Pull complete
Digest: sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71
Status: Downloaded newer image for 10.1.5.25:5000/aaa/centos_local:1.0
10.1.5.25:5000/aaa/centos_local:1.0
docker のイメージがダウンロードされる
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.1.5.25:5000/aaa/centos_local 1.0 0d120b6ccaa8 7 weeks ago 215MB