Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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-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

docker-compose公式ドキュメント

こちらもどうぞ!

y_hokkey
1988年生まれ。多摩美グラフィックデザイン学科を中退。デザイナーとしてグラフィック・エディトリアル・Web・UIのデザインを経験した後、Webフロントエンドエンジニアも経験。現在はITコンサルタントとして外資系SIerに在籍中。元LIG社員。※投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
http://media-massage.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした