はじめに
普段Dockerを利用する際は、初めに登録したDockerHUBのリポジトリからイメージ取得がされている。
これに特別困っていることはないのだが、DockerHUBにMyリポジトリを作ったり、ローカルでDocker Registoryを構築したりもせっかくなので試してみようと思った。
実行環境
・VMインスタンス2台(GCP上)
【VM#1(リージョン:東京)】
・Ubuntu 20.04 LTS
・docker 19.03
【VM#2(リージョン:US)】
・Ubuntu 20.04 LTS
・docker 19.03
・docker-registory
今回の手順
1.VM環境準備
2.DockerHUBにMyリポジトリ作成
3.Docker Registoryの構築
1.VM環境の構築
VM#1、VM#2にdockerのインストール
【Dockerコンテナ内のUbuntuではsystemctlは使えない】の手順1を参考に。
2.DockerHUBにMyリポジトリ作成
DockerHUBへのアカウント登録
DockerHUBの公式ページに飛び、サインアップ。
https://hub.docker.com/
VM#1にPush用のイメージを用意
$ docker container run -it -d --name con1 ubuntu:18.04
コンテナに入り適当なソフトをインストール
※今回もApache2をインストール
$ docker attach con1
apt update
apt -y upgrade
apt install -y apache2
exit
変更を加えたコンテナをイメージ化する
$ docker commit con1 test-myrepo:ver1
イメージの確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test-myrepo ver1 754107070068 54 seconds ago 213MB
ubuntu 18.04 2c047404e52d 3 weeks ago 63.3MB
MyリポジトリにイメージをPush
まずはDockerHUBにログインする
$ sudo docker login
Username: ******
Password: ******
Login Succeeded
tag
コマンドでレジストリ先・リポジトリを変更したものを用意。
$ docker image tag 【イメージID】 【アカウント名(Myリポジトリ)】/【イメージ名】:【タグ】
試しにイメージを確認してみる。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test-myrepo ver1 754107070068 19 hours ago 213MB
******/new-img ver1 754107070068 19 hours ago 213MB
ubuntu 18.04 2c047404e52d 3 weeks ago 63.3MB
DockerHUBにイメージをPush
$ docker image push 【上記で作成されたイメージ名(アカウント含む)】:【タグ】
DockerHUBのページでリポジトリが作成されていれば、Pushは上手くいっている。
※普段docker image pull
より、【イメージ名】:【タグ】のみでダウンロードできるのは、最初の設定時にデフォルトのレジストリ先を DockerHUB 、リポジトリ先をどこかに設定しているから。(上記のPush
はリポジトリ先をMyリポジトリに変えている。)
例えば、プライベートレジストリにイメージをPush
やPull
する時は、docker image pull 【レジストリ名】:【リポジトリ名】:【イメージ名】:【タグ】
となる。
VM#2でMyリポジトリからイメージをPull
Push
の時と同じくCUIからDockerHUBにログインする
$ sudo docker login
Username: ******
Password: ******
Login Succeeded
実際のPull
コマンドを実行
$ docker image pull 【アカウント名(Myリポジトリ)】/【イメージ名】:【タグ】
docker image ls
コマンドなどで確認できれば成功!
ここまでできたら一旦VM#2のイメージは消す。
3.Docker Registoryの構築(プライベート用)
VM#2にDockerRegistory 取得
Registoryのイメージ取得
$ docker image pull registry
Registoryコンテナの起動
$ docker container run -d -p 5000:5000 registry
VM#1からDockerRegistoryにPush
&Pull
レジストリ情報を付与したイメージを用意
$ docker image tag 【イメージID】 【DockerRegistoryの内部IP:5000】/【リポジトリ名】:【タグ】
プライベートRegistoryにPush
$ docker image push 【DockerRegistoryの内部IP:5000】/【リポジトリ名】:【タグ】
The push refers to repository [xxx.xxx.xxx.xxx:5000/******]
Get https://xxx.xxx.xxx.xxx:5000/v2/: http: server gave HTTP response to HTTPS client
しかし上記の様なエラーが出て上手く行かない。
別のdockerクライアントの端末からPush
やPull
を行いたい場合、基本的にはSSLを使った暗号化通信が必要となる。
これはdockerクライアント側で、信頼関係がなく暗号化通信できないサーバーとは通信不可の設定になっているから。
今回は、Registryコンテナが入っているサーバーを限定的にhttp通信ができる様にする。
VM#1で以下を実行
daemon.json
を作成
$ sudo nano /etc/docker/daemon.json
{"insecure-registries":["DockerRegistoryの内部IP:5000"]}
docker再起動
$ sudo systemctl restart docker
Inseure Registoryes
に追加されているか確認
$ docker info
・・・
・・・
Experimental: false
Insecure Registries:
xxx.xxx.xxx.xxx:5000
127.0.0.0/8
Live Restore Enabled: false
・・・
・・・
この状態で再度プライベートRegistoryにPush
$ sudo docker push 【DockerRegistoryの内部IP:5000】/【リポジトリ名】:【タグ】
The push refers to repository [xxx.xxx.xxx.xxx:5000/*******]
2a42637bbd9b: Pushing [====================> ] 62.14MB/149.7MB
fe6d8881187d: Pushed
23135df75b44: Pushed
b43408d5f11b: Pushing [========================================> ] 51.5MB/63.25MB
ちゃんとPushできる事を確認!
※ちなみにPullも試したけど問題なくできた。