概要
このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/7向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで1つのトピックをカバーできるようにする予定です。
このエントリで記載するトピックは、前回作ったコンテナをローカルのregistryに登録することです。
前提
おことわり
- このエントリは、インターネットに直接アクセスできる環境を前提としています。インターネットと断絶された世界での運用は、Advent Calendarに余裕があれば、別エントリでまとめてとりあげます。
想定読者
「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。
コンテナは、registryに登録し、そこからコンテナをdocker pull必要がある。
OS
このエントリは、下記の環境でお送りします。
$ cat /etc/os-release | grep PRETTY
PRETTY_NAME="Ubuntu 18.04.1 LTS"
$ uname -a
Linux Ubuntu1804 4.15.0-39-generic #42-Ubuntu SMP Tue Oct 23 15:48:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Docker private regitryを作る
以下の前提でprivate registryを作ります。
- 証明書は、自己証明書を使う。(ローカルに構築したいので、Let's encryptは使えないため)
参照先:下記サイトに従っています。
イメージの格納場所を準備する
$ sudo mkdir /var/private-registry
公式サイトのTest an insecure registryに従い、作業を進めます。
ディレクトリを作り、
$ mkdir -p certs
自己証明書を作ります。
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
<details><summary>上記実行中の様子。証明書用にいくつか項目が聞かれるとことは、空白のままEnterキーで大丈夫です。</summary><div>
```shell-session
Generating a 4096 bit RSA private key
........................................................................................................................................................................................++
..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................++
writing new private key to 'certs/domain.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) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
dockerデーモンが証明書を参照できるように、出来上がったファイルをコピーしておきます。
$ sudo mkdir -p /etc/docker/certs.d/localhost:5000
$ sudo cp certs/domain.crt /etc/docker/certs.d/localhost:5000/ca.crt
docker-composeを準備する(インストールしていない場合のみ)
docker-composeがインストールされていない場合には、公式サイトに従って導入します。
$ sudo sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
docker-compose.ymlを用意する
下記のような設定ファイルを用意しました。このエントリで作った証明書ファイルを参照しています。
version: '3'
services:
registry:
image: registry:2.6
container_name: registry
environment:
REGISTRY_HTTP_ADDR: 0.0.0.0:443
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
REGISTRY_HTTP_TLS_KEY: /certs/domain.key
volumes:
- /var/private-registry:/var/lib/registry
- ./certs:/certs
ports:
- 5443:443
restart: always
networks:
- default
起動
docker-compose.ymlが存在するディレクトリで、下記コマンドで起動します。
$ docker-compose up
コンテナのpush, pull
前述のprivate registryに対して、コンテナのpushとpullを行います。
準備
前の買いで作ったコンテナに、タグをつけます。
$ sudo docker tag vanilla-hw:latest localhost:5443/ehw2018/vanilla-hw:latest
push
$ sudo docker push localhost:5443/ehw2018/vanilla-hw
The push refers to repository [localhost:5443/ehw2018/vanilla-hw]
f89b04970ccd: Pushed
273ca3248753: Pushed
08f4f36c9d4b: Pushed
a1688724228c: Pushed
480f0a5f4c03: Pushed
8827d397f439: Pushed
11af704b9028: Pushed
a1c06ce374f4: Pushed
85284e2f6d9e: Mounted from ehw2018/debian-stretch
latest: digest: sha256:cb4d7ec2776b64d08e61627c6bf83fa91787928caa6b6da894d6dcb0315945e5 size: 2198
pull
まず、手元のイメージを消しておきます。
$ sudo docker rmi localhost:5443/ehw2018/vanilla-hw
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
circleci/picard latest b1f2c41821a8 11 hours ago 83.8MB
vanilla-hw latest c805d3cae8ca 29 hours ago 756MB
debian-stretch latest c59c0c11fdb6 2 days ago 258MB
registry 2.6 2e2f252f3c88 2 months ago 33.3MB
なくなりましたね。この状態でpullします。
$ sudo docker pull localhost:5443/ehw2018/vanilla-hw
Using default tag: latest
latest: Pulling from ehw2018/vanilla-hw
Digest: sha256:cb4d7ec2776b64d08e61627c6bf83fa91787928caa6b6da894d6dcb0315945e5
Status: Downloaded newer image for localhost:5443/ehw2018/vanilla-hw:latest
イメージがpullされました。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
circleci/picard latest b1f2c41821a8 11 hours ago 83.8MB
vanilla-hw latest c805d3cae8ca 29 hours ago 756MB
localhost:5443/ehw2018/vanilla-hw latest c805d3cae8ca 29 hours ago 756MB
debian-stretch latest c59c0c11fdb6 2 days ago 258MB
registry 2.6 2e2f252f3c88 2 months ago 33.3MB
実行
$ sudo docker run -it --rm localhost:5443/ehw2018/vanilla-hw
hello, world
以上で、dockerのprivate registryに登録したコンテナをpullして、実行することができました。
まとめ
このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の7日目として、
作ったコンテナをローカルのregistryに登録する
をトピックとして取り上げました。
EHW2018のネタとしては、このあと、このプログラムと同じような目的を持つものを現代的なツール群を用いて、なるべくめんどくさく実現していくことを考えています。