この記事は2024年に公開した内容を、現在のDocker Composeの状況に合わせて見直したものです。
docker-composeはCompose V1、docker composeはCompose V2以降で利用するコマンドです。
現在、Compose V1はメンテナンスされていないため、新しく利用する場合はdocker composeを使用します。
Docker Composeを使っていると、
docker-compose up
と
docker compose up
という2種類の書き方を見かけます。
「ハイフンがあるかないかだけ?」と思ったので、違いを整理します。
Docker Composeとは
Docker Composeは、複数のコンテナで構成されるアプリケーションを定義・実行するためのツールです。
Composeファイルに、
- services
- networks
- volumes
などを定義して、複数のコンテナをまとめて管理できます。
たとえば、
docker compose up
を実行すると、Composeファイルに定義したサービスを作成・起動できます。
docker-composeとdocker composeの違い
結論からいうと、
| コマンド | Compose |
|---|---|
docker-compose |
Compose V1 |
docker compose |
Compose V2以降 |
です。
Compose V1
Compose V1はPythonで実装された独立したツールで、
docker-compose
というコマンドで実行していました。
docker-compose up
docker-compose down
docker-compose ps
のように使います。
Compose V1は現在メンテナンスされておらず、Compose V2へ置き換えられています。
Compose V2
Compose V2ではDocker CLIに統合され、
docker compose
という形式になりました。
docker compose up
docker compose down
docker compose ps
となります。
つまり、
Compose V1
docker-compose up
↓
Compose V2以降
docker compose up
という変化です。
なぜハイフンがなくなった?
Compose V1では、docker-composeはDocker CLIとは別のコマンドでした。
docker
docker-compose
Compose V2ではDocker CLIのプラグインとして統合されたため、
docker compose
というDockerのサブコマンドとして実行する形になりました。
他のDockerコマンドと並べてみると分かりやすいです。
docker image
docker container
docker network
docker compose
単にコマンド名からハイフンを削除したわけではなく、Docker CLIへ統合されたことによる違いでした。
コンテナ名にも違いがあった
Compose V1からV2への移行では、生成されるコンテナ名の区切り文字にも変更がありました。
Compose V1では、
myproject_web_1
のようにアンダースコア(_)が使われていました。
Compose V2では、
myproject-web-1
のようにハイフン(-)が使われます。
これは、アンダースコアがDNSのホスト名として有効な文字ではないことなどを考慮した変更です。
Compose V2には、V1との互換性を考慮するための--compatibilityオプションもあります。
ただし、基本的にはV2以降の挙動を前提として移行する方がよさそうです。
Composeファイルのversionとの違い
ここで混乱しやすいのが、
version: "3.8"
など、Composeファイルに書かれていたversionです。
これは、
Compose V1 / V2
というCompose CLIのバージョンとは別の話です。
以前はComposeファイルにも、
2.x
3.x
などのファイルフォーマットのバージョンがありました。
現在はこれらがCompose Specificationへ統合されています。
そのため、現在のComposeではトップレベルのversionによってファイルフォーマットを選択する必要はありません。
services:
web:
image: nginx
のように記述できます。
Compose V2とversion: "2"は別のものです。
- Compose V2 → Compose CLIの世代
-
version: "2"→ 以前のComposeファイルフォーマット
と分けて考えると理解しやすいです。
現在はどちらを使う?
現在、新しくDocker Composeを利用する場合は、
docker compose
を使用します。
Compose V1の、
docker-compose
はメンテナンスが終了しています。
古い記事や既存プロジェクトではdocker-composeという記述を見ることがありますが、
docker-compose
↓
Compose V1時代のコマンド
docker compose
↓
現在利用するコマンド
と考えると分かりやすいです。
Compose V5は?
Docker Composeには2025年にCompose V5も登場しています。
ただし、Compose V5でもCLIのコマンドは、
docker compose
のままです。
Compose V5はCompose V2と機能的には同じで、大きな違いは公式のGo SDKが導入されたことです。
そのため、通常Docker Composeを利用するときに、
docker-compose
へ戻ったり、
docker compose5
のような新しいコマンドを使ったりするわけではありません。
まとめ
docker-composeとdocker composeの違いを整理すると、
docker-compose |
docker compose |
|
|---|---|---|
| 世代 | Compose V1 | Compose V2以降 |
| 実装 | Python | Go |
| Docker CLI | 独立したコマンド | Docker CLIに統合 |
| 現在 | メンテナンス終了 | こちらを使用 |
最初は、
docker-compose
docker compose
= ハイフンの有無だけ?
と思っていましたが、
Compose V1
独立したdocker-composeコマンド
↓
Compose V2以降
Docker CLIに統合
↓
docker compose
という経緯があることが分かりました。
古い記事を読むときにも、docker-composeが出てきたら「Compose V1の情報かもしれない」と意識しておくとよさそうです。