前回は、Docker の「イメージ」と「コンテナ」を分けて整理しました。
今回は Docker Compose を使って、コンテナの設定をファイルにまとめます。
Docker Compose を使うと、docker run に長く書いていた指定を compose.yaml に書けます。
この記事では、公式で優先されているファイル名に合わせて compose.yaml を使います。
Docker Compose とは
Docker Compose は、複数のコンテナや、その起動設定をまとめて扱うための Docker の機能です。
通常の docker run では、コンテナを起動するたびにオプションをコマンドに書きます。
たとえば、次のような指定です。
- どのイメージを使うか
- コンテナ名をどうするか
- ポートをどうつなぐか
- 環境変数をどう渡すか
- ボリュームをどうマウントするか
Docker Compose では、これらの設定を compose.yaml に書きます。
そのうえで、次のようなコマンドでまとめて操作できます。
docker compose up: コンテナを作って起動するdocker compose ps: Compose で起動したコンテナを見るdocker compose exec: 起動中のコンテナに入るdocker compose down: Compose で作ったコンテナを削除する
1つのコンテナだけでも使えますが、Web アプリとデータベースのように複数のコンテナをまとめて起動したいときに特に便利です。
Docker Compose を使えるか確認する
まず、Docker Compose が使えるか確認します。
docker compose versionバージョンが表示されれば、Docker Compose を使える状態です。
Ubuntu で Docker Compose プラグインが入っていない場合は、次のパッケージをインストールします。
sudo apt install docker-compose-pluginインストール後、もう一度確認します。
docker compose versionここで使っているのは、docker compose という Docker CLI のサブコマンドです。古い記事では docker-compose という別コマンドが出てくることがありますが、この記事では現在よく使われる docker compose で説明します。
compose.yaml とは
compose.yaml は、Docker Compose が読む設定ファイルです。
Dockerfile とは役割が違います。
- Dockerfile: イメージの作り方を書く
- compose.yaml: どのイメージを使い、どんなコンテナとして起動するかを書く
たとえば、次のような docker run コマンドがあるとします。
docker run --name ubuntu-test -it ubuntu:24.04 bashこのコマンドでは、使うイメージ、コンテナ名、対話操作の指定、起動するコマンドをまとめて指定しています。
Compose では、それらを compose.yaml に書きます。
services:
ubuntu-test:
image: ubuntu:24.04
container_name: ubuntu-compose-test
tty: true
stdin_open: true対応関係は次の通りです。
services: 起動したいコンテナのまとまりを書く場所ubuntu-test: Compose 内で使うサービス名image: ubuntu:24.04: 使うイメージcontainer_name: ubuntu-compose-test: 作成するコンテナ名tty: true: ターミナル操作できるようにするstdin_open: true: 標準入力を開いたままにする
compose.yaml を書いただけでは、まだイメージもコンテナも作られません。実際に作成や起動をするのは、docker compose up や docker compose build を実行したときです。
ファイル名について
Docker Compose のファイル名には、いくつか種類があります。
compose.yaml: 現在の標準的なファイル名compose.yml:compose.yamlの拡張子違いdocker-compose.yaml: 古い形式との互換用として読み込める名前docker-compose.yml: 昔からよく使われている名前。現在も読み込める
この記事では、公式で優先されている compose.yaml という名前を使います。
コマンド名にも似たものがあります。
docker compose: 現在よく使う Compose V2 のコマンドdocker-compose: 古い Compose V1 のコマンド
この記事では、コマンドも docker compose で説明します。
Step 1 コンテナを作成する
ここでは、compose.yaml を使ってコンテナを作成します。
コンテナを作る方法は、大きく分けて2つあります。
- 方法1: 既存イメージを指定してコンテナを作る
- 方法2: Dockerfile からイメージを作り、そのイメージでコンテナを作る
方法1 既存イメージでコンテナを作る
まずは、既存の ubuntu:24.04 イメージを使ってコンテナを起動します。
この方法では、自分でイメージを作りません。既存イメージからコンテナを作ります。
作業ディレクトリを作る
作業用のディレクトリを作ります。
mkdir compose-sample
cd compose-samplecompose.yaml を作る
次に、compose.yaml を作ります。
services:
ubuntu-test:
image: ubuntu:24.04
container_name: ubuntu-compose-test
tty: true
stdin_open: trueこの段階では、まだコンテナは作られていません。compose.yaml という設定ファイルを書いただけです。
コンテナを起動する
コンテナを作って起動します。
docker compose up -ddocker compose up -d は、compose.yaml を読んでコンテナを作成し、バックグラウンドで起動します。
手元に ubuntu:24.04 イメージがない場合は、このタイミングでイメージも取得されます。
起動状態を確認する
作成されたコンテナを確認します。
docker compose ps
docker ps方法2 Dockerfile からイメージを作ってコンテナを作る
次は、Dockerfile からイメージを作り、そのイメージでコンテナを起動します。
この方法では、compose.yaml の build: を使います。
作業ディレクトリを作る
作業用のディレクトリを作ります。
mkdir compose-build-sample
cd compose-build-sampleDockerfile を作る
Dockerfile を作ります。
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y curl
WORKDIR /app
RUN echo "hello from compose image" > hello.txt
CMD ["bash"]この Dockerfile は、Ubuntu 24.04 を元にして、curl と /app/hello.txt を入れたイメージを作るための設計図です。
compose.yaml を作る
同じディレクトリに、compose.yaml を作ります。
services:
app:
build: .
image: my-compose-ubuntu:1.0
container_name: my-compose-ubuntu-test
tty: true
stdin_open: trueこの compose.yaml では、次の内容を書いています。
app: Compose 内で使うサービス名build: .: 今いるディレクトリの Dockerfile からイメージを作るimage: my-compose-ubuntu:1.0: 作るイメージに名前を付けるcontainer_name: my-compose-ubuntu-test: 作成するコンテナ名tty: true: ターミナル操作できるようにするstdin_open: true: 標準入力を開いたままにする
イメージだけを作る
イメージだけを作る場合は、次のコマンドです。
docker compose buildこれはイメージを作る操作です。コンテナを起動する操作ではありません。
ただし、docker compose build は必ず先に実行しないといけないわけではありません。
compose.yaml に build: . が書かれている場合、後ほど登場する docker compose up -d だけでも、必要なイメージがまだ作られていなければ、自動でイメージを作ってからコンテナを起動します。
それでも docker compose build を単独で使う場面はあります。
- コンテナを起動せずに、先にイメージだけ作りたい
- ビルドが成功するかだけ確認したい
- Dockerfile やビルド対象のファイルを変更したので、明示的に作り直したい
以下で作成されたイメージを確認できます。
docker imagesコンテナを起動する
コンテナを作って起動します。
docker compose up -dbuild: .が書かれている場合、docker compose up -dは必要に応じてイメージを作ってからコンテナを起動します。そのため、イメージがまだない初回起動では、事前に
docker compose buildを実行しなくても動きます。
明示的にイメージの作成もコンテナの起動もまとめて行いたい場合は、次のように書けます。
docker compose up --build -d--build を付けると、起動前にイメージのビルドを明示的に行います。Dockerfile を変更したあとに、確実にビルドし直してから起動したい場合に使います。
Step 2 コンテナの中に入る
コンテナの中に入るには、サービス名を指定して docker compose exec を使います。
docker compose exec <サービス名> bash<サービス名> は、compose.yaml の services: の下に書いた名前です。たとえば、この記事の例では ubuntu-test や app がサービス名です。
通常の docker exec と同じように、コンテナ内でコマンドを実行できます。
docker exec と docker compose exec の違いは、指定する相手です。
docker exec -it <コンテナIDまたはコンテナ名> bash: コンテナIDやコンテナ名を直接指定して入るdocker compose exec <サービス名> bash: Compose のサービス名を指定して入る
Compose を使っている場合は、compose.yaml に書いたサービス名で入れるので、毎回コンテナIDを調べなくて済みます。
この記事の例で入る
この記事の例なら、次のように入れます。
- 方法1のコンテナに入る:
docker compose exec ubuntu-test bash - 方法2のコンテナに入る:
docker compose exec app bash
方法1のコンテナで確認する
方法1の ubuntu-test に入った場合は、Ubuntu コンテナの中にいるか確認できます。
cat /etc/os-release
exit方法2のコンテナで確認する
方法2の app に入った場合は、Dockerfile で作った内容を確認できます。
pwd
cat hello.txt
curl --version
exitpwd が /app になり、hello.txt が表示されれば、Dockerfile から作ったイメージでコンテナを起動できています。
Step 3 停止と削除
コンテナを停止する
Compose で起動したコンテナを停止します。
docker compose stopコンテナを削除する
コンテナを削除する場合は、down を使います。
docker compose downdocker compose down は、基本的には Compose で作ったコンテナやネットワークを削除します。作ったイメージは通常そのまま残ります。
イメージも削除する
イメージも削除したい場合は、次のようにします。
docker compose down --rmi localコマンドごとに対象を整理する
Compose のコマンドも、イメージ操作とコンテナ操作に分けると分かりやすいです。
| コマンド | 主な対象 | 何をしているか |
|---|---|---|
docker compose build | イメージ | build: に書かれた Dockerfile からイメージを作る |
docker compose up -d | コンテナ | compose.yaml をもとにコンテナを作って起動する。必要なイメージがなければ作成や取得も行う |
docker compose up --build -d | イメージとコンテナ | イメージを作り直してからコンテナを作って起動する |
docker compose ps | コンテナ | Compose で起動したコンテナを見る |
docker compose exec <サービス名> bash | コンテナ | 起動中のコンテナに入る |
docker compose stop | コンテナ | Compose で起動したコンテナを停止する |
docker compose down | コンテナ | Compose で作ったコンテナやネットワークを削除する |
特に混乱しやすいのは、docker compose build と docker compose up の違いです。
docker compose build: イメージだけを作る。コンテナは起動しないdocker compose up: コンテナを作って起動する。必要なイメージがなければ、先に作成や取得も行うdocker compose up --build: 起動前にイメージをビルドしてから、コンテナを作って起動する
まとめ
Compose を使う場合は、次のように分けて考えると整理しやすいです。
compose.yamlにコンテナの設定を書く- 既存イメージを使う場合は、
image:に使うイメージを書く - Dockerfile から作る場合は、
build:に Dockerfile の場所を書く docker compose buildはイメージだけを作る。初回起動前に必須ではないdocker compose up -dはコンテナを作って起動する。必要なイメージがなければ先に作成や取得も行うdocker compose downはコンテナを削除する
compose.yaml は、コンテナの起動設定をファイルとして残せるのが大きな利点です。同じ設定で何度も起動したい場合や、複数のコンテナをまとめて扱いたい場合に使いやすくなります。