#
ドキュメント

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はコンテナをサービスと呼ぶ
$ docker-compose ps --all

       Name                     Command               State          Ports
----------------------------------------------------------------------------------
dockerq-ccom_app_1   docker-php-entrypoint sh - ...   Up      0.0.0.0:8888->80/tcp
dockerq-ccom_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp

docker-compose build

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

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

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

ref.
https://qiita.com/wasanx25/items/d47caf37b79e855af95f

Services are built once and then tagged as project_service, e.g. composetest_db. If you change a service's Dockerfile or the contents of its build directory, you can run docker-compose build to rebuild it.

buildとimage/buildプロパティ

image/buildプロパティは以下の3パターンがあり挙動が異なります。

  • imageプロパティのみ指定
  • buildプロパティのみ指定
  • image/buildプロパティ両方を指定

ymlファイルにimage:が書かれている場合はそのイメージ名がローカルになければ、リモートからプルしてきます。imageが書かれていない場合、buildに書かれているパスの(デフォルトは)Dockerfileを参考にしてイメージを構築します。

https://qiita.com/wasanx25/items/d47caf37b79e855af95f

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:${TAG}
    # ...
  other:
    # ...
$ env TAG="1.0.0" docker-compose build some
// RepoTag
some:1.0.0

※ dockerのイメージはRepoTagで特定する。

$ docker image inspect some:1.0.0

buildプロパティのみ指定

ref.
https://qiita.com/wasanx25/items/d47caf37b79e855af95f

Services are built once and then tagged as project_service, e.g. composetest_db. If you change a service's Dockerfile or the contents of its build directory, you can run docker-compose build to rebuild it.

version: '3'
services:
  some:
    build: 
      context: .
      dockerfile: Dockerfile
    # ...
  other:
    # ...

ビルドで作成される各サービスのイメージ名は以下の命名規則になる。

-イメージ名:ディレクトリ名_サービス名

image/build両方を指定

build と同様に image (Docker イメージ)も指定する場合、 image の場所で指定された webapp とオプションの tag を使い、 Docker Compose が構築されるイメージに名前を付けます。

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

docker-compose up

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

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

  • コンテナの構築、作成、起動、アタッチ
  • StateUpに変更

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

  • Docker HubにイメージをPush
  • ECRの場合も

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ファイル

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