読者です 読者をやめる 読者になる 読者になる

aspec7's garage

エンジニア生活の中で学んだことの備忘録

docker-compose.ymlの命令を理解して、よりDockerを有効活用したい!

Docker

f:id:aspec7:20151108133222j:plain

Dockerの進歩は早いですね・・
Docker1.9からWindowsでもdocker-composeが使えるようになりました。
これで気軽にcomposeが使えるようになりますね。
またマニュアルを読んでコンフィグファイルの使い方を整理したいと思います。
以降は、マニュアル内容の転記&要約です。
最新情報や正しい情報はマニュアルが正となりますので予めご了承ください。

公式のマニュアル

Compose file reference

基本的な形式

docker-compose.ymlYAMLファイルです。
表記方法は、通常のYAML(参考wikipedia)表記です。

命令

以下でdocker-compose.ymlで使える命令について説明していきます。

build

Dockerfileが保存されているディレクトリを指定します。
また、ビルド時のベースとなるディレクトリでもあります。 相対パスを指定した時は、ymlファイルを基準とした場所として解釈します。 (imageと併用はできません。)

build: /path/to/build/dir

cap_add, cap_drop

コンテナのcapabilityの調整を行います。
設定できるものは下記のマニュアル「man 7 capabilities」を参照してください。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

command

デフォルトで設定したコマンドを上書きするときに指定します。

command: bundle exec thin -p 3000

cgroup_parent

コンテナが属するControl Group【参考リンク】第3回 Linuxカーネルのコンテナ機能[2] ─cgroupとは?(その1))を指定します。

cgroup_parent: m-executor-abcd

container_name

docker-composeでは自動でコンテナ名が割り当てられます。
このオプションは、コンテナ名を直接指定したい場合に使用します。
コンテナ名は、ユニークである必要があります。

container_name: my-web-container

devices

docker client--deviceオプションと同じです。
デバイスをマッピングするために使います。
リストで指定します。

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

dns

使用するDNSサーバを直接指定したい場合に指定します。
単体またはリストで指定できます。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search

DNSを検索指定させる場合に指定します。
単体またはリストで指定できます。

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

dockerfile

Dockerfile以外の名称で保存したDockerfileファイルのファイル名またはファイルへのパスを指定します。 (imageと併用はできません。)

dockerfile: Dockerfile-alternate

env_file

環境変数を設定したファイルを読み込む設定です。
docker-compose -f FILEで指定する際は、相対パスで指定します。
後述のenvironmentで同じ変数を指定した場合は、ここで指定した値を上書きします。
単体またはリストで指定できます。

env_file: .env

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

ファイルの内容は一行ずつ解釈されます。
VAR=VALで指定します。
#で始まる行と、空行は無視されます。

# Set Rails/Rack environment
RACK_ENV=development

environment

環境変数を指定します。
配列形式、または辞書形式でも指定できます。
指定の際、YAMLパーサーが正しく変換できるようboolean型の値(true,false,yes,no)についてはクォートで囲います。

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

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

expose

コンテナの解放ポートを指定します。

expose:
 - "3000"
 - "8000"

extends

他のファイルで定義されている内容をベースとして拡張したい場合に、ベースとなるサービス名、およびファイルを指定します。
serviceの指定は必須です。
fileはオプションです。fileは、serviceが定義されているファイルを絶対パス相対パスで指定します。
fileの指定がない場合は、カレントファイルの中からサービス名がピックアップされます。
(継承関係がループするような指定になるとエラーとなります。)

extends:
  file: common.yml
  service: webapp

external_links

docker-compose.yml内で定義されていない起動中のコンテナへのリンクを作成する際に使います。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

extra_hosts

docker client--add-hostと同じ機能です。
コンテナに、ホスト名とIPアドレスマッピングする際に使用します。

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

マッピングされた情報は、/etc/hostsに下記のように定義されます。

162.242.195.82  somehost
50.31.209.229   otherhost

image

タグか、イメージIDを指定します。
ローカルに指定したイメージが見つからない場合は、リモートから取得します。

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

labels

Docker labels形式でメタデータを定義します。
配列形式、または辞書形式でも指定できます。

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

他のサービスをコンテナにリンクさせます。
サービス名に別名をつける場合はSERVICE:ALIASの形式で指定します。
別名を省略した場合は、サービス名がそのまま別名として使われます。

links:
 - db
 - db:database
 - redis

マッピングされた情報は、/etc/hostsに下記のように定義されます。

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

log_driver

コンテナのログドライバを明示的に指定する場合に使用します。
docker run--log-driverと同じです。
デフォルトは、json-fileです。

log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"

log_opt

ロギングドライバのオプションを指定する場合に使用します。
docker run--log-optと同じです。
キーバリューのペアで指定します。

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

net

ネットワークモードを指定します。
docker client--netオプションと同じです。

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

pid

PIDモードをホストのPIDに切り替えます。
この切り替えにより、ホストOS側でPID管理ができるようになります。

pid: "host"

ports

ホストOS側のポートと、コンテナ側のポートをマッピングします。
HOST:CONTAINERの形式で指定します。
コンテナポートのみ指定した場合は、ホスト側のポートはランダムに値がマッピングされます。

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

各コンテナのデフォルトのラベルスキーマを上書きします。

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

volumes, volume_driver

マウントするボリュームのパスを定義します。 ホストマシンのパスを指定する場合は、HOST:CONTAINERの形式で指定します。
その際読み取り専用の場合はHOST:CONTAINER:roと指定できます。

volumes:
 - /var/lib/mysql
 - ./cache:/tmp/cache
 - ~/configs:/etc/configs/:ro

ボリューム名を使いたい場合は、volume_driverでボリューム名を定義します。

volume_driver: mydriver

volumes_from

他のコンテナやサービスで定義されているマウント情報をそのまま使いたい場合に、その元となるコンテナ名やサービス名を指定します。
読み取り専用の場合はro、読み書き用途にはrwとして指定できます。

volumes_from:
 - service_name
 - container_name
 - service_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
cpuset: 0,1

entrypoint: /code/entrypoint.sh
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

環境変数を使用時の注意点

docker-composeを実行時に、オプションで環境変数(例えばPOSTGRES_VERSION=9.3のように)を与えると、その変数はコンフィグ内で下記のように取得できます。
(この場合、imageはpostgres:9.3として解釈されます。)
変数取得には、$VARIABLE${VARIABLE}形式どちらもサポートされます。

db:
  image: "postgres:${POSTGRES_VERSION}"

上記のように指定して、実行時に環境変数を指定しない場合は、空文字がセットされます。
(その場合は、postgres:として解釈されます。)

また、下記のようにcommand内の環境変数として$を使いたい場合$$としておくと$文字として認識され、command実行時に環境変数を使います。
間違って$で指定してしまうと、docker-compose実行時に環境変数として解釈されてしまいます。

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