docker-compose

Docker Composeで依存コンテナを楽に管理する

昨日の記事までで簡単なDockerコンテナを組み合わせた開発環境の構築はできました。
しかし、その時に書いたようにいろんなオプションをつけた状態で毎回一つ一つrunするのは面倒すぎるし、お互いを参照させるためには起動の順番などに依存関係があるので気をつける必要がありました。

そんな時は、Docker Composeを使えば簡単解決!!

Docker Composeってなに?

簡単に言えば、前回の記事で起動させた一つ一つのコンテナの起動条件をすべてdocker-compose.yamlというyamlファイルにまとめて実行するものです。

Dockerfileが各サーバプロセスの設計書だとすれば、docker-compose.yamlはサーバアプリケーションの設計書のようなものです。

復習

前回のdocker runのオプションを復習してみます。

PostgreSQL

$ docker run -d -p 5432:5432 --name postgresql test/postgresql

php-phalcon

$ docker run -d -v /Users/abe/dockers/www:/var/www --link postgresql:db --name phalcon  test/phalcon

nginx

$ docker run -d -v /Users/abe/dockers/www:/var/www --name nginx -p 80:80 -v /Users/abe/dockers/conf/phalcon_nginx.conf:/etc/nginx/sites-enabled/default --volumes-from phalcon nginx

docker-compose.yaml

これらのオプションをyamlにまとめます。書き方はほぼそのままなのでわかりやすいと思います。

# postgres 公式イメージに変更しました
postgresql:
  image: postgres:9.5
  ports:
    - "5432:5432"
  environment:
    POSTGRES_USER: docker
    POSTGRES_PASSWORD: docker
    POSTGRES_DB: docker

# php-phalcon
phalcon:
  build: ./php-phalcon-fpm
  volumes:
    - /Users/abe/dockers/www:/var/www
  links:
    - postgresql:db

# nginx
nginx:
  build: ./nginx
  volumes:
    - /Users/abe/dockers/www:/var/www
    - /Users/abe/dockers/conf/phalcon_nginx.conf:/etc/nginx/sites-enabled/default
  volumes_from:
    - phalcon
  ports:
    - "80:80"

1点、PostgreSQLについては公式イメージを使うように変更してみました。environmentという設定で環境変数の設定ができます。

ちなみにどうやってrunの際にデータベースのユーザやパスワードを変更しているかというと、Dockerfileの最後でENTRYPOINT命令にシェルスクリプトを指定し、その内部でデータベースの初期化を行っています。そこで環境変数を受け取って処理しているというわけです。

コンテナをまとめて処理

それでは、実際に起動してみましょう。その前に、前回のコンテナが起動中でしたらstopしておいてください(ポート番号が競合します)。

$ docker-compose up -d

初回はpostgresイメージをダウンロードするので時間がかかりますが、次回からは一瞬でコンテナたちが起動すると思います。

止める時は...

$ docker-compose stop

また、コンテナを削除するには...

$ docker-compose rm

stop+rmを同時にやる場合は

$ docker-compose down

簡単ですね!

おわりに

とりあえず個人的に勉強しておきたい部分はひとまず終わりです。
また機会があれば、いろんな開発環境のDockerfileやdocker-compose.yamlを作ってみたいです。

LINEで送る
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です