前回までのまとめ 前回 は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
-d バックグラウンドで実行します。公式ドキュメント
-e 環境変数を設定します。公式ドキュメント
-v ホストOSとコンテナで共有するパスを指定します。ホストOSのパス:コンテナのパス:マウントする時のオプションとなります。公式ドキュメント
–name 名前をつけます。この名前でコンテナを参照できるようになります。公式ドキュメント
マウントしているディレクトリの確認 -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における複数コンテナの連携の基本となっているのでしっかり理解したいです。