「Docker Compose って、複数のコンテナを連携させるときに使うんでしょ?コンテナ1つだけなら、docker run コマンドで十分じゃないの?」

もしかしたら、あなたもそう思っていませんか? 実は、コンテナが1台であっても、Docker Compose を使うメリットは非常に大きいのです!

このブログ記事では、Docker Compose V2 (docker compose コマンド) を前提に、コンテナ1台でも Docker Compose を使うべき理由と、具体的なメリット、そして docker run からの移行方法まで、実践的な視点から詳しく解説します。

なぜ docker-compose ではなく docker compose なのか? (Compose V1 vs V2)

まず、少しだけコマンドの話をさせてください。以前は docker-compose (ハイフン付き) コマンドが使われていましたが、現在は docker compose (ハイフンなし) コマンドが推奨されています。

  • docker-compose (Compose V1): Python 製の古いバージョン。まだ使えますが、将来的にサポートが終了する可能性があります。
  • docker compose (Compose V2): Docker CLI に統合された新しいバージョン。Go 製で高速、Docker Desktop には標準搭載されています (Linux では docker-compose-plugin をインストール)。

この記事では、Compose V2 (docker compose) を前提として話を進めます。

コンテナ1台でも Docker Compose を使うべき3つの理由

それでは本題です。コンテナが1台でも Docker Compose を使うべき主な理由は、以下の3つです。

1. 設定の「見える化」と「再現性」: もう docker run の長い呪文は不要!

docker run コマンドは、オプションを駆使して様々な設定ができます。しかし、その反面、コマンドが非常に長くなりがちです。

Bash

docker run -d -p 8080:80 -v /my/host/data:/var/www/html -e DB_HOST=mydb -e DB_PASSWORD=secret --name my_web_container my_web_image

後からこのコマンドを見返して、「あれ、このコンテナ、どんな設定で動かしてたっけ…?」となることはありませんか?

Docker Compose なら、docker-compose.yml (または compose.yaml) というファイルに設定を記述します。

YAML

services:
  my_web_container:
    image: my_web_image
    ports:
      - "8080:80"
    volumes:
      - /my/host/data:/var/www/html
    environment:
      DB_HOST: mydb
      DB_PASSWORD: secret

どうでしょう?設定内容が一目瞭然ですよね!

この docker-compose.yml ファイルがあれば、

  • 誰が見ても設定内容がわかる
  • いつでも同じ環境を再現できる
  • チームメンバーや他の環境に簡単に共有できる

といったメリットがあります。

2. コマンドが圧倒的にシンプル: docker compose up だけで全てが完結!

docker run でコンテナを起動・停止するには、コンテナ名を指定したり、オプションを思い出したり…と、意外と手間がかかります。

Docker Compose なら、

  • 起動: docker compose up -d
  • 停止: docker compose down
  • 状態確認: docker compose ps
  • ログ確認: docker compose logs

など、非常にシンプルなコマンドで操作できます。-d オプションは、バックグラウンドで実行するためのものです。

もう、長い docker run コマンドを毎回入力する必要はありません!

3. 将来的な拡張性: いつコンテナが増えても慌てない!

今はコンテナ1台で十分でも、将来的にコンテナが増える可能性は十分にあります。

  • Web アプリ (コンテナ1) に、データベース (コンテナ2) を追加したい
  • 負荷分散のために、Web アプリのコンテナを複数起動したい

最初から Docker Compose を使っていれば、docker-compose.yml ファイルに新しいコンテナの定義を追加するだけで、簡単に対応できます。

YAML

services:
  web:
    image: my_web_image
    ports:
      - "8080:80"
    # ... (その他の設定)
  db: # データベースコンテナを追加!
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
    # ... (その他の設定)

docker run で個別にコンテナを管理していると、後から連携させるのは非常に大変です。

実践! docker run から Docker Compose へ移行しよう

「もうすでに docker run でコンテナを動かしちゃってるよ…」という方も、ご安心ください! 簡単に Docker Compose に移行できます。

1. 既存のコンテナの設定を確認

まずは、docker inspect コマンドで、現在実行中のコンテナの設定を確認しましょう。

Bash

docker inspect <コンテナ名またはID>

出力される JSON データの中から、以下の情報をメモしておきます。

  • Image (使用しているイメージ)
  • HostConfig.PortBindings (ポートフォワーディングの設定)
  • HostConfig.Binds (ボリュームマウントの設定)
  • Config.Env (環境変数の設定)

2. docker-compose.yml ファイルを作成

テキストエディタで docker-compose.yml (または compose.yaml) ファイルを作成し、先ほどメモした情報を基に、コンテナの設定を記述します。

YAML

services:
  <コンテナ名>: # 任意のコンテナ名
    image: <イメージ名>
    ports:
      - "<ホスト側ポート>:<コンテナ側ポート>"
    volumes:
      - "<ホスト側パス>:<コンテナ側パス>"
    environment:
      <環境変数名>: <値>
    # ... (その他の設定)

3. コンテナを起動・確認

docker-compose.yml ファイルがあるディレクトリで、以下のコマンドを実行します。

Bash

docker compose up -d

docker compose ps でコンテナが起動していることを確認し、ブラウザなどでアクセスして動作を確認しましょう。

(おまけ) kompose を使う方法

もし、docker inspect で設定を確認するのが面倒な場合は、kompose というツールを使うと、docker run コマンドから docker-compose.yml ファイルを自動生成できます。

ただし、kompose は完璧ではないので、生成されたファイルは必ず確認し、必要に応じて修正してください。

まとめ:コンテナ1台でも Docker Compose を使うべき!

  • 設定の「見える化」と「再現性」: docker-compose.yml で設定を一元管理し、環境構築を容易に。
  • シンプルなコマンド: docker compose up などの短いコマンドでコンテナを操作。
  • 将来的な拡張性: コンテナが増えても、docker-compose.yml を修正するだけで対応可能。

コンテナ1台だからといって、docker run にこだわる必要はありません。Docker Compose のメリットを最大限に活用し、より効率的で、そして何より 楽しい Docker ライフを送りましょう!