1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Memo:Docker Compose

Last updated at Posted at 2024-03-26

目次

環境変数

環境変数の展開

bashと同じ形式で展開できる

docker-compose.yml
web:
  image: "webapp:${TAG}"

デフォルトではdocker compose実行時のカレントディレクトリ直下の.envファイルが参照される

bash
$ echo TAG=1.0 > ./.env
docker-compose.yml
web:
  image: "webapp:${TAG}" # -> webapp:1.0

--env-fileコマンドラインオプションで環境変数ファイルを指定できる
パスはカレントディレクトリからの相対パスになる

bash
$ docker compose --env-file ./config/.env.dev up 

コンテナ内環境変数の指定

environmentキーで指定

docker-compose.yml
web:
  environment:
      - DEBUG=1

シェル上の環境変数を参照する

bash
$ export DEBUG=1
docker-compose.yml
web:
  environment:
      - DEBUG # -> 1

環境変数ファイルを指定する:env_fileキー
DockerfileのARGENV よりも優先される
ymlファイル内で環境変数が直接設定された場合はそちらが優先

bash
$ echo DEBU=1 > .env.dev
docker-compose.yml
web:
  env_file:
      - ./.env.dev

Composeが使う環境変数はCOMPOSE_またはDOCKER_から始まる
環境変数一覧:https://docs.docker.com/compose/environment-variables/

プロフィール

プロフィールをサービスに割り当てる

profilesキーで指定できる
正規表現も可能
以下の場合、プロフィールがfrontendに設定されていない場合はbackenddbのみ起動する

メインとなるサービスは常時起動できるようにプロフィールを設定しないのが吉

docker-compose.yml
version: "3.9"
services:
  frontend:
    image: frontend
    profiles: ["frontend"]

  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug

  backend:
    image: backend

  db:
    image: mysql

プロフィール有効化

コマンドラインオプションで設定する方法

bash
$ docker-compose --profile debug up

コマンド前に環境変数を設定する方法:COMPOSE_PROFILES環境変数

bash
$ COMPOSE_PROFILES=debug docker-compose up

複数プロフィールの有効化

bash
$ docker-compose --profile debug --profile frontend up
$ COMPOSE_PROFILES=debug,frontend docker-compose up

プロフィールの自動有効化

profilesキーに設定されたプロフィールはdocker compose run実行時に有効化される

docker-compose.yml
version: "3.9"
services:
  backend:
    image: backend

  db:
    image: mysql

  db-migrations:
    image: backend
    command: myapp migrate
    depends_on:
      - db
    profiles:
      - tools
# backend と db のみ起動
$ docker-compose up -d

# こちらは db-migrations を実行(必要となる db も起動)するにあたり、
# プロフィール `tools` を自動的に有効化
$ docker-compose run db-migrations

依存関係にあるサービスは自動有効化されないので、個別にプロフィールを有効化するか、依存対象と同一のプロフィールにする

設定の共有

複数のComposeファイル

基盤となるdocker-compose.ymlファイルのほかに、docker-compose.override.ymlに追加の設定を記述すれば、docker compose up実行時に自動で読み込まれる

docker-compose.yml
web:
  image: example/my_web_app:latest
  depends_on:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest
``.

```yml:docker-compose.override.yml
web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'

db:
  command: '-d'
  ports:
    - 5432:5432

cache:
  ports:
    - 6379:6379

明示的にファイルを指定する場合は-fオプション

bash
$ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

ネットワーク

コンテナからコンテナのアクセス

v2.1以上だとデフォルトでattachableであり、サービス名でコンテナにアクセスできない

attachableキーワードにfalseを設定すれば非有効化できる

linksキーワード

デフォルトの「サービス名=ホスト名」以外に別名を設定できる

以下の場合にはdbあるいはdatabaseでも接続できる

linksリファレンス:https://docs.docker.jp/compose/compose-file/compose-file-v2.html#compose-file-links

docker-compose.yml
version: "3.9"
services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

任意のネットワークを指定

networksキーを使う

以下の場合、proyxyサービスはdbサービスから分離されるが、appサービスとdbサービスはネットワークを共有している

networksキーリファレンス:https://docs.docker.jp/compose/compose-file/compose-file-v2.html#network-configuration-reference

docker-compose.yml
version: "3.9"

services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

nameキーワードで任意の名前も設定できる

docker-compose.yml
version: "3.9"
services:
  # ...
networks:
  frontend:
    name: custom_frontend
    driver: custom-driver-1

アプリケーション全体のデフォルトネットワークを設定

defaultエントリに定義できる

docker-compose.yml
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # 任意のドライバを使う
    driver: custom-driver-1

既存ネットワークを使用

externalオプションを使用

以下ではmy-pre-existing-networkという名前のネットワークを探す

docker-compose.yml
services:
  # ...
networks:
  default:
    name: my-pre-existing-network
    external: true

起動順、停止順の制御

depends_onキーで行う

あくまで起動順を制御するだけで準備が整うまでは待たないので、別途ラッパースクリプトなどを用意する

docker-compose.yml
version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-postgres.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres
wait-for-postgres.sh
#!/bin/sh
# wait-for-postgres.sh

set -e

host="$1"
shift

until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec "$@"
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?