" />
本ページはプロモーションが含まれています。

スポンサーリンク

Docker

Docker入門5~Docker Compose~

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:ボリュームの定義
docker-compose.ymlの書き方

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停止したりすることしかできない。

スポンサーリンク

-Docker