docker-composeを使うと複数コンテナの管理が便利に

  • 669
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

docker-composeを使うと、複数のコンテナから構成されるサービスを従来よりも簡単に管理できるようになる。

dockerだけで管理する場合の不便さ

たとえば dockerだけでmysqlとgitbucket・redmine・リバースプロキシ(nginx)を立ち上げる場合には、次のようなコマンドをシェルスクリプト化しておく必要があった。linkオプションがあるので、コンテナの立ち上げ順序も気にしなればいけない。

構成図

run.sh
# 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のオプションと対応しているので、特に難しいところはない。

docker-compose.yml
# 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-copose.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

docker-compose公式ドキュメント

こちらもどうぞ!