Docker Composeの設定ファイルcompose.yamlで、よく使う項目や書き方をまとめています。
サービス、ポート、環境変数、ボリューム、依存関係、ネットワークなどをすぐに確認できます。
現在はcompose.yamlが推奨されているファイル名です。
従来のdocker-compose.ymlやdocker-compose.yamlも利用できます。
また、現在のDocker Composeではdocker composeコマンドを使用します。
従来はdocker-composeコマンドが使われていました。
Docker Composeの操作コマンドを確認したい場合はDocker Compose コマンド チートシート、
Dockerfileの書き方を確認したい場合はDockerfile チートシートを参照してください。
※<名前>や<値>は、実際の値に置き換えて使用してください。
よく使う基本形
services:
app:
build: .
ports:
- "3000:3000"
environment:
NODE_ENV: production
volumes:
- ./src:/app/src
db:
image: postgres
environment:
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
アプリケーションとデータベースを定義するシンプルな例です。
実際の構成に合わせてサービスや設定を追加・変更します。
※サンプルでは説明を簡略化しています。実運用ではパスワードなどの秘密情報をcompose.yamlへ直接記載しないでください。
サービスを定義する
サービスを定義する
services:
Composeで管理するコンテナの構成をサービス単位で定義します。
サービス名を付ける
<サービス名>:
servicesの下に任意のサービス名を定義します。
他のサービスからこの名前で参照できます。
イメージ・ビルド
使用するイメージを指定する
image: <イメージ名>:<タグ>
Docker Hubなどのレジストリから使用するイメージを指定します。
現在のディレクトリでビルドする
build: .
現在のディレクトリをビルドコンテキストとしてDockerイメージをビルドします。
ビルド設定を詳しく指定する
build:
context: .
dockerfile: Dockerfile
ビルドコンテキストや使用するDockerfileを個別に指定します。
ビルド引数を渡す
build:
context: .
args:
<変数名>: <値>
DockerfileのARGへビルド時の値を渡します。
ポート
ポートを公開する
ports:
- "<ホスト側ポート>:<コンテナ側ポート>"
ホスト側のポートとコンテナ側のポートを対応付けます。
3000番ポートを公開する
ホストの3000番ポートへのアクセスを、コンテナの3000番ポートへ転送します。
コンテナ側のポートを示す
ホストへ公開せず、コンテナ側で使用するポートを示します。
環境変数
環境変数を設定する
コンテナへ環境変数を渡します。
複数の環境変数を設定する
environment:
NODE_ENV: production
PORT: 3000
複数の環境変数をキーと値の形式で設定します。
環境変数ファイルを読み込む
指定したファイルからコンテナへ渡す環境変数を読み込みます。
変数を展開する
environment:
VARIABLE_NAME: "${VARIABLE_NAME}"
Compose実行時の環境変数や.envの値を展開して、
コンテナの環境変数に設定します。
VARIABLE_NAMEは実際の環境変数名に置き換えて使用します。例:PORT: ${PORT}
ボリューム
ホストのディレクトリをマウントする
volumes:
- <ホスト側パス>:<コンテナ内パス>
ホスト側のファイルやディレクトリをコンテナ内へマウントします。
名前付きボリュームを使用する
volumes:
- <ボリューム名>:<コンテナ内パス>
Dockerで管理する名前付きボリュームをコンテナへマウントします。
名前付きボリュームを定義する
compose.yamlのトップレベルで、サービスから使用する名前付きボリュームを定義します。
読み取り専用でマウントする
volumes:
- <ホスト側パス>:<コンテナ内パス>:ro
マウントしたファイルやディレクトリをコンテナ側から変更できないようにします。
サービス間の依存関係
依存するサービスを指定する
指定したサービスとの依存関係を定義します。
準備完了を待って起動する
depends_on:
<サービス名>:
condition: service_healthy
依存するサービスのhealthcheckが正常になるまで待ってから起動します。
ヘルスチェック
コンテナの状態をチェックする
healthcheck:
test: ["CMD", "<コマンド>"]
interval: 30s
timeout: 10s
retries: 3
コンテナ内のサービスが正常に動作しているか定期的に確認します。
depends_onのcondition: service_healthyと組み合わせて使用できます。
再起動
明示的に停止するまで再起動する
restart: unless-stopped
ユーザーが明示的に停止した場合を除き、コンテナを自動的に再起動します。
コマンド・作業ディレクトリ
起動コマンドを上書きする
command: <コマンド>
DockerfileのCMDなどで指定されたデフォルトコマンドを上書きします。
ENTRYPOINTを上書きする
entrypoint: <コマンド>
イメージに設定されているENTRYPOINTを変更します。
作業ディレクトリを指定する
working_dir: <コンテナ内パス>
コンテナ内でコマンドを実行するときの作業ディレクトリを指定します。
実行ユーザーを指定する
user: <ユーザー名>
コンテナ内のプロセスを実行するユーザーを指定します。
ネットワーク
サービスをネットワークへ接続する
指定したComposeネットワークへサービスを接続します。
ネットワークを定義する
compose.yamlのトップレベルでカスタムネットワークを定義します。
サービス同士を接続する
同じComposeネットワーク上では、通常はIPアドレスではなく
サービス名をホスト名として使用できます。
services:
app:
environment:
DATABASE_HOST: db
db:
image: postgres
この例では、appからデータベースへ接続するときのホスト名として
dbを使用できます。
よく使うcompose.yaml例
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_HOST: db
DATABASE_USER: app
DATABASE_PASSWORD: password
volumes:
- ./src:/app/src
depends_on:
db:
condition: service_healthy
db:
image: postgres
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: password
POSTGRES_DB: app
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
volumes:
db-data:
アプリケーションとPostgreSQLを組み合わせた構成例です。
アプリケーションからデータベースへは、サービス名のdbをホスト名として接続します。
設定を確認する
実際に適用される設定を確認する
docker compose config
環境変数などを展開したあと、Docker Composeが実際に使用する設定を表示します。
設定に問題がないか確認する
docker compose config -q
設定内容を表示せず、Compose設定を検証します。