ここまで一つのコンテナを動かす方法を学んできました。
実際にサービスを動かす場合には、一つのコンテナでは足りない場合があります。(Webアプリ + データベース、など)
複数のコンテナを連携させるには、 docker compose を使うのが簡単で一般的です。
docker composeとは
- docker-compose.ymlという設定ファイルに、複数コンテナをどう設定・連携するか記述して、管理できる
- docker-compose upコマンドで設定ファイルで記述したとおりにコンテナが立ち上がる
現在、 The Compose Specification に記述されている。以下の文章を読むと
- docker-compose.yamlではなく、compose.yamlを使うのが良さそうです。
- versionの記述も非推奨になっているので記述する必要はない。
The Compose file is a YAML file defining version (DEPRECATED), services (REQUIRED), networks , volumes , configs and secrets .
The default path for a Compose file iscompose.yaml
(preferred) orcompose.yml
in working directory. Compose implementations SHOULD also supportdocker-compose.yaml
anddocker-compose.yml
for backward compatibility. If both files exist, Compose implementations MUST prefer canonicalcompose.yaml
one.
composeの機能
単一ホスト上で複数の環境を分離
composeはプロジェクト名というもので各環境を分離できる。
- 開発環境で機能追加ブランチごとに安定版のコピーを実行できる
- CIサーバ上ではお互いのビルドが干渉しないようにプロジェクト名にユニークなビルド番号を設定できる
- 異なるプロジェクトが同じサービス名を使わないようにしてくれている
プロジェクト名はデフォルトだとプロジェクトが存在するディレクトリ名となる。プロジェクト名を指定するにはコマンドラインで
-p
を指定するか環境変数で指定する。
ディレクトリが同じならcomposeがよしなにやってくれる。
コンテナ作成時にボリューム・データの保持
composeはサービスによって利用されているボリューム(データのこと)を全て保護する。
composeが起動したときコンテナが以前実行されていたものであれば以前のコンテナからボリュームをコピーする。
つまり、 前と同じ状態で起動するのが保証されている。
変更のあったコンテナのみ再生成
composeはコンテナが生成された時の設定情報をキャッシュに保存する。設定内容に変更のないサービスが再起動された場合composeはすでにあるサービスを再利用する。
こちらも先ほど言ったように、前と同じ状態で起動するのが保証されている。
環境間での変数の共有
composeはcomposeファイル内で変数の使用をサポートしている。環境変数を使って別々の環境やユーザー向けに構成をカスタマイズできる。
composeの利用方法
DockerやDocker Composeは確かに便利だが、 それらがないとアプリが動かないという状態は良くない 。
なぜならDockerやDocker Composeはあくまでも起動する環境を簡単にセットアップできるものである。そのため環境が用意できているのならそれらがなくてもアプリは動くはずである。
そういった理由で 本番ではあまり利用しない 。
compose.yml
- yamlで書かれている
-
メリット
-
Dockerは
docker container run —network ...
など長くなりがちなコマンドをファイルとして保存できて保守性が上がる - コンテナ間通信などが簡単に行える
-
Dockerは
-
デメリット
- エラートレースが難しくなる
- Dockerやcomposeがログトレースを難しくしているためエラーの本質に気づけなくなる
コマンドの説明
Command | 説明 |
docker compose up
| サービス用のコンテナの構築、作成、起動、アタッチを行う。 |
docker compose down
|
コンテナを停止し、
up
で作成したコンテナ・ネットワーク・ボリューム・イメージを削除します。デフォルトではコンテナとネットワークのみ削除します。
|
docker compose build
| yamlからコンテナを構築する |
docker compose start
| コンテナを起動してサービスを開始する |
-
docker compose up
はdocker compose build
・docker compose start
をまとめたもの- デフォルトでは再ビルドしないなど挙動が少しだけ違うので注意
docker-compose
コマンドが使われていたが、現在は非推奨
https://www.docker.com/blog/announcing-compose-v2-general-availability/#proposed-compose-v1-end-of-lie-timeline