Compose ファイル・リファレンス

Compose ファイルは YAML ファイルであり、 サービス(services)ネットワーク(networks)ボリューム(volumes) を定義します。Compose ファイルのデフォルトのパスは ./docker-compose.yml です。

サービスの定義では、各コンテナをサービスとして定義できます。このサービスを起動する時、コマンドラインの docker run のパラメータのような指定が可能です。同様に、ネットワークやボリュームの定義も docker network createdocker volume create と似ています。

docker run では、 Dockerfile で指定したオプション(例: CMDEXPOSEVOLUMEENV )はデフォルトとして尊重されます。そのため、 docker-compose.yml で再び指定する必要はありません。

Bash の ${変数} の構文のように、環境変数を使って設定を行えます。詳しくは 変数の置き換え をご覧ください。

サービス設定リファレンス

注釈

Compose ファイルの形式には、バージョン1(過去のフォーマットであり、ボリュームやネットワークをサポートしていません)とバージョン2(最新版)という2つのバージョンが存在します。詳しい情報は バージョン に関するドキュメントをご覧ください。

(Docker Composeの)サービス定義用にサポートされている設定オプションの一覧を、このセクションで扱います。

build

構築時に適用するオプションを指定します。

build で指定できるのは、構築用コンテクストのパスを含む文字列だけでなく、 context の配下にある特定の物(オブジェクト)や、 dockerfile のオプションと 引数 を指定できます。

build: ./dir

build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1

build だけでなく image も指定できます。 Compose は image で指定したタグを使い、構築したイメージをタグ付けします。

build: ./dir
image: webapp

これは ./dir で構築したイメージを webapp としてタグ付けしています。

注釈

バージョン1のフォーマット では、 build の使い方が異なります:

  • build: . の文字列のみ許可されています。オブジェクトは指定できません。
  • buildimage は同時に使えません。指定するとエラーになります。

context

注釈

context は バージョン2のフォーマット のみで利用可能です。バージョン1では build をお使いください。

コンテクスト(訳者注:内容物の意味)には Dockerfile があるディレクトリのパスや Git リポジトリの URL を指定します。

値に相対パスを指定したら、Compose ファイルのある場所を基準とした相対パスとして解釈します。また、指定したディレクトリが構築コンテクストとなり、Docker デーモンに送信します。

Compose は生成時の名前で構築・タグ付けし、それがイメージとなります。

build:
  context: ./dir

dockerfile

Dockerfile の代わりになるものです。

Compose は構築時に別のファイルを使えます。構築時のパスも指定する必要があります。

build:
  context: .
  dockerfile: Dockerfile-alternate

注釈

バージョン1のフォーマット とは dockerfile の使い方が異なります。

  • builddockerfile は並列であり、サブオプションではありません。

    build: . dockerfile: Dockerfile-alternate

  • dockerfileimage を同時に使えません。使おうとしてもエラーになります。

args

注釈

対応しているのは バージョン2のファイル形式 のみです。

構築時に build のオプション(args)を追加します。配列でも辞書形式(訳者注:「foo=bar」の形式)も指定できます。ブール演算子(true、false、yes、no)を使う場合はクォートで囲む必要があります。そうしませんと YAML パーサは True か False か判別できません。

構築時に引数のキーとして解釈する環境変数の値は、Compose を実行するマシン上のみです。

build:
  args:
    buildno: 1
    user: someuser

build:
  args:
    - buildno=1
    - user=someuser

cap_add, cap_drop

コンテナのケーパビリティ(capabilities)を追加・削除します。ケーパビリティの一覧は man 7 capabilities をご覧ください。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

command

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

command: bundle exec thin -p 3000

これは Dockerfile の書き方に似せることもできます。

command: [bundle, exec, thin, -p, 3000]

cgroup_parent

コンテナに対し、オプションの親グループを指定します。

cgroup_parent: m-executor-abcd

container_name

デフォルトで生成される名前の代わりに、カスタム・コンテナ名を指定します。

container_name: my-web-container

Docker コンテナ名はユニークである必要があります。そのため、カスタム名を指定時、サービスは複数のコンテナにスケールできなくなります。

devices

デバイス・マッピングの一覧を表示します。docker クライアントで作成する際の --device と同じ形式を使います。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

depends_on

サービス間の依存関係を指定したら、2つの効果があります。

  • docker-compose up を実行したら、依存関係のある順番に従ってサービスを起動します。以下の例では、 web を開始する前に dbredis を実行します。
  • docker-compose up サービス(の名称) を実行したら、自動的に サービス の依存関係を処理します。以下の例では、 docker-compose up web を実行したら、 dbredis も作成・起動します。

