Dockerのlink機能

前回までのまとめ

前回Docker実践ガイドの第5章のlinkオプションの説明を読んで環境構築をしようとしたところ、Dockerfileの記述方法をミスってしまい、環境構築まで到達できませんでした。

なんとかDB用コンテナが起動できたところまで進んだので、アプリケーションサーバ用コンテナの準備をしたいと思います。

DB用コンテナの確認

起動の確認

DB用コンテナが起動していることを確認します

1
2
3
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65b5af36d7ac centos:mariadb0001 "/mariadb.sh" 4 days ago Up 4 days 3306/tcp mariadb0001

起動オプションの確認

コンテナ起動オプションを確認します。

1
$ docker run -d -e DBNAME=testdb -e MARIADBUSER=root -e MARIADBPASSWORD=mysqlPassword -v /var/lib/mysql:/var/lib/mysql:rw --name mariadb0001 centos:mariadb0001

マウントしているディレクトリの確認

-vオプションで指定しているディレクトリを確認します。

1
2
3
4
5
6
$ ls /var/lib/mysql
65b5af36d7ac.pid ib_logfile1 mysql.sock
aria_log.00000001 ibdata1 performance_schema
aria_log_control ibtmp1 test
ib_buffer_pool multi-master.info
ib_logfile0 mysql

データファイルやログファイルなどが保存されています。コンテナが/var/lib/mysqlとして利用しているのがわかります。

アプリケーションサーバ用コンテナのビルド

DB用コンテナが起動していることがわかったので、次にアプリケーションサーバ用コンテナを準備します。
書籍に倣って、Mediawikiをインストールします。

Dockerfileの作成

Dockerfileは以下のようになっています。

1
2
3
4
5
6
7
8
9
FROM centos:7.5.1804
RUN yum remove -y php* && \
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \
yum install -y --enablerepo=remi,remi-php72 php php-mysqlnd php-mbstring php-xml httpd openssh-clients && \
curl -O https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz && \
tar xzvf /mediawiki-1.31.0.tar.gz -C /var/www/html/

WORKDIR /var/www/html
RUN ln -sf ./mediawiki-1.31.0 wiki && systemctl enable httpd

WORKDIRについてしっかり理解していなかったので、ドキュメントを参照しました。

ざっくりの理解だと、WORKDIRを宣言した後はそのディレクトリでRUN, CMD, ENTRYPOINT, COPY, ADDが実行されるということです。その名の通りworking directoryを指定しています。WORKDIRに関するベストプラクティスも記載されていました。コマンドを実行するたびにどこかのディレクトリに移動するのではなくWORKDIRからのパスで処理を実行しましょうということです。

イメージのビルド

Dockerfileの作成が終わったのでイメージをビルドします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ docker image build -f Dockerfile -t centos:mw0001 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos:7.5.1804
---> cf49811e3cdb
Step 2/4 : RUN yum remove -y php* && yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && yum install -y --enablerepo=remi,remi-php72 php php-mysqlnd php-mbstring php-xml httpd openssh-clients && curl -O https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz && tar xzvf /mediawiki-1.31.0.tar.gz -C /var/www/html/
---> Running in c808fb96ff1d

(中略)

Removing intermediate container c808fb96ff1d
---> 90815ed52b36
Step 3/4 : WORKDIR /var/www/html
---> Running in 5b4fdf6b5b97
Removing intermediate container 5b4fdf6b5b97
---> e535a272bbf0
Step 4/4 : RUN ln -sf ./mediawiki-1.31.0 wiki && systemctl enable httpd
---> Running in 9733db996f6f
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.
Removing intermediate container 9733db996f6f
---> 67b7fb3ff7d6
Successfully built 67b7fb3ff7d6
Successfully tagged centos:mw0001

無事イメージのビルドができました。

tarコマンドにvオプションを指定してしまったため、Mediawikiのファイル一覧が出力されてログが流れてしまった。vオプションはなしにした方がよさそうです。

アプリケーションサーバ用コンテナの起動

アプリケーションサーバ用コンテナを起動します。

1
$ docker container run -itd --tmpfs /tmp --tmpfs /run --mount type=bind,src=/sys/fs/cgroup,dst=/sys/fs/cgroup,readonly --stop-signal SIGRTMIN+3 -v /var/www/html --name mw0001 -h mw0001 --link mariadb0001:db0001 centos:mw0001 /sbin/init

オプションがたくさん指定されていますので、一つずつ見ていきます。

  • -i
    標準入力を利用します
  • -t
    ttyを利用します。こちらに書かれているように、シェルなどのインタラクティブなプロセスではttyを割り当てるために-itオプションを指定します。今回の場合は-dも指定しているため、-itdとなっています。
  • –tmpfs
    tmpfsを割り当てます。
  • –mount
    srcはホストOS上のディレクトリを指定するはずですが、今利用しているMacには/sys/fs/cgroupはありませんでした。後ほど詳しく調べます。
  • –stop-signal
    こちらの内容だと、コンテナ停止のためのシグナルを指定するオプションのようです。
  • -h
    コンテナのホスト名を指定します。
  • –link
    前回にも記載しましたが、コンテナを指定し、コロンの後のエイリアス名でをprefixにして環境変数にアクセスできるようになります。

アプリケーションサーバ用コンテナとDB用コンテナの連携確認

アプリケーションサーバ用コンテナの起動確認

起動していることを確認します

1
2
3
4
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4d1693a7981 centos:mw0001 "/sbin/init" 3 hours ago Up 3 hours mw0001
65b5af36d7ac centos:mariadb0001 "/mariadb.sh" 4 days ago Up 4 days 3306/tcp mariadb0001

環境変数の確認

環境変数を確認します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ docker container exec -it mw0001 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=mw0001
TERM=xterm
DB0001_PORT=tcp://172.17.0.3:3306
DB0001_PORT_3306_TCP=tcp://172.17.0.3:3306
DB0001_PORT_3306_TCP_ADDR=172.17.0.3
DB0001_PORT_3306_TCP_PORT=3306
DB0001_PORT_3306_TCP_PROTO=tcp
DB0001_NAME=/mw0001/db0001
DB0001_ENV_MARIADBUSER=root
DB0001_ENV_MARIADBPASSWORD=mysqlPassword
DB0001_ENV_DBNAME=testdb
HOME=/root

エイリアス名の大文字をprefixとした環境変数が取得できることがわかります。これらの環境変数を使ってDB用コンテナにアクセスすることができます。

hostsファイルの確認

次にhostsファイルを確認します

1
2
3
4
5
6
7
8
9
$ docker container exec -it mw0001 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 db0001 65b5af36d7ac mariadb0001
172.17.0.4 mw0001

DB用コンテナがhostsファイルに登録されているのがわかります。

まとめ

link機能を使うと

  • 他のコンテナの環境変数にアクセスできるようになる
  • 他のコンテナが/etc/hostsファイルに記載される

link機能は単体のホストOS上で複数のコンテナが連携する場合に有用です。Dockerにおける複数コンテナの連携の基本となっているのでしっかり理解したいです。