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キーをわざわざ設定する必要がありました。)

補足) コンテナ内からホストへアクセスする方法

例えば、DBはコンテナではなく、ホストで起動しているDBを利用したいケースがあるとします。コンテナ内からホスト上のサービスへアクセスする必要がありますが、host.docker.internalというDNS名でホスト上のサービスにアクセスできます。

https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

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

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画面が表示されることを確認できます。

よかったらシェアしてね!
目次