#
ドキュメント

Document

自分のための備忘録です。

Docker Compose

概要

docker-compose.ymlの概要。
ref. https://docs.docker.jp/compose/compose-file.html

version: '3.7'
services:
  mysql:
  # ....

  app:
  # ....

mysqlappDocker Composeではサービスと呼ぶ。

docker compose コマンド

docker compose ps --all

  • サービス一覧を表示する
$ docker compose ps --all

NAME                                     COMMAND                  SERVICE             STATUS              PORTS
nginx-php81-fpm-envsubst-aws-nginx-1     "/docker-entrypoint.…"   nginx               running             0.0.0.0:8080->80/tcp
nginx-php81-fpm-envsubst-aws-php-fpm-1   "docker-php-entrypoi…"   php-fpm             running             9000/tcp

docker compose build

ref. Compose file build reference

サービスの Dockerfile やビルドディレクトリの内容を変更する場合は、docker compose build を実行して再ビルドします。

-- https://docs.docker.jp/compose/reference/up.html

  • Dockerfileを変更したときに実行
  • docker compose build {{service}}で指定したサービスだけをbuild可能

imageおよびbuildプロパティ

3パターンあり挙動が異なります。

  • imageプロパティのみ指定
  • buildプロパティのみ指定
  • imageおよびbuildプロパティの両方を指定

imageプロパティのみ指定

コンテナの実行時、元になるイメージを指定します。リポジトリ名/タグ、あるいはイメージ ID の一部を(前方一致で)指定できます。

-- https://docs.docker.jp/compose/compose-file/compose-file-v3.html#image

イメージが存在していなければ、Compose は pull (取得)を試みます。しかし build を指定している場合は除きます。その場合、指定されたオプションやタグを使って構築します。

-- https://docs.docker.jp/compose/compose-file/compose-file-v3.html#image

  • imageプロパティに指定したイメージがローカルに存在する場合はそのイメージを使用する
  • ローカルにない場合はリモート(多くはDocker Hub)からpullする
version: '3'
services:
  some:
    image: some:1.0.0
    # ...
  other:
    # ...

buildプロパティのみ指定

version: '3'
services:
  some:
    build: 
      context: .
      dockerfile: Dockerfile
    # ...
  other:
    # ...
  • Dockerfileからイメージを作成する
  • 各サービスのイメージの命名規則は以下のとおり^build_property
    • イメージ名:ディレクトリ名_サービス名(アンダースコアが使われる)^build_property

imageおよびbuildプロパティの両方を指定

version: '3'
services:
  some:
    image: some:1.0.0
    build: 
      context: .
      dockerfile: Dockerfile
    # ...
  other:
    # ...
  • Dockerfileからイメージを作成する
  • イメージはimageプロパティに指定した名前(およびタグ)になる

ref. https://docs.docker.jp/compose/compose-file/compose-file-v3.html#build

docker compose up

サービス用のコンテナの構築、作成、起動、アタッチを行います。

-- https://docs.docker.jp/compose/reference/up.html

コンテナの作成後にサービス設定やイメージが変更された場合は、 docker compose up の実行によって対象コンテナの停止と再作成が行われます(マウントしているボリュームは保持します)。

-- https://docs.docker.jp/engine/reference/commandline/compose_up.html#docker-compose-up)

docker compose up -d

デタッチド・モード: バックグラウンドでコンテナを実行し、新しいコンテナ名を表示 --abort-on-container-exit と同時に使えない

https://docs.docker.jp/compose/reference/up.html

docker compose stop

  • サービス停止
  • StateExitに変更
      Name                     Command                State     Ports
----------------------------------------------------------------------
dockerq-ccom_app_1   docker-php-entrypoint sh - ...   Exit 137
dockerq-ccom_db_1    docker-entrypoint.sh mysqld      Exit 0

docker compose rm

停止しているコンテナを削除する。

Name   Command   State   Ports
------------------------------
  • Volumeは削除されない
  • Networkは削除されない

docker compose down

  • stop + rm + Network削除
  • Volumeは削除しない

docker compose down -v

  • stop + rm + Network削除 + Volume削除

docker compose down --rmi all -v/docker compose down --rmi local -v

  • イメージも削除
  • ContainerNetworkVolumeImageを削除

--rmi

Remove images. Type must be one of: 'all': Remove all images used by any service. 'local': Remove only images that don't have a custom tag set by the image field.

-v

Remove named volumes declared in the volumes section of the Compose file and anonymous volumes attached to containers.

docker compose run

サービスに対して1回コマンドを実行します。たとえば、次のコマンドは web サービスを開始するためのコマンドで、サービス内で bash としてコマンドを実行します。

-- https://docs.docker.jp/compose/reference/run.html

docker compose push

  • image プロパティに指定したレジストリに Push する
  • サービスを指定して Push することもできる
  • depends_on プロパティを指定している場合はそのサービスのイメージも Push される

ref. docker compose push

Composeファイルリファレンス

commandプロパティ

デフォルトのコマンドを上書きします。

-- https://docs.docker.jp/compose/compose-file.html#command

DockerfileにCMDが定義されていてもいなくてもCMDを無視してcommandが実行されます

docker-compose.yml で command を書くと、docker compose up を実行したときに、その内容が実行されます。Dockerfile で指定した CMD はこのときは無視されます。 なので、docker run で特定のコマンドを実行したいときは Dockerfile の CMD に書けばいいし、docker compose up でコマンドを実行したいときは docker-compose.yml に記述すればいいと思います。

-- https://ja.stackoverflow.com/questions/30495/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AFdocker-compose-yml%E3%81%A8dockerfile%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%81%BB%E3%81%86%E3%81%8C%E3%81%84%E3%81%84

ARG命令/.envファイル

ref. https://docs.docker.jp/compose/env-file.html

# docker-compose.yml

# ...
# ...
ARG MY_ENV1
ARG MY_ENV2
# ...
# ...
# .env
MY_ENV1=foo
MY_ENV2=bar

docker-entrypoint-initdb.d

  • MySQL公式イメージ初期化スクリプト用ディレクトリ
  • /docker-entrypoint-initdb.dに配置したスクリプトは自動で実行される

ref. https://qiita.com/moaikids/items/f7c0db2c98425094ef10