docker-compose: YAMLで定義のサービス(複数コンテナ)を起動


前提


ドキュメント


インストール

env_name=e1
# 仮想環境作成
virtualenv $env_name
cd $env_name
# 有効化
source bin/activate
# インストール
pip3 install docker-compose

# Bash completion
mkdir -p etc/bash_completion.d/
url=https://raw.githubusercontent.com/docker/compose/1.23.2/contrib/completion/bash/docker-compose
curl -L $url -o etc/bash_completion.d/docker-compose

virtualenv環境


サービスのライフサイクル

各コンテナをサービスという。

  1. Dockerfile: 各コンテナを定義
  2. docker-compose.yml: サービスを定義
  3. docker-compose up: 作成して起動
    • --detach: バックグラウンド
  4. docker-compose down: 停止して削除

その他サブコマンド


docker-compose.yml

YAML

トップレベルのキー

シンプルな例

# 設定ファイルのバージョン
version: '3.7'

# 各サービス(コンテナ)の定義
services:
  # サービス
  front-end:
    build: front-end/ # Dockerfileの場所
    network_mode: "host"
  # サービス
  back-end:
    build: back-end/
    ports:
      - "8080:80"
    networks:
      - backend

# ネットワークの定義
networks:
  backend:

サービスのネットワーク

サービスには自動でブリッジネットワーク作成・割当があるが、指定するならnetworksキー。

指定する場合: トップレベルのnetworksキー

# トップレベル
networks:
  # 名前
  backend:
    # 作成(docker network create)済みを利用の場合
    external: true

各サービスに割当: サービス下のnetworksキー

services:
  サービス:
    networks:
      - backend
    # ホスト:8080 => 転送 => コンテナ:80
    ports:
      - "8080:80"

ホストモード: 別のネットワークを割当ないとき

services:
  サービス:
    network_mode: "host"

サービス・キー

services:
  サービス1:
    設定キー1:
    設定キー2:
  サービス2:

サービスの定義

buildキー: Dockerfileからビルド

services:
  myapp:
    build: . # カレントディレクトリなら
    image: myapp:version # 新イメージに名前付けるなら

  app2:
    # ビルドを調整する場合
    build:
      context: ./dir # Dockerfileのあるディレクトリ
      dockerfile: app2.dockerfile # Dockerfile名
      args: # Dockerfileに渡す変数
        myarg: value

imageキー: 単独使用で既存のイメージ利用

services:
  myapp:
    image: alpine:latest # 既存イメージ