開発用 PC で複数の Docker コンテナを起動して連携させる (Docker Compose)
[履歴] [最終更新] (2017/10/23 23:37:44)
最近の投稿
注目の記事

概要

Docker CLI チートシート」および「Dockerfile ベストプラクティス (仮)」でコンテナの作成方法および単体での起動方法を把握しました。これらコンテナを複数起動して連携させる、オーケストレーションを実現する方法しては Docker 社が提供する Docker Swarm だけでなく、Amazon EC2 Container Service (ECS)Google Container Engine (GKE) などが存在します。これらの方法のうち、特に今後優勢とされるのが GKE で採用されている Kubernetes であり、Docker 社はこれを Docker Swarm と同様に公式にサポートすることを発表しました。

そのため、今後は以下にまとめる Docker Compose だけではなく Kubernetes も開発用 PC での環境構築に利用できるようになるようですが、現在のところ複数のコンテナを連携させるためには Docker 社が公式にサポートする Docker Compose というツールを利用すると便利です。YAML ファイルに記載した設定にしたがって、開発用 PC 上にコンテナを複数起動して互いに連携させることができます。2017/10/23 現在の Docker Compose バージョンは 3 です。

サンプル YAML 設定

実用性はありませんが、以下の三つのコンテナを作成してみます。

  • Dockerfile をもとに build した image をもとに作成する、何もしないコンテナ
  • Docker Hub から image を pull して作成する nginx コンテナ
  • Docker Hub から image を pull して作成する mysql コンテナ

Dockerfile

FROM centos:centos6
RUN yum update -y && yum install -y mysql

docker-compose.yml

version: '3'
services:
  myservice:
    build: .
    container_name: myservice
    command: tail -f /dev/null
    volumes:
      - .:/work
      - my-vol:/data
    links:
      - myweb
      - mydb
  myweb:
    image: nginx
    container_name: myweb
    restart: always
    volumes:
      - my-vol:/data
    ports:
      - 20080:80
  mydb:
    image: mysql
    container_name: mydb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - my-vol:/data
    ports:
      - 23306:3306
volumes:
  my-vol:

コンテナ群の起動/停止

$ docker-compose up
$ docker-compose down

以下のような状態になります。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
904d08aa7326        xxxx_myservice      "tail -f /dev/null"      31 minutes ago      Up 31 minutes                                 myservice
6fec25e9cc26        mysql               "docker-entrypoint..."   31 minutes ago      Up 31 minutes       0.0.0.0:23306->3306/tcp   mydb
13fabbb8a824        nginx               "nginx -g 'daemon ..."   31 minutes ago      Up 31 minutes       0.0.0.0:20080->80/tcp     myweb

動作検証

何もしない踏み台のようなコンテナにシェルで入ります。

$ docker exec -it myservice /bin/bash

nginx コンテナと通信できることを確認します。

[root@d51ef4968d52 /]# curl myweb:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

mysql コンテナと通信できることを確認します。

[root@d51ef4968d52 /]# mysql -h mydb -P 3306 -uroot -pexample -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

ホスト側のファイルシステムがマウントされていることを確認します。

[root@d51ef4968d52 /]# ls /work/
Dockerfile  docker-compose.yml

コンテナ間で共有しているボリュームです。

[root@904d08aa7326 /]# df -h | grep data
/dev/sda1        63G  2.5G   58G   5% /data

ホスト側から nginx コンテナと通信できることを確認します。

$ curl localhost:20080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

ホスト側から mysql コンテナと通信できることを確認します。

$ mysql -h 127.0.0.1 -P 23306 -uroot -pexample -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
関連ページ
    概要 こちらのページに記載した Kubernetes クラスタを RancherOS で構築する場合の設定例を記載します。 インストール ISO ファイルをダウンロードして起動すると ros コマンドが利用できるコンソールに入ります。インストール可能なバージョン一覧はコンソール上で以下のコマンドによって確認できます。
    概要 Docker オーケストレーションツールの一つに Kubernetes (k8s) があります。k8s 実行環境の構築方法は複数ありますが、ここでは AWS や GCP 等のクラウドサービスを利用せず、Debian9 がインストールされた複数台の物理マシンがネットワーク内に存在する状況を考えます。これら複数の Debian9 上に k8s クラスタを立ち上げるためには