docker-compose 備忘録 ymlファイル編
1.yamlファイル
docker-compose.ymlはYAML形式で記述される。
<YAMLファイルの文法概要>
・空白のインデントは構造を示すために使わる。空白にタブは使用できない。
・配列(リスト)は「ハイフン - 」と「スペース」で記述。
例: - aaa
・連想配列(ディクショナリ)は「コロン :」と「スペース」で記述。
例: aaa: bbb
・コメントは「ハッシュ記号 #」で記述。
2.docker-compose.yml概要
docker-compose.ymlは複数のコンテナから成るサービスを構築・実行する手順を自動化するための定義ファイル。
version, services, networks, volumes の4つを定義する。
versionによってDockerエンジンの対応versionと構成の記述が異なる。
3.version構成要素
3つの大きなバージョンがある。
version: 1.0(非推奨)、version: 2.0~2.4、version: 3.0~
マイナーバージョンを指定しないとマイナーバージョン0とみなされる。
4.service構成要素
build
ビルド時に適用される。
ビルドコンテキストへのパスを含む文字列を指定。
version: "3.9"
services:
webapp:
build: ./dir
またはcontext、dockerfile、argsを使って指定する。
version: "3.9"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
buildとimageを使用するとimageで指定したイメージ名:タグ付けされる。
下記はカレントのDockerfileでビルドを行いwebapp:7のイメージ名、タグになる。
build: .
image: webapp:7
buildとnetworkを使用するとビルド中の手順で接続するネットワークコンテナを設定する(version: 3.4で追加)
build: .
network: customer_network
noneを指定するとビルド中のネットワークを無効にする
build: .
network: none
image
コンテナを実行時に元となるイメージを指定する。リポジトリ名:タグ、イメージIDの一部を指定できる。
イメージが存在していない場合、Composeはpullを試みる。
しかし、buildが指定されている場合はbuildを行い、imageで指定したイメージ名:タグ付けを行う。
command
ディフォルトのコマンドをオーバーライドする。
command: bundle exec thin -p 3000
container_name
生成されたディフォルト名ではなくカスタムコンテナ名を指定する。
container_name: my-web-container
depends_on
サービス間の依存関係を表現する。サービスの依存関係により次の動作が発生する。
・docker-compose up
当該サービスはdepends_onで指定したサービスが起動してから開始する。
・docker-compose stop
当該サービスはdepends_onで指定したサービスが停止する前に停止する。
#docker -compose upでservice_a→service_b→service_cの順で起動
#docker -compose downでservice_c→service_b→service_aの順で停止
version: 3
services:
service_a:
service_b:
depends_on:
- service_a
service_c:
depends_on:
- service_a
- service_b
env_file
ファイルを用いて環境変数を追加する。設定は1つだけとするか、リストにすることができる。
※buildオプションを使用している場合はenv_fileは参照されない。この場合はbuildのサブオプションargsを指定。
#1つだけ
env_file: .env
#複数
env_file:
- ./common.env
- ./web.env
environment
環境変数を指定する。辞書形式または配列での指定が可能。
ブール値true,false,yes,noを用いる場合はクォートで囲むことでYAMLパーサーによってTrueやFalseに変換されてしまうのを防ぐ必要がある。
環境変数だけが設定されている場合はComposeが起動しているマシン上で定義されている値が設定される。
※buildオプションを使用している場合はenvironmentは参照されない。この場合はbuildのサブオプションargsを指定。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
expose
ホストマシンにはポートを公開せずにサービス内にポートを公開する。
expose:
- "3000"
- "8080"
extra_hosts
ホスト名を割り当てる。コンテナ内の/etc/hostsにIPアドレスとホスト名のエントリが追加される。
extra_hosts:
- "192.168.0.1:webhost"
- "192.168.0.2:dbhost"
logging
サービスに対してログ記録の設定をする。
設定なしの場合はjson-fileに書き込む。
このときjson-fileの保存場所はcentos7の場合、
/var/lib/docker/containers/<container id>/<container id>-json.log
#/var/lib/docker/containers/<container id>/local-logsにバイナリーで格納
#ログの内容はdocker logs <container id>で行う
logging:
driver: local
#journaldに出力する。
#ログの内容確認はdocker-compose logs、docker logs、journalctlで行う。
logging:
driver: journald
#syslogに出力する。
#別途、rsyslog.confの設定が必要
#内容の確認は出力したログファイルを見る。
#tagで指定した内容がログに書き込まれる。
#docker-serviceは任意の固定文言
#{{.Name}}はコンテナ名
#{{.ID}}はコンテナID
logging:
driver: syslog
syslog-facility: daemon
tag: docker-service/{{.Name}}/{{.ID}}
#ログ出力例
Jun 11 16:09:47 intra docker-service/opt2_mysql_1/1025725fd75d[1371]: 2021-06-11T07:09:47.950093Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
network_mode
ディフォルトのnetwork_modeはbridgeだがホストネットワークと同じにする場合はnetwork_mode: hostとする。このときポートはexposeを使用する。
※Linuxのみ
docker-compose.yml
version: '3'
services:
web:
image: httpd:2.4-alpine
expose:
- "80"
network_mode: host # ホストのネットワークでコンテナを実行
networks
ディフォルトではプロジェクト名_defaultがネットワーク名になる。
(プロジェクト名は何も指定しないとカレントのディレクトリ名)
ディフォルトのネットワークを使用しないときはnetworksで参加するネットワークを指定する。
docker-compose.yml
version: '3'
services:
web:
image: httpd:2.4-alpine
networks:
- mynetwork
ports
公開用のポート。"ホスト側ポート:コンテナ側ポート"で指定する。
コンテナ側のポートのみの指定も可能。このときホスト側ポートはランダムなポートが選ばれる。
ポートの指定はダブルコーテーションで囲んで文字列扱いを推奨
ports:
- "8080:80"
- "8443:443"
volumes(サービス構成要素)
ホストまたはボリュームをコンテナ側のマウントポイントにマウントする。
servicesの中で定義されるvolumesはバインドマウントと呼ばれる。
ホスト上の相対パスを指定可能。相対パスはCompose設定ファイルのカレントディレクトリを基準とする。相対パスは .または ..で始まる。
記述例 ホストまたはボリューム:コンテナのマウントポイント
--volume (または -v )<volume_name>:<mountpoint>と同じ。
#前提 コンテナ内のマウントポイントは/var/lib/mysql
volumes:
- /var/lib/data #名前なしボリュームをコンテナにマウント
- datavolume:/var/lib/data #名前付きボリュームをコンテナにマウント
- /opt/data:/var/lib/data #ホストの/opt/dataをコンテナにマウント
5.ボリューム構成要素
名前付きボリュームを作成する宣言
version: "3"
services:
mysql:
image: mysql
volumes:
- mysql-db:/var/lib/mysql
volumes:
mysql-db:
driver: local
名前付きボリューム(ホストのパス指定)を作成する宣言
version: "3"
services:
mysql:
image: mysql
volumes:
- mysql-db:/var/lib/mysql
volumes:
mysql-db:
driver_opts:
type: none
device: /home/docker/data/mysql
o: bind