簡単なサンプル:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注釈

depends_on では、 web の実行にあたり、 dbredis の準備が整うのを待てません。待てるのはコンテナを開始するまでです。サービスの準備が整うまで待たせる必要がある場合は、 起動順番の制御 に関するドキュメントで、問題への対処法や方針をご確認ください。

dns

DNS サーバの設定を変更します。単一の値、もしくはリストになります。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

tmpfs

コンテナ内にテンポラリ・ファイルシステムをマウントします。単一の値もしくはリストです。

tmpfs: /run
tmpfs:
  - /run
  - /tmp

entrypoint

デフォルトの entrypoint を上書きします。

entrypoint: /code/entrypoint.sh

entrypoint は Dockerfile のように列挙できます。

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

env_file

ファイル上の定義から環境変数を追加します。単一の値、もしくはリストになります。

Compose ファイルを docker-compose -f ファイル名 で指定する場合は、 env_file ファイルは指定したディレクトリに対する相対パスとみなします。

環境変数で指定されている値は、 environment で上書きできます。

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

Compose は各行を 変数=値 の形式とみなします。 # で始まる行(例:コメント)は無視され、空白行として扱います。

# Rails/Rack 環境変数を設定
RACK_ENV=development

environment

環境変数を追加します。配列もしくは辞書形式(dictionary)で指定できます。boolean 値 (true、false、yes、no のいずれか) は、YML パーサによって True か False に変換されないよう、クォート( ' 記号)で囲む必要があります。

キーだけの環境変数は、Compose の実行時にマシン上で指定するものであり、シークレット(訳注:API鍵などの秘密情報)やホスト固有の値を指定するのに便利です。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

expose

ホストマシン上で公開するポートを指定せずに、コンテナの公開(露出)用のポート番号を指定します。これらはリンクされたサービス間でのみアクセス可能になります。内部で使うポートのみ指定できます。

expose:
 - "3000"
 - "8000"

extends

現在のファイルから別のファイルにサービスを拡張するもので、設定のオプションを追加します。

他の設定用のキーと一緒にサービスを extends (拡張)できます。 extends 値には service の定義が必要であり、オプションで file キーを指定します。

extends:
  file: common.yml
  service: webapp

サービスを拡張する service の名前とは、たとえば webdatabase です。 file はサービスを定義する Compose 設定ファイルの場所です。

file を省略したら、Compose は現在の設定ファイル上からサービスの定義を探します。 file の値は相対パスまたは絶対パスです。相対パスを指定したら、Compose はその場所を、現在のファイルからの相対パスとして扱います。

自分自身を他に対して拡張するサービス定義ができます。拡張は無限に可能です。Compose は循環参照をサポートしておらず、もし循環参照があれば docker-compose はエラーを返します。

extends に関するより詳細は、 extends ドキュメント をご覧ください。

extra_hosts

ホスト名を割り当てます。これは docker クライアントで --add-host パラメータを使うのと同じものです。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

コンテナ内の /etc/hosts に IP アドレスとホスト名のエントリが追加されます。例:

162.242.195.82  somehost
50.31.209.229   otherhost

image

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

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

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

注釈

バージョン1のファイル形式 では、 buildimage を同時に使えません。実行しようとしてもエラーが出ます。

labels

Docker ラベル を使いコンテナにメタデータを追加します。配列もしくは辞書形式で追加できます。

他のソフトウェアとラベルが競合しないようにするため、DNS 逆引き記法の利用を推奨します。

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""

labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

logging

注釈

バージョン2のファイル形式 のみ対応しています。バージョン1では log_driverlog_opt をお使いください。

サービスに対してログ記録の設定をします。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

driver にはコンテナのサービスに使うロギング・ドライバを指定します。これは docker run コマンドにおける --log-driver オプションと同じです ( ドキュメントはこちら )。

デフォルトの値は json-file です。

driver: "json-file"
driver: "syslog"
driver: "none"

注釈

docker-compose up で立ち上げた場合、 docker-compose logs コマンドでログを表示できるのは json-file ドライバを指定した時のみです。他のドライバを指定したら logs コマンドを実行しても画面に表示されません。

ロギング・ドライバのオプションを指定するには options キーを使います。これは docker run コマンド実行時の --log-opt オプションと同じです。

ロギングのオプションはキーバリューのペアです。以下は syslog オプションを指定する例です。

driver: "syslog"
options:
  syslog-address: "tcp://192.168.0.42:123"

log_driver

注釈

ファイル形式バージョン1 のオプションです。バージョン2では logging を使います。

ログ・ドライバを指定します。デフォルトは json-file(JSON ファイル形式)です。

log_driver: "syslog"

log_opt

注釈

ファイル形式バージョン1 のオプションです。バージョン2では logging を使います。

ログ記録のオプション、キー・バリューのペアで指定します。次の例は syslog のオプションです。

log_opt:
  syslog-address: "tcp://192.168.0.42:123"

net

注釈

ファイル形式バージョン1 のオプションです。バージョン2では network_mode を使います。

ネットワーク・モードを指定します。これは docker クライアントで --net パラメータを指定するのと同じものです。コンテナ名や ID の代わりに、 container:... で指定した名前が使えます。

net: "bridge"
net: "none"
net: "host"
net: "container:[サービス名かコンテナ名/id]"

network_mode

注釈

ファイル形式バージョン2 のオプションです。バージョン1では net を使います。

ネットワーク・モードです。 docker クライアントで --net パラメータを使うのと同じ働きですが、 サービス:[サービス名] の形式で指定します。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

注釈

ファイル形式バージョン2 のオプションです。バージョン1では使えません。

ネットワークに参加する時、トップ・レベルの network キー のエントリを参照します。

services:
  some-service:
    networks:
     - some-network
     - other-network

aliases

エイリアス(ホスト名の別名)は、ネットワーク上のサービスに対してです。同一ネットワーク上の他のコンテナが、サービス名またはこのエイリアスを使い、サービスのコンテナの1つに接続します。

aliases が適用されるのはネットワーク範囲内のみです。そのため、同じサービスでも他のネットワークからは異なったエイリアスが使えます。

注釈

複数のコンテナだけでなく複数のサービスに対しても、ネットワーク範囲内でエイリアスが利用できます。ただしその場合、名前解決がどのコンテナに対して名前解決されるのか保証されません。

一般的な形式は、以下の通りです。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

この例では、3つのサービス( webworkerdb )と2つのネットワーク( newlegacy )が提供されています。 db サービスはホスト名 db または database として new ネットワーク上で到達可能です。そして、legacy ネットワーク上では db または mysql として到達できます。

version: '2'

services:
  web:
    build: ./web
    networks:
      - new

  worker:
    build: ./worker
    networks:
    - legacy

  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql

networks:
  new:
  legacy:

IPv4 アドレス、IPv6 アドレス

サービスをネットワークに追加する時、コンテナに対して静的な IP アドレスを割り当てます。

トップレベルのネットワーク・セクション では、適切なネットワーク設定に ipam ブロックが必要です。ここで各静的アドレスが扱うサブネットやゲートウェイを定義します。 IPv6 アドレスが必要であれば、 com.docker.network.enable_ipv6 ドライバ・オプションを true にする必要があります。

例:

version: '2'

services:
  app:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  app_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "true"
    ipam:
      driver: default
      config:
      - subnet: 172.16.238.0/24
        gateway: 172.16.238.1
      - subnet: 2001:3984:3989::/64
        gateway: 2001:3984:3989::1

pid

pid: "host"

PID モードはホストの PID モードを設定します。有効化したら、コンテナとホスト・オペレーティング・システム間で PID アドレス空間を共有します。コンテナにこのフラグを付けて起動したら、他のコンテナからアクセスできるだけでなく、ベアメタル・マシン上の名前空間などから操作できるようになります。

ports

公開用のポートです。ホスト側とコンテナ側の両方のポートを指定( ホスト側:コンテナ側 )できるだけでなく、コンテナ側のポートのみも指定できます(ホスト側はランダムなポートが選ばれます)。

注釈

ホスト側:コンテナ側 の書式でポートを割り当てる時、コンテナのポートが 60 以下であればエラーが発生します。これは YAML が xx:yy 形式の指定を、60 進数(60が基準)の数値とみなすからです。そのため、ポートの割り当てには常に文字列として指定することを推奨します(訳者注: " で囲んで文字扱いにする)。

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"

security_opt

各コンテナに対するデフォルトのラベリング・スキーマ(labeling scheme)を上書きします。

security_opt:
  - label:user:USER
  - label:role:ROLE

stop_signal

コンテナに対して別の停止シグナルを設定します。デフォルトでは stop で SIGTERM を使います。 stop_signal で別のシグナルを指定したら、 stop 実行時にそのシグナルを送信します。

stop_signal: SIGUSR1

ulimits

コンテナのデフォルト ulimits を上書きします。単一の整数値で上限を指定できるだけでなく、ソフト/ハード・リミットの両方も指定できます。

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes, volume_driver

マウント・パスまたは名前を付けたボリュームは、オプションでホストマシン( ホスト:コンテナ )上のパス指定や、アクセス・モード( ホスト:コンテナ:rw ) を指定できます。 バージョン2のファイル では名前を付けたボリュームを使うにはトップ・レベルの volumes キー を指定する必要があります。 バージョン1 の場合は、ボリュームが存在していなければ Docker Engine が自動的に作成します。

ホスト上の相対パスをマウント可能です。相対パスは Compose 設定ファイルが使っているディレクトリを基準とします。相対パスは . または .. で始まります。

volumes:
  # パスを指定したら、Engine はボリュームを作成
  - /var/lib/mysql

  # 絶対パスを指定しての割り当て
  - /opt/data:/var/lib/mysql

  # ホスト上のパスを指定する時、Compose ファイルからのパスを指定
  - ./cache:/tmp/cache

  # ユーザの相対パスを使用
  - ~/configs:/etc/configs/:ro

  # 名前付きボリューム(Named volume)
  - datavolume:/var/lib/mysql

ホスト側のパスを指定せず、 volume_driver を指定したい場合があるかもしれません。

volume_driver: mydriver

バージョン2のファイル では、名前付きボリュームに対してドライバを適用できません( ボリュームを宣言する のではなく、 driver オプションを使ったほうが良いでしょう )。 バージョン1 の場合は、ドライバを指定すると名前付きボリュームにもコンテナのボリュームにも適用されます。

注釈

volume_driver も指定しても、パスは拡張されません。

詳しい情報は Docker ボリュームボリューム・プラグイン をご覧ください。

volumes_from

他のサービスやコンテナ上のボリュームをマウントします。オプションで、読み込み専用のアクセス( ro )や読み書き( rw )を指定できます。

volumes_from:
 - service_name
 - service_name:ro
 - container:container_name
 - container:container_name:rw

注釈

コンテナ:... の形式をサポートしているのは バージョン2のファイル形式 のみです。 バージョン1の場合 は、次のように明示しなくてもコンテナ名を使えます。

  • service_name
  • service_name:ro
  • container_name
  • container_name:rw

その他

cpu_shares、 cpuset、 domainname、 entrypoint、 hostname、 ipc、 mac_address、 mem_limit、 memswap_limit、 privileged、 read_only、 restart、 stdin_open、 tty、 user、 working_dir は、それぞれ単一の値を持ちます。いずれも docker run コマンドのオプションに対応しています。

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
stdin_open: true
tty: true

ボリューム設定リファレンス

サービス宣言の一部として、オン・ザ・フライでボリュームを宣言できます。このセクションでは名前付きボリューム(named volume)の作成方法を紹介します。このボリュームは複数のサービスを横断して再利用可能なものです( volumes_from に依存しません )。そして docker コマンドラインや API を使って、簡単に読み込みや調査が可能です。 docker volumes のサブコマンドの詳細から、詳しい情報をご覧ください。

driver

ボリューム・ドライバがどのボリュームを使うべきかを指定します。デフォルトは local です。ドライバを指定しなければ、Docker Engine はエラーを返します。

driver: foobar

driver_opts

ボリュームが使うドライバに対して、オプションをキーバリューのペアで指定します。これらのオプションはドライバに依存します。オプションの詳細については、各ドライバのドキュメントをご確認ください。

driver_opts:
  foo: "bar"
  baz: 1

external

このオプションを true に設定したら、Compose の外にあるボリュームを作成します(訳者注:Compose が管理していない Docker ボリュームを利用します、という意味)。 docker-compose up を実行してもボリュームを作成しません。もしボリュームが存在していなければ、エラーを返します。

external は他のボリューム用の設定キー( driverdriver_opts ) と一緒に使えません。

以下の例は、 [プロジェクト名]_data という名称のボリュームを作成する代わりに、Compose は data という名前で外部に存在するボリュームを探し出し、それを db サービスのコンテナの中にマウントします。

version: '2'

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgres/data

volumes:
  data:
    external: true

また、Compose ファイルの中で使われている名前を参照し、ボリューム名を指定可能です。

volumes
  data:
    external:
      name: actual-name-of-volume(実際のボリューム名)

ネットワーク設定リファレンス

ネットワークを作成するには、トップレベルの networks キーを使って指定します。Compose 上でネットワーク機能を使うための詳細情報は、 Compose のネットワーク機能 をご覧ください。

driver

対象のネットワークが使用するドライバを指定します。

デフォルトでどのドライバを使用するかは Docker Engine の設定に依存します。一般的には単一ホスト上であれば bridge でしょうし、 Swarm 上であれば overlay でしょう。

ドライバが使えなければ、Docker Engine はエラーを返します。

driver: overlay

driver_opts

ネットワークが使うドライバに対して、オプションをキーバリューのペアで指定します。これらのオプションはドライバに依存します。オプションの詳細については、各ドライバのドキュメントをご確認ください。

driver_opts:
  foo: "bar"
  baz: 1

ipam

IPAM (IPアドレス管理)のカスタム設定を指定します。様々なプロパティ(設定)を持つオブジェクトですが、各々の指定はオプションです。

  • driver :デフォルトの代わりに、カスタム IPAM ドライバを指定します。
  • config :ゼロもしくは複数の設定ブロック一覧です。次のキーを使えます。
    • subnet :ネットワーク・セグメントにおける CIDR のサブネットを指定します。
    • ip_range :コンテナに割り当てる IP アドレスの範囲を割り当てます。
    • gateway :マスタ・サブネットに対する IPv4 または IPv6 ゲートウェイを指定します。
    • aux_addresses :ネットワーク・ドライバが補助で使う IPv4 または IPv6 アドレスを指定します。これはホスト名を IP アドレスに割り当てるためのものです。

全てを使った例:

ipam:
  driver: default
  config:
    - subnet: 172.28.0.0/16
      ip_range: 172.28.5.0/24
      gateway: 172.28.5.254
      aux_addresses:
        host1: 172.28.1.5
        host2: 172.28.1.6
        host3: 172.28.1.7

external

このオプションを true に設定したら、Compose の外にネットワークを作成します(訳者注:Compose が管理していない Docker ネットワークを利用します、という意味)。 docker-compose up を実行してもネットワークを作成しません。もしネットワークが存在していなければ、エラーを返します。

external は他のネットワーク用の設定キー( driverdriver_optsipam ) と一緒に使えません。

以下の例は、外の世界とのゲートウェイに proxy を使います。 [プロジェクト名]_outside という名称のネットワークを作成する代わりに、Compose は outside という名前で外部に存在するネットワークを探し出し、それを proxy サービスのコンテナに接続します。

version: '2'

services:
  proxy:
    build: ./proxy
    networks:
      - outside
      - default
  app:
    build: ./app
    networks:
      - default

networks:
  outside:
    external: true

また、Compose ファイルの中で使われている名前を参照し、ネットワーク名を指定可能です。

networks:
  outside:
    external:
      name: actual-name-of-network

バージョン

Compose ファイル形式には2つのバージョンがあります。

  • バージョン1は過去のフォーマットです。YAML の冒頭で version キーを指定不要です。
  • バージョン2は推奨フォーマットです。YAML の冒頭で version: '2' のエントリを指定します。

プロジェクトをバージョン1からバージョン2に移行する方法は、 アップグレード方法 のセクションをご覧ください。

注釈

複数の Compose ファイル拡張サービス を使う場合は、各ファイルが同じバージョンでなくてはいけません。1つのプロジェクト内でバージョン1と2を混在できません。

バージョンごとに異なった制約があります。

  • 構造と利用可能な設定キー
  • 実行に必要な Docker Engine の最低バージョン
  • ネットワーク機能に関する Compose の挙動

これらの違いを、以下で説明します。

バージョン1

Compose ファイルでバージョンを宣言しなければ「バージョン1」として考えます。バージョン1では、ドキュメントの冒頭から全ての サービス を定義します。

バージョン1は Compose 1.6.x まで サポートされます。今後の Compose バージョンでは廃止予定です。

バージョン1のファイルでは volumesnetworksbuild 引数 を使えません。

例:

web:
  build: .
  ports:
   - "5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis

バージョン2

バージョン2の Compose ファイルでは、ドキュメントの冒頭でバージョン番号を明示する必要があります。 services キーの下で全ての サービス を定義する必要があります。

バージョン2のファイルは Compose 1.6.0 以上 でサポートされており、実行には Docker Engine 1.10.0 以上 が必要です。

名前付き ボリューム の宣言は volumes キーの下で行えます。また、名前付き ネットワーク の宣言は networks キーの下で行えます。

シンプルな例:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: redis

ボリュームとネットワークを定義するよう拡張した例:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    networks:
      - front-tier
      - back-tier
  redis:
    image: redis
    volumes:
      - redis-data:/var/lib/redis
    networks:
      - back-tier
volumes:
  redis-data:
    driver: local
networks:
  front-tier:
    driver: bridge
  back-tier:
    driver: bridge

アップグレード方法

ほとんどの場合、バージョン1から2への移行はとても簡単な手順です。

  1. 最上位レベルとして services: キーを追加する。
  2. ファイルの1行め冒頭に version: '2' を追加する。

特定の設定機能を使っている場合は、より複雑です。

  • dockerfilebuild キー配下に移動します。
build:
  context: .
  dockerfile: Dockerfile-alternate
  • log_driverlog_opt :これらは logging キー以下です。
logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"
  • links と環境変数: 環境変数リファレンス に文章化している通り、links によって作成される環境変数機能は、いずれ廃止予定です。新しい Docker ネットワーク・システム上では、これらは削除されています。ホスト名のリンクを使う場合は、適切なホスト名で接続できるように設定するか、あるいは自分自身で代替となる環境変数を指定します。
web:
  links:
    - db
  environment:
    - DB_PORT=tcp://db:5432
  • external_links : バージョン2のプロジェクトを実行する時、 Compose は Docker ネットワーク機能を使います。つまり、これまでのリンク機能と挙動が変わります。典型的なのは、2つのコンテナが通信するためには、少なくとも1つのネットワークを共有する必要があります。これはリンク機能を使う場合でもです。

外部のコンテナがアプリケーションの デフォルト・ネットワーク に接続する場合や、自分で作成したサービスが外部のコンテナと接続するには、 外部ネットワーク機能 を使います。

  • net :これは network_mode に置き換えられました。
net: host    ->  network_mode: host
net: bridge  ->  network_mode: bridge
net: none    ->  network_mode: none

net: "コンテナ:[サービス名]" を使っていた場合は、 network_mode: "サービス:[サービス名]" に置き換える必要があります。

net: "container:web"  ->  network_mode: "service:web"

net: "コンテナ:[コンテナ名/ID]" の場合は変更不要です。

net: "container:cont-name"  ->  network_mode: "container:cont-name"
net: "container:abc12345"   ->  network_mode: "container:abc12345"

net: "container:abc12345" -> network_mode: "container:abc12345"

  • volumes を使う名前付きボリューム:Compose ファイル上で、トップレベルの volumes セクションとして明示する必要があります。 data という名称のボリュームにサービスがマウントする必要がある場合、トップレベルの volumes セクションで data ボリュームを宣言する必要があります。記述は以下のような形式です。
version: '2'
services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data
volumes:
  data: {}

デフォルトでは、 Compose はプロジェクト名を冒頭に付けたボリュームを作成します。 data のように名前を指定するには、以下のように宣言します。

volumes:
  data:
    external: true

変数の置き換え

設定オプションでは環境変数も含めることができます。シェル上の Compose は docker-compose の実行時に環境変数を使えます。たとえば、シェルで EXTERNAL_PORT=8000 という変数を設定ファイルで扱うには、次のようにします。

web:
  build: .
  ports:
    - "${EXTERNAL_PORT}:5000"

この設定で docker-compose up を実行したら、Compose は EXTERNAL_PORT 環境変数をシェル上で探し、それを値と置き換えます。この例では、Compose が web コンテナを作成する前に "8000:5000" のポート割り当てをします。

環境変数が設定されていなければ、Compose は空の文字列に置き換えます。先の例では、 EXTERNAL_PORT が設定されなければ、 ポートの割り当ては :5000 になります(もちろん、これは無効なポート割り当てなため、コンテナを作成しようとしてもエラーになります)。

$変数${変数} の両方がサポートされています。シェルの拡張形式である $変数-default${変数/foo/bar} はサポートされません。

$$ (二重ドル記号)を指定する時は、設定ファイル上でリテラルなドル記号の設定が必要です。Compose は値を補完しませんので、 $$ の指定により、 Compose によって処理されずに環境変数を参照します。

web:
  build: .
  command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"

もしも間違えてドル記号( $ )だけにしたら、 Compose は環境変数の値を解釈し、次のように警告を表示します。

The VAR_NOT_INTERPOLATED_BY_COMPOSE is not set. Substituting an empty string.