LoginSignup
5
0

More than 3 years have passed since last update.

Myリポジトリの利用とDocker Registoryの構築。

Last updated at Posted at 2021-01-21

はじめに

普段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リポジトリに変えている。)
例えば、プライベートレジストリにイメージをPushPullする時は、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にPushPull

レジストリ情報を付与したイメージを用意

$ 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クライアントの端末からPushPullを行いたい場合、基本的にはSSLを使った暗号化通信が必要となる。
これはdockerクライアント側で、信頼関係がなく暗号化通信できないサーバーとは通信不可の設定になっているから。

今回は、Registryコンテナが入っているサーバーを限定的にhttp通信ができる様にする。

VM#1で以下を実行

daemon.jsonを作成

$ sudo nano /etc/docker/daemon.json
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も試したけど問題なくできた。

5
0
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
5
0