このチュートリアルでは、Ubuntu 16.04でAlibaba Cloud ECS上に独自のDockerプライベートレジストリサーバを設定します。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
#必要条件
1、Ubuntuがインストーされたレジストリサーバ用の新しいAlibaba Cloudインスタンス。
2、Ubuntuがインストールされたレジストリクライアント用の新しいAlibaba Cloudインスタンス。
3、レジストリサーバーインスタンスに192.168.0.101の静的IPアドレスが設定され、レジストリクライアントインスタンスに192.168.0.102の静的IPアドレスが設定されます。
4、サーバー上にRootパスワードが設定されます。
#Alibaba Cloud ECSインスタンスを起動する
まず、Alibaba Cloud ECS Consoleにログインします。新しいECSインスタンスを作成し、少なくとも2GBのRAMを搭載したオペレーティングシステムとしてUbuntu 16.04を選択します。ECSインスタンスに接続し、rootユーザーとしてログインします。
Ubuntu 16.04インスタンスにログインしたら、以下のコマンドを実行して、ベースシステムを最新の利用可能なパッケージで更新します。
apt-get update -y
#ホストの設定
まず、各インスタンスに/etc/hostsファイルを設定し、各インスタンスがホスト名で通信できるようにします。
各インスタンスに/etc/hostsファイルを設定するには、以下のコマンドを実行します。
nano /etc/hosts
以下の行を追加します。
192.168.0.101 registry-server
192.168.0.102 registry-client
完了したら、ファイルを保存して閉じます。
次に、レジストリ・サーバ・インスタンス上で以下のコマンドを実行することで、名前解決を確認することができます。
ping registry-client
ping registry-server
#Dockerのインストール
始める前に、両方のインスタンスにDockerをインストールする必要があります。デフォルトでは、Ubuntu 16.04のデフォルトリポジトリにはDocker CEの最新版がありません。そのため、Docker CEのリポジトリをシステムに追加する必要があります。
まず、以下のパッケージをシステムにインストールします。
apt-get install -y apt-transport-https software-properties-common ca-certificates curl -y
次に、以下のコマンドでDocker CE GPGキーをダウンロードして追加します。
wget https://download.docker.com/linux/ubuntu/gpg
apt-key add gpg
次に、/var/lib/dpkg/lockDocker CE リポジトリを APT に追加します。
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" | tee /etc/apt/sources.list.d/docker.list
最後に、以下のコマンドを実行してリポジトリを更新し、Docker CEをインストールします。
apt-get update -y
apt-get install docker-ce -y
インストールが完了したら 以下のコマンドでDockerの状態を確認します。
systemctl status docker
出力します。
docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-08-06 19:49:28 IST; 41s ago
Docs: https://docs.docker.com
Main PID: 13024 (dockerd)
CGroup: /system.slice/docker.service
├─13024 /usr/bin/dockerd -H fd://
└─13054 docker-containerd --config /var/run/docker/containerd/containerd.toml
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.240011773+05:30" level=info msg="ClientConn switching balancer to \"pick_first\
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.241034794+05:30" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.243219799+05:30" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.244280675+05:30" level=info msg="Loading containers: start."
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.970064077+05:30" level=info msg="Default bridge (docker0) is assigned with an I
Aug 06 19:49:28 Node1 dockerd[13024]: time="2018-08-06T19:49:28.161884804+05:30" level=info msg="Loading containers: done."
Aug 06 19:49:28 Node1 dockerd[13024]: time="2018-08-06T19:49:28.192309817+05:30" level=info msg="Docker daemon" commit=0ffa825 graphdriver(s)=o
Aug 06 19:49:28 Node1 dockerd[13024]: time="2018-08-06T19:49:28.193198210+05:30" level=info msg="Daemon has completed initialization"
Aug 06 19:49:28 Node1 systemd[1]: Started Docker Application Container Engine.
#Dockerレジストリのインストール
始める前に、レジストリサーバインスタンス上でDocker private Registryを作成する必要があります。まず、以下のコマンドでDocker Hubからレジストリイメージをダウンロードします。
docker pull registry
出力します。
Using default tag: latest
latest: Pulling from library/registry
4064ffdc82fe: Pull complete
c12c92d1c5a2: Pull complete
4fbc9b6835cc: Pull complete
765973b0f65f: Pull complete
3968771a7c3a: Pull complete
Digest: sha256:51bb55f23ef7e25ac9b8313b139a8dd45baa832943c8ad8f7da2ddad6355b3c8
Status: Downloaded newer image for registry:latest
レジストリイメージをダウンロードしたら、Dockerレジストリを保護するための自己署名証明書を生成する必要があります。なぜなら、Dockerノードは、プライベートレジストリへのイメージのアップロードやダウンロードにTLSを介した安全な接続を使用しているからです。
レジストリサーバに移動し、以下のコマンドを実行して証明書を生成します。
mkdir /etc/certs
cd /etc/certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
出力します。
Generating a 4096 bit RSA private key
.........................++
.........................................++
writing new private key to 'ca.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]:IN
State or Province Name (full name) [Some-State]:Gujarat
Locality Name (eg, city) []:Junagadh
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Alibaba
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:registry-server
Email Address []:hitjethva@gmail.com
この証明書を信頼するためには、生成されたca.crt証明書を全てのレジストリクライアントシステムにコピーする必要があります。
ここで、以下のコマンドを実行して、証明書情報を持ったDockerのレジストリコンテナを起動します。
docker run -d -p 5000:5000 --restart=always --name registry -v /etc/certs:/etc/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/certs/ca.crt -e REGISTRY_HTTP_TLS_KEY=/etc/certs/ca.key registry
これで、以下のコマンドを使用して実行中のレジストリコンテナを確認することができます。
docker ps
出力します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
304fa6da95d4 registry "/entrypoint.sh /etc…" 12 seconds ago Restarting (1) 3 seconds ago 0.0.0.0:5000->5000/tcp registry
#レジストリクライアント上にDockerイメージを作成する
次に、プライベートレジストリサーバにアップロードするためのDockerコンテナイメージをレジストリクライアント上で作成して構築します。
ここでは、Dockerfileを使ってUbuntu 16.04ベースのApache Webサーバーイメージを構築します。
まず、以下のコマンドでDockerfileを作成します。
mkdir Dockerimage
cd Dockerimage
nano Dockerfile
以下の行を追加します。
FROM ubuntu:16.04
LABEL project="Apache Web Server Image"
LABEL maintainer "hitjethva@gmail.com"
RUN apt-get update
RUN apt-get install -y apache2
VOLUME /var/www/html
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
ENV APACHE_LOCK_DIR=/var/lock/apache2
RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR
EXPOSE 80
CMD ["apache2","-DFOREGROUND"]
さて、以下のコマンドを実行して、Dockerfileを使ってApacheのWebサーバイメージを構築します。
docker build -t ubuntu:apachev1.0 .
出力します。
Sending build context to Docker daemon 2.048kB
Step 1/14 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
8ee29e426c26: Pull complete
6e83b260b73b: Pull complete
e26b65fd1143: Pull complete
40dca07f8222: Pull complete
b420ae9e10b3: Pull complete
Digest: sha256:3097ac92b852f878f802c22a38f97b097b4084dbef82893ba453ba0297d76a6a
Status: Downloaded newer image for ubuntu:16.04
---> 7aa3602ab41e
Step 2/14 : LABEL project="Apache Web Server Image"
---> Running in 2c0995179821
Removing intermediate container 2c0995179821
---> cd5b35df03c2
Step 3/14 : LABEL maintainer "hitjethva@gmail.com"
---> Running in 3a28f13e1418
Removing intermediate container 3a28f13e1418
---> b4f0713f0fcf
Step 4/14 : RUN apt-get update
---> Running in 7c1f0d548b90
Removing intermediate container 7c1f0d548b90
---> adb9a635b7f1
Step 5/14 : RUN apt-get install -y apache2
---> Running in 0235c7866eb6
Removing intermediate container 0235c7866eb6
---> 2b5f2c282c79
Step 6/14 : VOLUME /var/www/html
---> Running in e9b58c5f7ddd
Removing intermediate container e9b58c5f7ddd
---> 4a2f62e669b7
Step 7/14 : ENV APACHE_RUN_USER www-data
---> Running in 9ec982161d2d
Removing intermediate container 9ec982161d2d
---> 548e324848d6
Step 8/14 : ENV APACHE_RUN_GROUP www-data
---> Running in 1cf084f71b1b
Removing intermediate container 1cf084f71b1b
---> db0461896c00
Step 9/14 : ENV APACHE_LOG_DIR /var/log/apache2
---> Running in e2bdf40d1f4b
Removing intermediate container e2bdf40d1f4b
---> bbbde0ba0289
Step 10/14 : ENV APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
---> Running in 2277820a5e13
Removing intermediate container 2277820a5e13
---> af92b486cafb
Step 11/14 : ENV APACHE_LOCK_DIR=/var/lock/apache2
---> Running in 6e667a32abdb
Removing intermediate container 6e667a32abdb
---> b85b2b568744
Step 12/14 : RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR
---> Running in 8c0031a631cb
Removing intermediate container 8c0031a631cb
---> 106b4813eef0
Step 13/14 : EXPOSE 80
---> Running in 09712f52ce38
Removing intermediate container 09712f52ce38
---> 4364dd9cefa9
Step 14/14 : CMD ["apache2","-DFOREGROUND"]
---> Running in ffb9e1dda041
Removing intermediate container ffb9e1dda041
---> 4464cfdff2c6
Successfully built 4464cfdff2c6
Successfully tagged ubuntu:apachev1.0
上のコマンドでは、ubuntu:apachev1.0という名前のDockerイメージをビルドしています。
以下のコマンドでリストアウトできます。
docker images
出力します。
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu apachev1.0 4464cfdff2c6 36 seconds ago 254MB
ubuntu 16.04 7aa3602ab41e 10 days ago 115MB
httpd <none> 74ad7f48867f 9 months ago 177MB
次に、「regyserver:portnumber/image name:tag」形式でdockerイメージの名前を変更する必要があります。
生成されたイメージの名前を変更するには、以下のコマンドを使用します。
docker tag ubuntu:apachev1.0 registry-server:5000/ubuntu:apachev1.0
では、以下のコマンドで再度検証してみましょう。
docker images
出力します。
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu apachev1.0 4464cfdff2c6 About a minute ago 254MB
registry-server:5000/ubuntu apachev1.0 4464cfdff2c6 About a minute ago 254MB
ubuntu 16.04 7aa3602ab41e 10 days ago 115MB
httpd <none> 74ad7f48867f 9 months ago 177MB
#レジストリサーバにDockerイメージをアップロードする
これで、レジストリクライアント上にDockerイメージの準備ができました。起動する前に、レジストリサーバからレジストリクライアントにca.crt証明書をコピーする必要があります。
レジストリクライアントのインスタンスに移動して、以下のコマンドを実行します。
mkdir -p /etc/docker/certs.d/registry-server:5000
scp root@registry-server:/etc/certs/ca.crt /etc/docker/certs.d/registry-server/
ここで、以下のコマンドでdockerサービスを再起動します。
systemctl restart docker
次に、以下のコマンドでプライベートレジストリサーバにdockerイメージをアップロードします。
docker push registry-server:5000/ubuntu:apachev1.0
出力します。
The push refers to repository [registry-server:5000/ubuntu]
1e2d2004eac5: Pushed
90c9e108cca6: Pushed
6ad516d3083c: Pushed
bcff331e13e3: Pushed
2166dba7c95b: Pushed
5e95929b2798: Pushed
c2af38e6b250: Pushed
0a42ee6ceccb: Pushed
apachev1.0: digest: sha256:a644ec3477b8616d2956b3254cd67bebb08ded68dce25a9f4a773de1dfae122b size: 1988
また、以下のコマンドを使って、アップロードした画像をレジストリサーバーからダウンロードすることもできます。
docker pull registry-server:5000/ubuntu:apachev1.0
出力します。
apachev1.0: Pulling from ubuntu
8ee29e426c26: Pull complete
6e83b260b73b: Pull complete
e26b65fd1143: Pull complete
40dca07f8222: Pull complete
b420ae9e10b3: Pull complete
17cc14b524da: Pull complete
a672de99207d: Pull complete
28fef3b105af: Pull complete
Digest: sha256:a644ec3477b8616d2956b3254cd67bebb08ded68dce25a9f4a773de1dfae122b
Status: Downloaded newer image for registry-server:5000/ubuntu:apachev1.0
おめでとうございます。これでUbuntu 16.04でDockerのプライベートレジストリサーバのセットアップが完了しました。これで、レジストリサーバーへのDockerイメージのアップロードやダウンロードが簡単にできるようになりました。
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