Dockerを学んでいると、docker-compose(ハイフンあり)とdocker compose(スペースあり)の2つの書き方を目にして「どっちが正しいの?」と混乱した経験はありませんか?
ネット上の記事やチュートリアルでも両方の表記が混在しており、初心者にとっては非常にわかりにくいポイントです。この記事では、この2つの違いを明確に解説し、今後どちらを使えばよいかをはっきりさせます。
結論:docker-compose はV1、docker compose はV2
先に結論をお伝えします。
docker-compose(ハイフンあり)→ Docker Compose V1(Python製の単体ツール)docker compose(スペースあり)→ Docker Compose V2(Go製のDocker CLIプラグイン)
⚠️ V1は2023年7月に完全にサポート終了(EOL)しました。現在はdocker compose(V2)を使うのが正解です。古い記事やチュートリアルでdocker-composeと書かれている場合は、docker composeに読み替えて問題ありません。
V1とV2の違いを比較
Docker Compose V1とV2の主な違いを表にまとめました。
| 項目 | V1(docker-compose) | V2(docker compose) |
|---|---|---|
| コマンド形式 | docker-compose(ハイフン) |
docker compose(スペース) |
| 実装言語 | Python | Go |
| インストール形態 | 単体の実行ファイル | Docker CLIプラグイン |
| 推奨ファイル名 | docker-compose.yml |
compose.yml |
| パフォーマンス | 遅い(Python起動コストあり) | 高速(Goのネイティブバイナリ) |
| Docker CLIとの統合 | なし(別ツール) | あり(dockerコマンドのサブコマンド) |
| サポート状況 | ✅ 2023年7月にEOL | ✅ 現在のメイン |
V2はGoで書き直されたことにより、起動速度やビルド速度が大幅に改善されています。また、Docker CLIのプラグインとして統合されたことで、dockerコマンドの一部として自然に使えるようになりました。
V1→V2 コマンド対応表
基本的にはハイフンをスペースに変えるだけで、ほとんどのコマンドがそのまま使えます。
| V1(docker-compose) | V2(docker compose) |
|---|---|
docker-compose up |
docker compose up |
docker-compose down |
docker compose down |
docker-compose build |
docker compose build |
docker-compose ps |
docker compose ps |
docker-compose logs |
docker compose logs |
docker-compose exec |
docker compose exec |
docker-compose run |
docker compose run |
docker-compose stop |
docker compose stop |
💡 移行のポイント
V1からV2への移行は、基本的にdocker-composeをdocker composeに置き換えるだけでOKです。ただし、一部のオプションの挙動が微妙に変わっているケースがあるため、CI/CDパイプラインなどで使っている場合は事前に動作確認をしておくと安心です。
compose.yml と docker-compose.yml どちらを使うべき?
Docker Compose V2では、定義ファイルの推奨名が変わりました。
- 推奨:
compose.yml(またはcompose.yaml) - 後方互換:
docker-compose.yml(docker-compose.yaml)も引き続き読み込まれる
V2ではcompose.ymlが公式の推奨ファイル名です。ただし、docker-compose.ymlも後方互換として引き続きサポートされているため、既存プロジェクトで無理にリネームする必要はありません。
💡 ファイル名の優先順位
同じディレクトリにcompose.ymlとdocker-compose.ymlの両方が存在する場合、compose.ymlが優先的に読み込まれます。新規プロジェクトではcompose.ymlを使うようにしましょう。
実際のファイルの書き方は変わりません。中身はまったく同じフォーマットです。
# compose.yml の例
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
「version」フィールドはもう不要
V1時代のdocker-compose.ymlでは、ファイルの先頭にversionフィールドを記述するのが一般的でした。
# V1時代の書き方
version: "3.8"
services:
web:
image: nginx:latest
しかし、Docker Compose V2ではこのversionフィールドは不要になりました。記述しても動作はしますが、以下のような警告が表示されます。
WARN[0000] C:\path\to\compose.yml: the attribute `version` is obsolete, it will be ignored.
これは「versionフィールドは廃止されました。無視されます」という意味です。V2ではComposeファイルのフォーマットを自動的に判別してくれるため、バージョンを明示する必要がなくなりました。
⚠️ 警告が出ても慌てないで
この警告はエラーではなく、あくまで「不要ですよ」というお知らせです。version行を削除すれば警告は消えます。古いテンプレートやチュートリアルからcompose.ymlを作成した場合は、version行を削除しておきましょう。
# V2での推奨の書き方(versionなし)
services:
web:
image: nginx:latest
ports:
- "8080:80"
まとめ
この記事のポイントを整理します。
docker-compose(ハイフン)はV1、docker compose(スペース)はV2- V1は2023年7月にサポート終了。今後は
docker compose(V2)を使う - コマンドの移行はハイフンをスペースに変えるだけでほぼOK
- 定義ファイルの推奨名は
compose.yml(docker-compose.ymlも引き続き使える) versionフィールドはV2では不要。書くと警告が出る
Dockerの基本コマンドをもっと学びたい方は「Docker主要コマンド一覧」もあわせてご覧ください。また、Dockerを体系的に学びたい方は「Docker完全攻略ページ」をチェックしてみてください。


コメント