「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 ライフを送りましょう!