最終更新日: 2026-08-02
TOP(About this memo)) > 一覧(Docker) > Docker Compose
docker run コマンドに多くのオプションを付け、起動順序を意識したシェルスクリプトを書く必要があった(終了・再起動・削除も同様)。docker composeでは、これらをdocker-compose.ymlで宣言的に管理できる。build: があれば、そのイメージをまとめてビルドする。--force-rm: 常に中間コンテナを削除する。--rm はビルド失敗時には削除しないが、こちらはビルド失敗時も含め常に削除する。基本的に付けておいたほうがよい(IMO)。--no-cache: 構築時にイメージのキャッシュを使わない。たまに使ったほうがよい場面がある。--pull: 常に新しいバージョンのイメージ取得を試みる。--build-arg key=val: サービスに対してビルド時の変数(args)を設定する。Dockerfileに渡すことができる。
docker compose build --build-arg username="my-user" --build-arg password="my-pass"args: で指定するのとほぼ等価(IMO)。
FROM nginx:1.13
RUN apt-get -y update && apt-get install -y \
apache2-utils && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ARG username
ARG password
RUN htpasswd -bc /etc/nginx/.htpasswd $username $password
image: があれば、そのイメージをまとめてプルする。-d)では、Composeはコンテナを実行すると終了するが、コンテナはバックグラウンドで動き続ける。docker compose up -d redmine のようにサービス名を個別指定することも可能。依存関係があるサービスも合わせて起動する(この例ではredmineとmysqlが依存関係にある場合、両方起動する)。.env を変更した場合など、明示的に stop しなくても up -d だけで反映されることがある。docker-compose.ymlの実行時に評価される項目については、ある程度追随してくれるようだ(?)。-d: デタッチド・モード。バックグラウンドでコンテナを実行する。--abort-on-container-exit と同時に使えない。--force-recreate: 設定やイメージに変更がなくても、コンテナを再作成する。--no-recreate と同時に使えない。--no-recreate: コンテナが既に存在していれば再作成しない。--force-recreate と同時に使えない。--no-build: イメージが見つからなくても構築しない。--build: コンテナ開始前にイメージを構築する。--abort-on-container-exit: コンテナが1つでも停止したら全てのコンテナを停止する。-d と同時に使えない。-t, --timeout TIMEOUT: アタッチしている、あるいは既に実行中のコンテナを停止する際のタイムアウト秒数を指定する(デフォルト: 10)。--remove-orphans: Composeファイルで定義されていないサービス用のコンテナを削除する。docker ps と異なりコンテナIDは表示されない)。docker compose up -d した場合、ソースコードに変更があれば取り込んで再起動する。ただし変更がない場合は「up to date」と表示されるだけで何も起こらない。restart の場合は変更の有無にかかわらず必ず再起動する。-T を付ける必要がある。
docker compose exec コンテナID /bin/bash で直接コンテナに入ることができる。docker compose logs サービス名 で指定のサービスのみ出力できる。start [サービス...]docker compose build してから docker compose run サービス名 とすると、意図した挙動にならないことがある。詳細未検証。
COMPOSE_PROJECT_NAME で指定できる。指定しない場合は、デフォルトでディレクトリ名がプロジェクト名として使われる。docker compose ps には出てこなくなる。docker compose up では新しいコンテナを作成しようとする。COMPOSE_PROJECT_NAME を変更するのとほぼ同じ挙動になる。docker compose -p プロジェクト名 up -d
(プロジェクト名)-(サービス名)-連番 という命名方式になる。プロジェクト名はデフォルトでフォルダ名が使われる。docker compose up -d --remove-orphans を実行すると、既に存在する docker_(サービス名)_連番 のコンテナが全て削除されるので注意。WARNING: Found orphan containers (docker_nginx_1, docker_mysql_1, docker_echo_server_1, docker_php_fpm_1, docker_redis_1) for this project.
container_name でコンテナ名を指定できる。container_name: ${DOCKER_PREFIX}_api
external: true を付けると、同名の既存volumeが存在する場合はそれを使うようになる。image と build を同時に宣言している場合(Compose File v2からの機能)は、ビルドが優先的に実行され、image はその成果物のタグ付けに使われる(image によるpullは発生しない)。結果としてイメージ名は image で指定したものになる。
image から可能。ホスト側:コンテナ側 の書式で指定できるほか、コンテナ側のポートのみも指定できる。ホスト側:コンテナ側 の書式でポートを割り当てる際、コンテナのポートが60以下だとエラーになる場合がある。YAMLが xx:yy 形式の指定を60進数の数値とみなしてしまうため(?)。そのため、ポートの割り当ては常に文字列として指定することが推奨される。expose:
- "3000"
- "8000"
.env ファイルに環境変数を入れておくと、docker-compose.ymlはデフォルトでそれを読み込む。docker-compose.ymlファイル内でその環境変数を利用できる。
image: envtest-node:${IMAGE_VERSION:-invalid}
IMAGE_VERSION が存在しない場合は invalid になる。env コマンドを実行すると確認できる)。environment で個別に上書きできる。env_file:
- .env
- ./common.env
- ./apps/web.env
- /opt/secrets.env
docker run --env-file=FILE ... に近い動作(IMO)。restart では再評価されない。up -d では再評価される。env_file 経由でコンテナに読み込んだ環境変数を参照するのではなく、ファイルを直接参照する設計にしておくと、dockerの再起動なしで環境変数の変更を反映しやすくなる場合がある(その場合、アプリ側での再読み込み処理は別途必要)。services:
api:
build:
context: ./api
args:
# キー: 値
WORKDIR: $WORKDIR
# この書き方でもよい
- WORKDIR=$WORKDIR
- buildno=1
- user=someuser
ARG WORKDIR
ENV HOME=/${WORKDIR}
AS 〜 を参照する。docker run・composeそれぞれでの環境変数の渡し方の比較や優先順位については環境変数の渡し方を参照。docker build コマンドを実行したときのカレントなワーキングディレクトリを、ビルドコンテキスト(build context)と呼ぶ。. のように広く取らず、適切な範囲に設定しておいたほうがよい。
volumes:
- db-volume:/var/lib/postgresql/data
- ./initdb/db:/docker-entrypoint-initdb.d # 初期化が不要なら入れなくてよい
volumes:
db-volume:
name: ${DOCKER_PREFIX}_volume
COMPOSE_FILE=docker-compose.yml:docker-compose.override.yml
&)で設定を再利用する&アンカー名 で定義した設定を *アンカー名 で再利用できる。logging: &log
# ...
logging: *log
docker container logs コンテナ名 等で確認できるが、これはDockerの標準機能で /var/lib/docker/containers/ にコンテナ内のログが格納される仕組みによるものである。そのため、Linuxのlogrotate等を別途使用する必要はない。logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
logging:
driver: "awslogs"
options:
awslogs-region: "ap-northeast-1"
awslogs-group: "docker" # group name
tag: '-' # stream nameの名前 "image名_tag-ID"
awslogs-create-group: "true" # groupがなければ作成される
docker compose up の対象から除外できる。command: bash -c "〜 && 〜" のようにする。bashを使わないと && などが使えないため。