Compose ファイル・リファレンス¶
Compose ファイルは YAML ファイルであり、 サービス(services) 、 ネットワーク(networks) 、 ボリューム(volumes) を定義します。Compose ファイルのデフォルトのパスは ./docker-compose.yml
です。
サービスの定義では、各コンテナをサービスとして定義できます。このサービスを起動する時、コマンドラインの docker run
のパラメータのような指定が可能です。同様に、ネットワークやボリュームの定義も docker network create
や docker volume create
と似ています。
docker run
では、 Dockerfile で指定したオプション(例: CMD
、 EXPOSE
、 VOLUME
、ENV
)はデフォルトとして尊重されます。そのため、 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: .
の文字列のみ許可されています。オブジェクトは指定できません。build
とimage
は同時に使えません。指定するとエラーになります。
context¶
注釈
context は バージョン2のフォーマット のみで利用可能です。バージョン1では build をお使いください。
コンテクスト(訳者注:内容物の意味)には Dockerfile があるディレクトリのパスや Git リポジトリの URL を指定します。
値に相対パスを指定したら、Compose ファイルのある場所を基準とした相対パスとして解釈します。また、指定したディレクトリが構築コンテクストとなり、Docker デーモンに送信します。
Compose は生成時の名前で構築・タグ付けし、それがイメージとなります。
build:
context: ./dir
dockerfile¶
Dockerfile の代わりになるものです。
Compose は構築時に別のファイルを使えます。構築時のパスも指定する必要があります。
build:
context: .
dockerfile: Dockerfile-alternate
注釈
バージョン1のフォーマット とは dockerfile
の使い方が異なります。
build
とdockerfile
は並列であり、サブオプションではありません。build: . dockerfile: Dockerfile-alternate
dockerfile
とimage
を同時に使えません。使おうとしてもエラーになります。
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]
container_name¶
デフォルトで生成される名前の代わりに、カスタム・コンテナ名を指定します。
container_name: my-web-container
Docker コンテナ名はユニークである必要があります。そのため、カスタム名を指定時、サービスは複数のコンテナにスケールできなくなります。
devices¶
デバイス・マッピングの一覧を表示します。docker クライアントで作成する際の --device
と同じ形式を使います。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
depends_on¶
サービス間の依存関係を指定したら、2つの効果があります。
docker-compose up
を実行したら、依存関係のある順番に従ってサービスを起動します。以下の例では、web
を開始する前にdb
とredis
を実行します。
docker-compose up サービス(の名称)
を実行したら、自動的にサービス
の依存関係を処理します。以下の例では、docker-compose up web
を実行したら、db
とredis
も作成・起動します。
簡単なサンプル:
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注釈
depends_on
では、 web
の実行にあたり、 db
と radis
の準備が整うのを待てません。待てるのはコンテナを開始するまでです。サービスの準備が整うまで待たせる必要がある場合は、 起動順番の制御 に関するドキュメントで、問題への対処法や方針をご確認ください。
dns_search¶
DNS の検索ドメインを変更します。単一の値、もしくはリストになります。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
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
の名前とは、たとえば web
や database
です。 file
はサービスを定義する Compose 設定ファイルの場所です。
file
を省略したら、Compose は現在の設定ファイル上からサービスの定義を探します。 file
の値は相対パスまたは絶対パスです。相対パスを指定したら、Compose はその場所を、現在のファイルからの相対パスとして扱います。
自分自身を他に対して拡張するサービス定義ができます。拡張は無限に可能です。Compose は循環参照をサポートしておらず、もし循環参照があれば docker-compose
はエラーを返します。
extends
に関するより詳細は、 extends ドキュメント をご覧ください。
external_links¶
対象の docker-compose.yml
の外にあるコンテナだけでなく、Compose の外にあるコンテナとリンクします。特に、コンテナが共有サービスもしくは一般的なサービスを提供している場合に有用です。 external_links
でコンテナ名とエイリアスを指定すると( コンテナ名:エイリアス名
)、 link
のように動作します。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注釈
バージョン2のファイル形式 を使う時、外部に作成したコンテナと接続する必要があれば、接続先のサービスは対象ネットワーク上に少なくとも1つリンクする必要があります。
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のファイル形式 では、 build
と image
を同時に使えません。実行しようとしてもエラーが出ます。
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"
links¶
コンテナを他のサービスとリンクします。サービス名とリンク用エイリアスの両方を指定できます( サービス名:エイリアス名
)。あるいはサービス名だけの指定もできます(このサービス名はエイリアス名としても使われます)。
links:
- db
- db:database
- redis
リンクするサービスのコンテナは、エイリアスとして認識できるホスト名で到達(接続)可能になります。エイリアスが指定されなければ、サービス名で到達できます。
また、サービス間の依存関係は depends_on を使っても同様に指定できますし、サービスを起動する順番も指定できます。
注釈
links と networks を両方定義する時は、リンクするサービスが通信するために、ネットワークの少なくとも1つを共有する必要があります。
logging¶
注釈
バージョン2のファイル形式 のみ対応しています。バージョン1では log_driver と log_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つのサービス( web
、 worker
、 db
)と2つのネットワーク( new
と legacy
)が提供されています。 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
は他のボリューム用の設定キー( driver
、driver_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
は他のネットワーク用の設定キー( driver
、driver_opts
、 ipam
) と一緒に使えません。
以下の例は、外の世界とのゲートウェイに 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のファイルでは volumes 、 networks 、 build 引数 を使えません。
例:
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への移行はとても簡単な手順です。
- 最上位レベルとして
services:
キーを追加する。 - ファイルの1行め冒頭に
version: '2'
を追加する。
特定の設定機能を使っている場合は、より複雑です。
dockerfile
:build
キー配下に移動します。
build:
context: .
dockerfile: Dockerfile-alternate
log_driver
、log_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.