Docker Composeの必要性
下記記事で、1つのコンテナにミドルウェアをすべてインストールするのではなく、Wordpressであれば、MySQL用のコンテナとWordpress本体用のコンテナに分けるという話をしました。
それに伴って、docker network の設定も必要になります。
実行するときは、コンテナごとにdocker run する必要があります。
2つのコンテナを同一Dockerネットワーク上で動かすだけならまだ簡単ですが、さらにコンテナ数が増えてくると手間が増えます。
そここで、複数コテンナを使った環境構築に関する設定を、1つのYAMLファイルに定義できる仕組みがDocker Composeです。
Docker Composeを使うことで、1つのアプリ起動に必要なコンテナ群を一元管理することができるようになります。
Docker Composeのインストール
MacやWindowsでは、Docker Desktopをインストールした時点で、Docker Composeも使えるようになっている。
$ docker --version
Docker version 20.10.7, build f0df350
$ docker compose help
Usage: docker compose [OPTIONS] COMMAND
Docker Compose
Options:
--ansi string Control when to print ANSI control
characters ("never"|"always"|"auto")
(default "auto")
--env-file string Specify an alternate environment file.
-f, --file stringArray Compose configuration files
--profile stringArray Specify a profile to enable
--project-directory string Specify an alternate working directory
(default: the path of the Compose file)
-p, --project-name string Project name
docker-compose.ymlの書き方
- コンテナ群の定義ファイルは必ず「docker-compose.yml」とする決まりである。
- 定義ファイルは1つのフォルダに1つのみ置く決まりである。
- コンテナ群=コンテナの集合体のことを「サービス」と呼ぶ。
構文
version: | docker-composeのバージョン。 現在は通常、"3"を指定。 | |
services: | コンテナの定義 | |
image | 利用するイメージを指定する。 | |
ports | ポートの転送先を指定する。 -pに相当。 | |
environment | 環境変数を指定する。 -eに相当。 | |
depends_on | 依存するサービスを指定する。 (先に起動しておくべきサービスを指定) | |
restart | コンテナが停止したときの再開ポリシーを指定する。 | |
networks: | ネットワークの定義 | |
volumes: | ボリュームの定義 |
version/services/network/volumesが大項目です。
docker-composeの文法上の注意点
- 項目名の後に値を書く場合は、半角スペースで1つ空ける。 ex)version: "1"
- 項目の中に項目を入れる場合は、半角スペースで2つ空ける。
- コメントは#を使う。
例 ワードプレス用コテンナ、MySQL用コンテナを構築する場合
version: "1"
services:
wp1mysql:
image: mysql:5.7
networks:
- wp1net
volumes:
- wp1mysqlvol:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wp
MYSQL_USER: user
MYSQL_PASSWORD: pass
wp1wp:
depends_on:
- wp1mysql
image: wordpress
networks:
- wp1net
volumes:
- wp1wpvol:/var/www/html
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST: wp1mysql
WORDPRESS_DB_NAME: wp
WORDPRESS_DB_USER: user
WORDPRESS_DB_PASSWROD: pass
networks:
wp1net:
volumes:
wp1mysqlvol:
wp1wpvol:
上記例は次の構成である。
- services(コンテナ)
- MySQL用コンテナ(wp1mysql)
- WordPress用コンテナ(wp1wp)
- networks(ネットワーク)
- wp1net
- volumes(ボリューム)
- MySQL用ボリューム(wp1mysqlvol)
- WordPress用ボリューム(wp1wpvol)
Dockerコンテナ群を起動する -> docker-compose up
$ cd /path/to/docker-composefile
$ docker-compose up -d
[+] Running 4/4
- Network wp1_wp1net Created 0.0s
- Network wp1_default Created 0.1s
- Container wp1_wp1mysql_1 Started 1.9s
- Container wp1_wp1wp_1 Started 2.5s
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84fa5cdccd21 b77ea6f8ecf7 "docker-entrypoint.s…" 8 seconds ago Up 5 seconds 0.0.0.0:8085->80/tcp, :::8085->80/tcp wp1_wp1wp_1
9f844a348801 09361feeb475 "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 3306/tcp, 33060/tcp wp1_wp1mysql_1
docker-compose up コマンドを実行する前に、docker-compose.ymlのあるディレクトリに移動することで、-fオプションなしでコンテナ群を起動できます。
-dオプションはバックグラウンドで実行します。-dがないと、続けてコマンド入力できなくなりますので、あった方がいいでしょう。
can't find a suitable configuration file in this directory or any parent: not found
$ docker-compose up -d
can't find a suitable configuration file in this directory or any parent: not found
カレントディレクトリにdocker-compose.ymlが存在しない場合、上記のエラーになります。
docker-compose.ymlのあるディレクトリに移動してから実行してください。
-f オプションでdocker-compose.ymlを指定する
$ docker-compose -f wp1/docker-compose.yml up -d
上記のように、-fオプションに続いて、docker-compose.ymlのディレクトリを相対or絶対パスで指定することができます。
Dockerコンテナ群を停止する -> docker-compose stop
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84fa5cdccd21 b77ea6f8ecf7 "docker-entrypoint.s…" 8 seconds ago Up 5 seconds 0.0.0.0:8085->80/tcp, :::8085->80/tcp wp1_wp1wp_1
9f844a348801 09361feeb475 "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 3306/tcp, 33060/tcp wp1_wp1mysql_1
$ docker-compose stop
[+] Running 2/2
- Container wp1_wp1wp_1 Stopped 2.2s
- Container wp1_wp1mysql_1 Stopped 2.2s
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84fa5cdccd21 b77ea6f8ecf7 "docker-entrypoint.s…" 13 minutes ago Exited (0) 6 seconds ago wp1_wp1wp_1
9f844a348801 09361feeb475 "docker-entrypoint.s…" 13 minutes ago Exited (0) 3 seconds ago wp1_wp1mysql_1
docker-compose stopコマンドでコンテナ群をまとめて停止します。
docker ps -a コマンドで見ると、コンテナ群が残っていることがわかります。
docker-compose stop も docker-compose up 同様に、docker-compose.ymlのあるディレクトリで実行するか、-fオプションで指定する必要があります。
Dockerコンテナ群を停止・削除する -> docker-compose down
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84fa5cdccd21 b77ea6f8ecf7 "docker-entrypoint.s…" 8 seconds ago Up 5 seconds 0.0.0.0:8085->80/tcp, :::8085->80/tcp wp1_wp1wp_1
9f844a348801 09361feeb475 "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 3306/tcp, 33060/tcp wp1_wp1mysql_1
$ docker-compose down
- Container wp1_wp1wp_1 Removed 1.9s
- Container wp1_wp1mysql_1 Removed 0.2s
- Network wp1_default Removed 0.1s
- Network wp1_wp1net Removed 0.2s 2.2s
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker-compose stopコマンドはコンテナ群をまとめて停止した後、削除します。
docker ps -a コマンドで見ると、コンテナ群が削除されていることがわかります。
docker-compose downも docker-compose up 同様に、docker-compose.ymlのあるディレクトリで実行するか、-fオプションで指定する必要があります。
docker-compose stopとdownの違いは?
docker-compose stop はコンテナ群を停止するだけ。
docker-compose down はコンテナ群を停止した後、削除します。
Docker Composeとの違い
DockerfileとDocker Composeとの違い
Dockerfileは1つのDockerイメージを作成する機能である。
Docker Composeはイメージを元にコンテナやネットワーク、ボリュームを作成する機能である。
つまり、Dockerfileを元に作ったDockerイメージを、Docker-Composeで起動してコンテナ群を構築する。
KubernatesとDocker Composeとの違い
Kubernatesは各Dockerコンテナの状態を管理することができる。
Docker Composeはコンテナ群を起動したり、f停止したりすることしかできない。