docker compose と docker-compose の違いとは?V1→V2の変更点を徹底解説

コラム

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-composedocker composeに置き換えるだけでOKです。ただし、一部のオプションの挙動が微妙に変わっているケースがあるため、CI/CDパイプラインなどで使っている場合は事前に動作確認をしておくと安心です。

compose.yml と docker-compose.yml どちらを使うべき?

Docker Compose V2では、定義ファイルの推奨名が変わりました。

  • 推奨compose.yml(またはcompose.yaml
  • 後方互換docker-compose.ymldocker-compose.yaml)も引き続き読み込まれる

V2ではcompose.ymlが公式の推奨ファイル名です。ただし、docker-compose.ymlも後方互換として引き続きサポートされているため、既存プロジェクトで無理にリネームする必要はありません。

💡 ファイル名の優先順位
同じディレクトリにcompose.ymldocker-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.ymldocker-compose.ymlも引き続き使える)
  • versionフィールドはV2では不要。書くと警告が出る

Dockerの基本コマンドをもっと学びたい方は「Docker主要コマンド一覧」もあわせてご覧ください。また、Dockerを体系的に学びたい方は「Docker完全攻略ページ」をチェックしてみてください。

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました