blog.nambo.jp

Dokcerのコンテナ間リンクの方法 WordPressコンテナとMySQLコンテナをリンクさせてみる

Dockerの運用では、1プロセス1コンテナが基本ですが、複数コンテナを連携させるにはどうすればよいでしょうか?

例えば、WordPressを立ち上げるとすると、WordPress本体を動かすコンテナとMySQLなどのデータベースコンテナ、ApacheやNginxなどのWebサーバコンテナを別に用意する場合もあるでしょう。

WordPressでは、wp-config.phpにDBの接続情報を記述しますが、例えばhostの部分はデフォルトではlocalhostになっています。

wp-config.php
1
define('DB_HOST', 'localhost')

ここにMySQLコンテナのIPを記述したいわけですが、どうすればいいでしょうか?

docker inspectなどでIPアドレスを調べることができますが、そこで調べた値をハードコードしてしまってはDockerのimmutableなメリットが失われてしまいます。

そこで、--linkオプションによるコンテナ間リンクです。

MySQLコンテナがmysqlという名前で既に立ち上がっているとします。
これにリンクする形でWordPressコンテナを立ち上げてみましょう。

--linkオプションで、リンク先のコンテナ名とエイリアス名を指定するだけです。
(imageは、WordPress入りのものをPullしてもいいですし、Dockerfileを使うなどしてもいいですが、ここではとりあえずcentos6をベースに立ち上げます。WordPressは各自インストールしてください。)

1
$ docker run -it -p 80 --link mysql:db --name wordpress centos:6 /bin/bash

--link mysql:dbで、あらかじめ立ち上げてあるmysqlというnameのコンテナをdbというaliasでリンクしています。

これにより、立ち上がったコンテナの環境変数にmysqlコンテナの情報がセットされます。
envを見てみるとちゃんとセットされていることが確認できます。
関連する項目を抜粋すると、以下の通り。

1
2
3
4
5
6
$ env
DB_PORT=tcp://172.17.0.1:3306
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_PORT_3306_TCP_ADDR=172.17.0.1
DB_PORT_3306_TCP=tcp://172.17.0.1:3306

これらの環境変数を参照することで、MySQLコンテナのIPなどをプログラム上で使うことができます。
さらに、/etc/hostsを見てみると…

/etc/hosts
1
2
3
4
5
6
7
8
172.17.0.2  abc0123def45
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.1  db

こちらにも情報がセットされています!
これでWordPressのwp-config.phpの記述も簡単です。

wp-config.php
1
define('DB_HOST', 'db')

これだけ!
以上、Dockerのコンテナ間リンクの簡単な説明でした。