🚀 ニフティ’s Notion

docker compose

ここまで一つのコンテナを動かす方法を学んできました。

実際にサービスを動かす場合には、一つのコンテナでは足りない場合があります。(Webアプリ + データベース、など)

複数のコンテナを連携させるには、 docker compose を使うのが簡単で一般的です。

docker composeとは 

  • docker-compose.ymlという設定ファイルに、複数コンテナをどう設定・連携するか記述して、管理できる
  • docker-compose upコマンドで設定ファイルで記述したとおりにコンテナが立ち上がる
image block
⚠️
compose fileの最新仕様について

現在、 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 is  compose.yaml  (preferred) or  compose.yml  in working directory. Compose implementations SHOULD also support  docker-compose.yaml  and  docker-compose.yml  for backward compatibility. If both files exist, Compose implementations MUST prefer canonical  compose.yaml  one.
composeの機能

単一ホスト上で複数の環境を分離

composeはプロジェクト名というもので各環境を分離できる。

  • 開発環境で機能追加ブランチごとに安定版のコピーを実行できる
  • CIサーバ上ではお互いのビルドが干渉しないようにプロジェクト名にユニークなビルド番号を設定できる
  • 異なるプロジェクトが同じサービス名を使わないようにしてくれている

プロジェクト名はデフォルトだとプロジェクトが存在するディレクトリ名となる。プロジェクト名を指定するにはコマンドラインで -p を指定するか環境変数で指定する。

ディレクトリが同じならcomposeがよしなにやってくれる。

コンテナ作成時にボリューム・データの保持

composeはサービスによって利用されているボリューム(データのこと)を全て保護する。
composeが起動したときコンテナが以前実行されていたものであれば以前のコンテナからボリュームをコピーする。

つまり、 前と同じ状態で起動するのが保証されている。

変更のあったコンテナのみ再生成

composeはコンテナが生成された時の設定情報をキャッシュに保存する。設定内容に変更のないサービスが再起動された場合composeはすでにあるサービスを再利用する。

こちらも先ほど言ったように、前と同じ状態で起動するのが保証されている。

composeは便利だが、必要ない情報もキャッシュされることがあるので、怪しかったらbuildやpruneを行う。
環境間での変数の共有

composeはcomposeファイル内で変数の使用をサポートしている。環境変数を使って別々の環境やユーザー向けに構成をカスタマイズできる。

composeの利用方法

DockerやDocker Composeは確かに便利だが、 それらがないとアプリが動かないという状態は良くない

なぜならDockerやDocker Composeはあくまでも起動する環境を簡単にセットアップできるものである。そのため環境が用意できているのならそれらがなくてもアプリは動くはずである。

そういった理由で 本番ではあまり利用しない

compose.yml


  • yamlで書かれている
  • メリット
    • Dockerは docker container run —network ... など長くなりがちなコマンドをファイルとして保存できて保守性が上がる
    • コンテナ間通信などが簡単に行える
  • デメリット
    • エラートレースが難しくなる
    • 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 をまとめたもの
    • デフォルトでは再ビルドしないなど挙動が少しだけ違うので注意
⚠️
compose v1では、 docker-compose コマンドが使われていたが、現在は非推奨
https://www.docker.com/blog/announcing-compose-v2-general-availability/#proposed-compose-v1-end-of-lie-timeline