Dockerfile と Compose の使い分け — Docker Tips
同じ Ubuntu コンテナを、Dockerfile だけで操作するか Compose 経由にするかの 2 通りで比べます。case01 は Dockerfile のみ、case02 は同じ Dockerfile に docker-compose.yml を添えた構成です。違いは設定をコマンドに書くか YAML に寄せるかです。
参考: Dockerfile · Compose file · docker run · compose up
目次
- 前提
- フォルダ構成
- 共通の Dockerfile
- 全体像の比較
- case01:Dockerfile のみでコマンドを直接叩く
- case02:Compose に設定を寄せる
- 操作コマンド対照表
- どちらを使うか
- うまくいかないとき
前提
- Docker Desktop が起動済みで、
docker --versionとdocker compose versionが通ること - 手元に
case01(Dockerfileのみ)とcase02(Dockerfile+docker-compose.yml)の 2 フォルダが用意されていること - 以降のコマンドは、両フォルダの親(リポジトリの
Dockerディレクトリ)をカレントにして実行する - 操作は Windows の PowerShell を想定(Linux/macOS のシェルでもコマンド自体はほぼ共通)
docker --versiondocker compose versionいずれもエラーなくバージョン文字列が出れば準備は完了です。
フォルダ構成
Docker\├── case01\│ └── Dockerfile└── case02\ ├── Dockerfile └── docker-compose.yml| case01 | case02 | |
|---|---|---|
| 方式 | Dockerfile のみ |
Dockerfile + docker-compose.yml |
| 起動 | docker build → docker run |
docker compose up |
| 向いている用途 | 基本の学習・単一コンテナ | 設定の一元管理・複数コンテナへの拡張 |
共通の Dockerfile
case01・case02 とも 同一内容 の Dockerfile を使います。
FROM ubuntu:24.04RUN apt-get update && \ apt-get install -y --no-install-recommends \ ca-certificates \ curl \ vim \ && rm -rf /var/lib/apt/lists/*CMD ["sleep", "infinity"]| 行 | 意味 |
|---|---|
FROM ubuntu:24.04 |
ベースイメージを Ubuntu 24.04 に固定 |
RUN apt-get update && apt-get install ... |
ca-certificates / curl / vim を導入し、直後に apt のキャッシュを削除してイメージを軽くする |
CMD ["sleep", "infinity"] |
既定の bash は非対話だとすぐ終わるため、常駐用に無限 sleep を実行 |
Ubuntu 公式イメージの既定 CMD は bash ですが、標準入出力が TTY に接続されていないとそのまま終了します。そのため常駐させるには、sleep infinity など フォアグラウンドで動き続ける CMD を明示しています。
全体像の比較
flowchart TB subgraph case01["case01(Dockerfile のみ)"] D1[Dockerfile] --> B1[docker build] B1 --> I1["イメージ case01-ubuntu"] I1 --> R1[docker run] R1 --> C1["コンテナ case01"] end subgraph case02["case02(Docker Compose)"] D2[Dockerfile] --> Y2[docker-compose.yml] Y2 --> U2[docker compose up] U2 --> I2["イメージ case02-ubuntu"] U2 --> C2["コンテナ case02"] end style case01 fill:#e8f4fd style case02 fill:#fdf4e8| 比較項目 | case01 | case02 |
|---|---|---|
| 設定ファイル | Dockerfile のみ |
Dockerfile + docker-compose.yml |
| ビルド | docker build を手動 |
docker compose up --build で自動 |
| 起動 | docker run を手動 |
docker compose up で自動 |
| 停止 | docker stop case01 |
docker compose down |
| 状態確認 | docker ps --filter name=case01 |
docker compose ps |
| コンテナに入る | docker exec -it case01 bash |
docker exec -it case02 bash(共通) |
どちらも Dockerfile の中身は同じです。違いは ビルド・起動・停止をコマンドで逐次書くか、YAML にまとめて宣言するか だけです。
case01:Dockerfile のみでコマンドを直接叩く
case01 フォルダには Dockerfile しかありません。ビルドと起動を別々のコマンドで行います。
docker build -t case01-ubuntu .\case01docker run -d --name case01 --restart unless-stopped case01-ubuntu| オプション | 意味 |
|---|---|
-t case01-ubuntu |
ビルドしたイメージに付ける名前(タグ) |
-d |
バックグラウンド起動(デタッチモード) |
--name case01 |
コンテナ名を明示的に指定 |
--restart unless-stopped |
手動で止めない限り、Docker 再起動時なども自動的に再起動する |
特徴: ファイルが Dockerfile だけなので、build → run の流れが 1 対 1 でそのまま見えます。設定を YAML に隠さず、コマンドの並びだけで何をしているか追える点が学習には向いています。
case02:Compose に設定を寄せる
case02 フォルダには同内容の Dockerfile に加えて docker-compose.yml があります。
services: ubuntu: build: . image: case02-ubuntu container_name: case02 restart: unless-stopped| 項目 | 意味 |
|---|---|
build: . |
同じディレクトリの Dockerfile からビルドする |
image: case02-ubuntu |
ビルドしたイメージに付ける名前(case01 の -t に相当) |
container_name: case02 |
コンテナ名(case01 の --name に相当) |
restart: unless-stopped |
case01 の --restart unless-stopped と同じ再起動方針 |
cd .\case02docker compose up -d --buildup -d --build の 1 コマンドで、ビルドと起動の両方が実行されます。
特徴: 現状はコンテナが 1 つのため機能面では case01 とほぼ同じです。目的は Compose の書き方と up / down の操作感です。サービスが増えたときに差が出ます。
操作コマンド対照表
起動
# case01docker build -t case01-ubuntu .\case01docker run -d --name case01 --restart unless-stopped case01-ubuntu# case02cd .\case02docker compose up -d --build停止
# case01docker stop case01# case02cd .\case02docker compose down再起動
# case01docker start case01# case02cd .\case02docker compose up -d確認
docker exec case01 cat /etc/os-release # Ubuntu 24.04.xdocker exec case02 cat /etc/os-releasedocker images # case01-ubuntu / case02-ubuntu が並ぶdocker ps --filter name=case01cd .\case02; docker compose psdocker compose down はコンテナと Compose が作ったネットワークを削除しますが、イメージは残ります。case02 のように image: でタグを明示している場合、イメージまで消すには docker compose down --rmi all を使います。--rmi local は image: 未指定で自動生成されたイメージ向けで、ここでは効きません。
どちらを使うか
| 場面 | おすすめ |
|---|---|
| Docker の基本(build / run)を学ぶ | case01 |
| 設定を 1 ファイルにまとめたい | case02 |
| Web + DB など複数コンテナを扱う | case02(サービスを追記するだけで拡張できる) |
| コンテナが 1 つで済む最小構成 | case01 で十分 |
| チームで手順を共有したい | case02(docker compose up の一言で環境が揃う) |
| case01 | case02 | |
|---|---|---|
| 入口 | Docker CLI | Compose YAML |
| コマンド数 | ビルドと起動が別コマンド | up / down で一式 |
| 学べること | イメージとコンテナの関係 | 設定の宣言的管理 |
案として、まず case01 相当の操作で イメージとコンテナの動きそのもの を理解し、その後 case02 相当の Compose で 運用の書き方 を覚える順序が飲み込みやすいです。
うまくいかないとき
| 症状 | 原因 | 対処 |
|---|---|---|
docker build で unable to prepare context |
指定したパスにフォルダ/ファイルがない | カレントディレクトリと .\case01 などの指定パスが合っているか確認 |
docker compose up が no configuration file provided |
docker-compose.yml があるディレクトリで実行していない |
cd .\case02 してから実行 |
docker run 済みの case01 を再度 docker run すると Conflict. The container name "/case01" is already in use |
同名コンテナが既に存在 | docker rm case01(停止していれば)してから再実行、または docker start case01 で再開 |
case02 の image 名を変えても反映されない |
古いイメージ・コンテナが残っている | docker compose down --rmi all → docker compose up -d --build |
docker exec case01 cat /etc/os-release が Error: No such container |
コンテナが起動していない、または名前を打ち間違えた | docker ps -a で存在と状態を確認 |
| case01 と case02 の両方を試したらイメージが 2 つ増えて紛らわしい | 別名でビルドされているだけで正常 | docker images で case01-ubuntu / case02-ubuntu を区別 |
case01 と case02 のどちらを触っても Ubuntu コンテナ自体の挙動は変わりません。混乱したときは「今操作しているのは CLI コマンドの並びか、YAML の宣言か」に一度立ち返ると整理しやすいです。