docker-composeとは
複数のコンテナをまとめて管理するためのツール
docker-compose.ymlにコンテナの構成情報を定義することで、同一のホスト常の複数コンテナを一括管理できます。
docker-compose
Webアプリケーションの依存関係をまとめて設定できます。
複数のコンテナを的mて起動したり停止したりできる。
コンテナの構成情報をYAML形式のファイルとして管理できるため、継続的デプロイやインテグレーションのプロセスに置いて自動テストを行うときに環境構築でそのまま利用できる。
docker-compose.ymlの概要
versionによってかける内容が異なる。
今回かくのは、3.3です。
サンプルファイル
#バージョンの指定
version: "3"
#サービス定義
services:
webserver:
image: ubuntu
ports:
- "80:80"
networks:
- webnet
redis:
image: redis
networks:
- webnet
#ネットワーク定義
networks:
webnet:
#データボリューム定義
volumes:
data-volume:
イメージの指定
imagesを使って指定する。
#サービス定義
services:
webserver:
image: ubuntu
イメージのビルド
buildを使って指定する。
#サービス定義
services:
webserver:
build: . #カレントディレクトリ
カレントディレクトリにDockerfileも用意し、ベースイメージを指定する、
Dockerfileで指定されたイメージが自動ビルドされる。
contextでDockerfileがあるディレクトリを指定して、指定したファイルをDockerfileとして読み込める。
#サービス定義
services:
webserver:
build:
context: /work
dockerfile: Dockerfile-all
コンテナ内で動かすコマンドを指定
command: /bin/bash
entrypointを上書きすることも可能です。
コンテナ間の連携
logserverに連携したい場合は、以下のように書く。エイリアス名を付けたいときは「サービス名:エイリアス名」を書く
links:
- logserver
- logserver:log01
コンテナ間の通信
コンテナが公開するポートは、portsで指定。
ホストマシンのポート番号:コンテナのポート番号を指定するか、コンテナのポート番号のみを指定する。
コンテナポート飲みを指定したときは、ホストマインのポートはライダムな値が設定される。
ports:
- "3000"
- "8000:8000"
- "127.0.0.1:8001:8001"
ホストマシンへポートを公開せず、リンク機能を使って連携するコンテナにのみポートを公開するときはexpose
expose:
- "3000"
- "8000"
サービスの依存関係の定義
webserverコンテナを開始する前にdbコンテナとredisコンテナを開始したいとき
services:
webserver:
build:
depends_on:
- db
- redis
redis:
images: redis
db:
image: postgres
depend_onがコンテナの開始の順序を制御するだけで、コンテナ上のアプリケーションが利用可能になるまで待つという制御を行わない。
=> アプリケーション側での制御が必要。
コンテナの環境変数の指定
enviroment:
- HOGE=fuga
- FOO
設定したい環境変数が多いときは、別ファイルに環境変数を定義して、そのフォイルを読み込みこともできる。
env_file:
- ./envfile1
- ./app/envfile2
コンテナ名の指定
container_name: コンテナ名
コンテナ名は一意でないといけない。
コンテナのデータ管理
ボリュームの指定
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
ボリュームの読み取り専用の指定
:roをつけると、読み取り専用になり、書き込みができなくなります。設定ファイルなどに付与。
volumes:
- ~/config:/etc/configs/:ro
ボリュームのマウント指定
別のコンテナから全てのボリュームをマウントするときは、volumes_fromにコンテナ名を指定する
volumes_from:
- log