Docker

Dockerfile と Compose の使い分け

7

Dockerfile と Compose の使い分け — Docker Tips

同じ Ubuntu コンテナを、Dockerfile だけで操作するCompose 経由にするかの 2 通りで比べます。case01 は Dockerfile のみ、case02 は同じ Dockerfile に docker-compose.yml を添えた構成です。違いは設定をコマンドに書くか YAML に寄せるかです。

参考: Dockerfile · Compose file · docker run · compose up


目次

  1. 前提
  2. フォルダ構成
  3. 共通の Dockerfile
  4. 全体像の比較
  5. case01:Dockerfile のみでコマンドを直接叩く
  6. case02:Compose に設定を寄せる
  7. 操作コマンド対照表
  8. どちらを使うか
  9. うまくいかないとき

前提

  • Docker Desktop が起動済みで、docker --versiondocker compose version が通ること
  • 手元に case01Dockerfile のみ)と case02Dockerfile + 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 builddocker run docker compose up
向いている用途 基本の学習・単一コンテナ 設定の一元管理・複数コンテナへの拡張

共通の Dockerfile

case01case02 とも 同一内容 の 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 公式イメージの既定 CMDbash ですが、標準入出力が 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 だけなので、buildrun の流れが 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 --build

up -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 ps

docker compose down はコンテナと Compose が作ったネットワークを削除しますが、イメージは残りますcase02 のように image: でタグを明示している場合、イメージまで消すには docker compose down --rmi all を使います。--rmi localimage: 未指定で自動生成されたイメージ向けで、ここでは効きません。


どちらを使うか

場面 おすすめ
Docker の基本(build / run)を学ぶ case01
設定を 1 ファイルにまとめたい case02
Web + DB など複数コンテナを扱う case02(サービスを追記するだけで拡張できる)
コンテナが 1 つで済む最小構成 case01 で十分
チームで手順を共有したい case02docker compose up の一言で環境が揃う)
case01 case02
入口 Docker CLI Compose YAML
コマンド数 ビルドと起動が別コマンド up / down で一式
学べること イメージとコンテナの関係 設定の宣言的管理

案として、まず case01 相当の操作で イメージとコンテナの動きそのもの を理解し、その後 case02 相当の Compose で 運用の書き方 を覚える順序が飲み込みやすいです。


うまくいかないとき

症状 原因 対処
docker buildunable to prepare context 指定したパスにフォルダ/ファイルがない カレントディレクトリと .\case01 などの指定パスが合っているか確認
docker compose upno 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 alldocker compose up -d --build
docker exec case01 cat /etc/os-releaseError: No such container コンテナが起動していない、または名前を打ち間違えた docker ps -a で存在と状態を確認
case01 と case02 の両方を試したらイメージが 2 つ増えて紛らわしい 別名でビルドされているだけで正常 docker imagescase01-ubuntu / case02-ubuntu を区別

case01 と case02 のどちらを触っても Ubuntu コンテナ自体の挙動は変わりません。混乱したときは「今操作しているのは CLI コマンドの並びか、YAML の宣言か」に一度立ち返ると整理しやすいです。

シェア