Dockerのリンク機能を使って他のコンテナの情報を取得する

Dockerには、コンテナ内から他のコンテナの情報を取得する仕組みがあります。

データベース用コンテナのIPアドレスを取得する例

この仕組を利用すると、PostgreSQLなどのデータベースのコンテナに簡単に接続することができます。

今回はPostgreSQLのオフィシャルイメージを利用します。

まず、接続先となるデータベースのコンテナを起動します。 このとき、--nameフラグで名前を付けておきます。

$ docker run --name sample_db -d postgres

次に、接続元となるコンテナを、--linkフラグを付けて起動します。

$ docker run --rm -it --link sample_db:db postgres sh -c 'psql -h $DB_PORT_5432_TCP_ADDR -U postgres'

こうすることで、PostgreSQLを起動したsample_dbコンテナのIPアドレスが環境変数DB_PORT_5432_TCP_ADDRで参照できるようになります。

コンテナのリンク

コンテナをリンクすることによって、コンテナ内からリンク先のコンテナの情報を環境変数経由で取得できます。

--linkフラグに渡す値は、:の左側がリンク先のコンテナ名で、右側が環境変数のプレフィックスになります。 --link sample_db:hogeとすれば、HOGE_PORT_5432_TCP_ADDRという名前になります。

IPアドレス以外に、ポート番号やプロトコル、Dockerfile内で定義された環境変数を参照することができます。(postgresイメージのDockerfile)

$ docker run --rm -t --link sample_db:alias ubuntu env | grep ALIAS_ | sort
ALIAS_ENV_LANG=en_US.utf8
ALIAS_ENV_PGDATA=/var/lib/postgresql/data
ALIAS_ENV_PG_MAJOR=9.3
ALIAS_ENV_PG_VERSION=9.3.5-1.pgdg70+1
ALIAS_NAME=/distracted_sinoussi/alias
ALIAS_PORT=tcp://172.17.0.2:5432
ALIAS_PORT_5432_TCP=tcp://172.17.0.2:5432
ALIAS_PORT_5432_TCP_ADDR=172.17.0.2
ALIAS_PORT_5432_TCP_PORT=5432
ALIAS_PORT_5432_TCP_PROTO=tcp

設定ファイルをsedなどで書き換えてからアプリケーションを起動するようなスクリプトを用意してEntrypointに設定すれば、簡単に接続先データベースを切り替えることができます。

また、設定ファイルに環境変数をそのまま指定できるようなアプリケーションであれば、わざわざスクリプトを用意するまでもありません。

MySQLのオフィシャルイメージでも同様に接続することができます。

補足

PostgreSQLのオフィシャルイメージを使う場合、/var/lib/postgresql/dataPGDATAとなります。

次のように、-vオプションを用いてデータを永続化しましょう。

$ sudo mkdir -p /srv/docker-volumes/sample_db-pgdata
$ docker run --name sample_db  -v /srv/docker-volumes/sample_db-pgdata:/var/lib/postgresql/data -d postgres

参考