Docker Compose とは？ 使うメリットと設定方法を徹底解説

![Docker Compose タコ](https://camo.qiitausercontent.com/31e6f94f56ac267b29d5ca81a86e07ad7a88e0a4/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3132393231362f30626337366236622d613031392d323435302d633566612d3739363030333564663537662e706e67)

(※ 複数のコンテナを司るタコの図。クジラより弱そう、、、)

最近よく耳にする、「**Docker Compose**」についてまとめてみました。

Docker は知っているけど、Docker Compose はよく分からないという人は見ていっていただければ幸いです。

この記事では以下の点についてまとめています。

**1\. Docker Compose とは？**
**2\. 使うと何がうれしいの？**
**3\. Compose ファイルの構成と記述方法**
**4\. バージョン1系と2系の違い**

それでは早速見ていきましょう！

## 1\. Docker Compose とは？

一言で表すと、「**複数のコンテナを一括管理し、docker コマンドでいちいち入力していたオプション指定などを全部肩代わりしてくれる便利ツール**」です。

こうやって書くと意外と難しくないですよね！

つまり、得られる結果としては 「Docker コマンド」と「Docker Compose コマンド」は一緒ということになります。しかし、その手順を大幅に簡略化・自動化してくれるのが Docker Compose です。

すでに Docker をある程度理解している方であれば、すぐに使い始められるのではないでしょうか？

## 2\. 使うと何がうれしいの？

そんな Docker Compose ですがどんなメリットがあるのでしょうか？

[Docker 公式ドキュメント](https://docs.docker.com/compose/intro/features-uses/#key-benefits-of-docker-compose)では以下の点が挙げられています。

#### 1\. シンプルさ

１つの YAML ファイルで複数コンテナの定義・管理ができます。これにより、docker CLI で指定していた冗長な引数から解放され、コンテナ間の連動も容易になります

#### 2\. 共有の簡単さ

Docker Compose の設定ファイルは共有が簡単なので、チームのメンバー間で環境を揃えたいときは非常に便利です。「〇〇さんの環境では動くのに...」という問題を解決できます

#### 3\. コンテナの再利用

コンテナの作成に使用された構成をキャッシュします。変更されていないサービスを再起動すると、Compose は既存のコンテナを再利用します

#### 4\. 一貫性

Compose ファイル内では変数を使用できます。これにより、開発・本番・テストといった異なる環境やユーザー向けに設定をカスタマイズしても、一貫した動作が可能になります。環境ごとに異なる設定を手動で変更する手間が省けます

## 3\. Compose ファイルの構成と記述方法

Compose ファイルでは**サービス・ネットワーク・ボリューム**の３つを定義します。

Webサーバーとデータベースサーバーの2つのコンテナを定義した Compose ファイルの例を見ながらそれぞれについて見ていきましょう。

#### 1\. サービス

1つひとつのコンテナのことです。以下の例の場合、web と db に当たります。
Docker Compose においてサービスとは、コンテナのことだと言い換えて、問題ありません。

```yml
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example
```

それぞれのサービスでは、多数のオプションを用いて独自の設定を記述することができます。
サービス以下のオプションについては別の記事でまとめようと思います。

#### 2\. ネットワーク

コンテナ間の通信のために、サービスが参加するネットワークのことです。

```yml
services:
  web:
    image: nginx
    networks:
      - mynetwork
  db:
    image: postgres
    networks:
      - mynetwork

networks:
  mynetwork:
```

例では mynetwork という名前のネットワークを作成し、それぞれのサービスがネットワークに属するように指定しましたが、省略することもできます。

**Docker Compose では明示的にネットワークを指定しなかった場合、自動的にデフォルトのネットワークが作成され、すべてのサービスをそのネットワークに接続するように構成します。**

したがって明示的にネットワークを指定する必要はあまりなく、指定が省略されることのほうが多いです。

#### 3\. ボリューム

データを永続化するために、サービスが利用するボリュームを定義します。

```yml
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:
```

一般には上記の例のように、「-v オプション」形式が用いられますが、より詳細に設定したい場合、「--mount オプション」の形式で書くこともできます。

それぞれの違いや書式については以前記事にしたのでよろしければご覧ください。

https://qiita.com/Teradad41/items/45ac69aec0d103398e1d

## 4\. バージョン1系と2系の違い

Docker Compose には V1系とV2系が存在し、いくつかの違いがあります。

V1 は2023年にサポートが終了しているため、今後使う機会はないでしょう。
よってここでは V2 の Docker Compose 使う場合知っておくべきことについて見ていきます。

:::note info
2014年にリリースされた V1 は Python、2020年にリリースされた V2 は Go で実装されているそうです。
:::

### `docker-compose` VS `docker compose`
- Docker Compose CLI 上では V2 の `docker compose` コマンドが推奨されています
- docker と compose の間はハイフンではなくスペースを用いましょう

### Compose ファイルの命名
- V1 では docker-compose.yml が使われていましたが、V2 では compose.yml が推奨されています
- フォルダ内に docker-compose.yml と compose.yml が存在した場合、compose.yml が優先的にコンテナ作成に使用されます

### サービス名の命名
- サービス名が生成されるとき、V1 では（ _：アンダーバー）でしたが、V2 からは（ -：ハイフン）に変更されています
- DNS においてアンダーバーが有効な文字ではないことが理由だそうです

## 参考

- Docker Compose 公式ドキュメント

https://docs.docker.com/compose/

- Docker Compose 日本語ドキュメント

https://docs.docker.jp/compose/toc.html

- さわって学ぶクラウドインフラ　docker基礎からのコンテナ構築

https://amzn.asia/d/1bYdP5A

- Docker&仮想サーバー完全入門　Webクリエイター＆エンジニアの作業がはかどる開発環境構築ガイド

https://amzn.asia/d/4LGMoLI