Docker Composeで複数コンテナ管理

Docker Composeとは、複数コンテナをまとめて管理するための仕組みです。ここでは、Wordpress環境の構築をDocker Composeを利用した方法で行い、その仕組みを解説します。

docker-compose.ymlの作成

複数コンテナの設定を docker-compose.yml に記述します。

フォルダ構成

フォルダ構成を以下のようにします。

.
├── .env
└── docker-compose.yml
  • .env
    • 環境変数を記述します。
    • docker-compose.yml で利用します。
  • docker-compose.yml
    • 複数コンテナの設定を記述します。
    • YAML形式で記述します。

docker-compose.ymlの書き方

version: '3'

services:

### Wordpress ###########################################
  wordpress:
    image: wordpress:latest
    depends_on:
      - mysql
    ports:
      - "10080:80"
    env_file: .env

### MySQL ###############################################
  mysql:
    image: mysql:5.7
    volumes:
      - "./.data/db:/var/lib/mysql"
    env_file: .env

wordpressmysql のコンテナを設定しています。

imageキー には、利用する Dockerイメージ を指定します。ここでは、wordpressmysqlのDockerイメージを利用しています。

コンテナの起動順序を指定したい場合、 depends_onキー を利用します。ここでは、 mysql が起動した後に、 wordpress が起動するように設定しています。

ホストからアクセスできるようにしたい場合、 portsキー を利用します。 <ホスト側ポート番号>:<コンテナ側ポート番号> と指定します。ここでは、 http://localhost:10080 とアクセスすると、wordpressの画面が表示されるように設定しています。

ホストディレクトリコンテナ内のディレクトリ にマウントしたい場合、 volumesキー を利用します。ここでは、コンテナが終了しても、DB情報を永続化させるために利用しています。

env_fileキー には、環境変数設定をするためのファイルを指定します。ここでは、 .envファイル を指定しています。内容は以下の通りです。

### Wordpress ###########################################
WORDPRESS_DB_HOST=mysql:3306
WORDPRESS_DB_PASSWORD=wordpress

### MySQL ###############################################
MYSQL_ROOT_PASSWORD=wordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress

WORDPRESS_DB_HOST=mysql:3306 と設定しています。 なぜ、 mysql というサービス名でホストを指定できるかというと、 docker-compose.yml に記述した全サービス間で自動的にリンクを貼ってくれるためです。
( docker-compose.ymlversion1 ですと linksキー をわざわざ設定する必要がありました。)

複数コンテナをまとめて操作

docker-composeコマンド を利用します。
docker-compose.yml の設定を読み込み、まとめてコンテナを起動してくれます。

まず、コマンドがインストールされているか確認します。

$ docker-compose -v
docker-compose version 1.22.0, build f46880f

インストールされていない場合、以下リンクを参考にしてインストールを済ませてください。
https://docs.docker.com/compose/install/

起動

さっそく、起動してみます。

$ docker-compose up -d
Pulling mysql (mysql:5.7)...
5.7: Pulling from library/mysql
    (省略)
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
    (省略)
Status: Downloaded newer image for wordpress:latest
Creating wordpress_mysql_1 ... done
Creating wordpress_wordpress_1 ... done

mysqlとwordpressのイメージが読み込まれ、コンテナが作成されました。

コンテナ確認

2つのコンテナが起動されていることを確認できます。

$ docker-compose ps
        Name                       Command               State           Ports        
--------------------------------------------------------------------------------------
wordpress_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp  
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:10080->80/tcp

自動リンクの確認

wordpressコンテナ内で、 mysql に対して自動リンクができていることを確認します。
wordpressコンテナ内に接続して、 ping をインストール後、 ping mysql を実行します。

$ docker-compose exec wordpress bash
root@58aec4e9b6b8:/var/www/html# 
root@58aec4e9b6b8:/var/www/html# apt-get update
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:4 http://security.debian.org/debian-security buster/updates InRelease [38.3 kB]
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
    (省略)
root@58aec4e9b6b8:/var/www/html# apt-get -y install iputils-ping
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
    (省略)
root@58aec4e9b6b8:/var/www/html# ping mysql
PING mysql (172.21.0.2) 56(84) bytes of data.
64 bytes from wordpress_mysql_1.wordpress_default (172.21.0.2): icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from wordpress_mysql_1.wordpress_default (172.21.0.2): icmp_seq=2 ttl=64 time=0.123 ms
^C
--- mysql ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 0.077/0.100/0.123/0.023 ms

自動リンクにより ping mysql が成功していることを確認できました。

永続データの確認

ホストマシン上に、 ./.data/db/ フォルダが作成されて、コンテナ内と共有されていることを確認できます。

$ ls ./.data/db/
auto.cnf                client-cert.pem         ib_logfile0             ibtmp1                  private_key.pem         server-key.pem
ca-key.pem              client-key.pem          ib_logfile1             mysql                   public_key.pem          sys
ca.pem                  ib_buffer_pool          ibdata1                 performance_schema      server-cert.pem         wordpress

ホストからアクセスできるか確認

ホストのブラウザから http://localhost:10080 にアクセスしてWordpress画面が表示されることを確認できます。

docker_docker_compose_access1.png docker_docker_compose_access2.png
わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。