Docker-Composeについて

Last-modified: Tue, 20 Oct 2015 23:54:38 JST (666d)

複数のDockerコンテナを連携させたい場合があります。
たとえば、LAMP構成をとりたい場合、PostgreSQLサーバコンテナとApacheコンテナを使用します。
DockerにはLinkという、Dokcerコンテナ同士を結ぶ仕組みがあります。
しかし、まずPostgreSQLコンテナを起動し、次にApacheコンテナを起動となると、
起動するコンテナ数分docker runコマンドを実行しなければならず、コンテナの数が増えてくると、その管理が大変になります。
DockerComposeは、複数のDockerコンテナを管理するツールです。

DockerComposeのインストール

  • ここでは、Dockerをインストール済みCentOS7を前提にしています
  1. GitHubのリポジトリから最新をとってきて、実行権限を与えるだけで終了です。
    # curl -L https://github.com/docker/compose/releases/download/1.5.0rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    # chmod +x /usr/local/bin/docker-compose

使い方について

コマンドリファレンスyamlのリファレンスなどのリファレンスはこのあたり参照。

ここでは、Jenkins+Dockerを使用したCIサーバの作成で使用したDockerfileを使用し、PostgreSQLのコンテナと連携させます。
まず、docker-compose.ymlというファイルを作成し、Dockerファイルと同じディレクトリに配置します。
中身はほぼdockerコマンドで引数に指定するものを書いています。

postgres:セクションで、使用するDockerイメージとバージョンを指定しています。ここで書いたものがDockerHubよりDLされます。
exposeは、Dockerコンテナ内部の通信で使用するポート番号です。このポート番号はDocker同士の通信につかわれ、外部からはアクセスできません。
ちなみに外部(DockerホストサーバからDockerコンテナ内部のApacheにアクセスするなど)からアクセスしたい場合はportを使います。
environment:セクションでは、環境変数を設定しています。
Dockerコンテナ同士をlinkで連携させる場合、各コンテナ同士のやり取りは環境変数を経由して行われます。
ここでは、PostgreSQLコンテナが使用している環境変数(POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB)を使用し、
それぞれにPostgreSQLのユーザ、パスワード、データベース名をセットしています。
これをセットすることにより、PostgreSQLコンテナが起動する際、この環境変数を参照し、ユーザの作成、データベースの作成が行われます。(注:DockerHubにあがっている公式のPostgreSQLイメージの場合)

次に、連携元となる、PHP5.6環境のコンテナ設定になります。
ここでは、build:セクションで "."としていることから、カレントディレクトリに配置したDockerfileを使用し、コンテナを作成するようにしています。
複数のDockerコンテナを作成、連携したい場合は適当なディレクトリを作成し、それぞれにDockerfileを用意し、そのパスを指定すればいい。

links:セクションで、postgresという名前のコンテナに対し、dbというエイリアスをつけて連携させています。
このエイリアスは重要です。
PHP56というコンテナは、postgresコンテナに接続する必要がありますが、Dockerコンテナは、コンテナ起動時に動的にIPが割り当てられるため、
あらかじめ接続先IPアドレスを指定することが出来ません。
では、どうやってつなぐかというと、linkされたコンテナのIPアドレス情報などは環境変数にセットされることになっているので、これを利用します。
その環境変数は以下のルールで生成されます。

接続先IPアドレス:<エイリアス名>_POST_<ポート番号>_TCP_ADDR
接続先ポート番号:<エイリアス名>_PORT_<ポート番号>_TCP_PORT

ここのエイリアス名は、先ほどlinksセクションでつけたエイリアス名を大文字にしたものになります。

  • 実際起動したコンテナ内で環境変数を見ると分かるのですが、エイリアスをつけても元の名前の環境変数も設定されています。
    この環境変数をアプリケーションのDB接続情報で参照するようにセットしたり、たとえば以下のようにシェルで利用したりします。
    # PWなしてPostgreSQLに接続する為の準備
    echo $DB_PORT_5432_TCP_ADDR:5432:$DB_ENV_POSTGRES_DB:$DB_ENV_POSTGRES_USER:$DB_ENV_POSTGRES_PASSWORD > /root/.pgpass
    chmod 600 /root/.pgpass
    command:セクションやvolumes:セクションなどは、前回コマンドライン引数で指定したものと同じ意味です。

Jenkinsからキックする場合は以下のようなコマンドになります。

#前回こけた場合などでコンテナが残る場合があるのでいったん削除
docker-compose stop
docker-compose rm
docker-compose build
docker-compose up

ビルド後処理

docker-compose stop
docker-compose rm

なお、デバックなどでDockerコンテナ内に入りたい場合は、

docker-compose run php56 /bin/bash

とするとは入れます。終了はCtrl+C

  • ごみが残るので、不要なコンテナは削除しないと地味に容量を食います。

Counter: 826, today: 2, yesterday: 0

このページの参照回数は、826です。