docker-composeを使うと、複数のコンテナから構成されるサービスを従来よりも簡単に管理できるようになる。
dockerだけで管理する場合の不便さ
たとえば dockerだけでmysqlとgitbucket・redmine・リバースプロキシ(nginx)を立ち上げる場合には、次のようなコマンドをシェルスクリプト化しておく必要があった。linkオプションがあるので、コンテナの立ち上げ順序も気にしなればいけない。
# mysql
docker run --name mysql \
-d \
-p 3306:3306 \
--volumes-from data-mysql \
-e 'MYSQL_ROOT_PASSWORD=password' \
mysql
# redmine
docker run --name redmine \
-d \
--link mysql:mysql \
--volumes-from data-redmine \
--volumes-from data-gitbucket \
-e 'REDMINE_RELATIVE_URL_ROOT=/redmine' \
-e 'DB_USER=redmine' \
-e 'DB_NAME=redmine' \
-e 'DB_PASS=password' \
-e 'SMTP_USER=address@hoge.com' \
-e 'SMTP_PASS=password' \
sameersbn/redmine:2.6.3
# gitbucket
docker run --name gitbucket \
-d \
-p 29418:29418 \
--volumes-from data-gitbucket \
f99aq8ove/gitbucket \
java -jar /opt/gitbucket.war --prefix=/gitbucket
# reverse-proxy
# あらかじめ myname/proxy でイメージをビルドしておく
docker run --name proxy
-d \
--link redmine:redmine
--link gitbucket:gitbucket
-p 80:80 \
myname/proxy
終了や再起動も1つ1つコンテナの名前を指定して行うので、コンテナが増えてくると管理が面倒になってくる。
# まとめて終了
docker stop gitbucket
docker stop redmine
docker stop mysql
docker stop proxy
# まとめて削除
docker rm gitbucket
docker rm redmine
docker rm mysql
docker rm proxy
docker-composeを使用した場合の便利さ
docker-composeを導入すると、先程の構成を次のようなYAMLファイルで管理できる。YAMLファイルの書式はほぼdocker runのオプションと対応しているので、特に難しいところはない。
# mysql
mysql:
image: mysql
volumes_from:
- data-mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
# redmine
redmine:
image: sameersbn/redmine:2.6.3
volumes_from:
- data-gitbucket
- data-redmine
links:
- mysql:mysql
environment:
REDMINE_RELATIVE_URL_ROOT: /redmine
DB_USER: redmine
DB_PASS: password
SMTP_USER: address@hoge.com
SMTP_PASS: password
# gitbucket
gitbucket:
image: f99aq8ove/gitbucket
volumes_from:
- data-gitbucket
ports:
- "29418:29418"
command: java -jar /opt/gitbucket.war --prefix=/gitbucket
# reverse-proxy
proxy:
build: myproxy
links:
- gitbucket:gitbucket
- redmine:redmine
ports:
- "80:80"
ディレクトリ構成は次のようにする。
myservices
├─ docker-compose.yml
└─ myproxy
└─ Dockerfile
docker-compose.yml
と同じ階層に移動してdocker-compose up -d
をすると、ビルド・プルを自動で行ってから、linksの依存関係に沿った順番でコンテナを起動してくれる。
# YAMLに「build:」があれば、そのイメージをまとめてビルド
docker-compose build
# YAMLに「image:」があれば、そのイメージをまとめてプル
docker-compose pull
# docker-compose build, docker-compose pullをした後にdocker run
docker-compose up -d
# 個別のサービスを指定することもできる。依存関係がある場合は関係するコンテナすべてが起動するので、この場合は redmine と mysql が両方起動する
docker-compose up -d redmine
# 関係するコンテナすべての出力を表示
docker-compose logs
# 関係するコンテナをまとめて終了
docker-compose stop
# 関係するコンテナをまとめて削除
docker-compose rm
筆者はこれまでdocker stopやdocker rmコマンドをまとめたシェルスクリプトを使用してサービスの管理を行っていたが、docker-composeでそのあたりの管理が明らかに楽になったと感じた。既にdockerを使っている人にとっては新たな知識もほとんど必要なく、docker-composeはdockerを使っていく上で必須のツールになっていくのではないかと思う。
OSXでCERTIFICATE_VERIFY_FAILEDと表示されてしまう場合
以下はDockerToolbox登場以前の情報です。最新のOSXとDocker Toolboxの構成であれば、特に問題なくdocker-composeが使用できました。
このチケットでの議論が参考になった。
https://github.com/docker/compose/issues/890
- opensslを適合するバージョンにする
- pythonのバージョンを適合するものにする
- docker-composeはpipからインストール
docker公式のシェルスクリプトを使うと、docker-composeが動作する環境にお膳立てしてくれる
https://github.com/docker/compose/blob/master/script/prepare-osx