Dockerのブリッジネットワーク
Dockerにはデフォルトでネットワークインタフェースがdocker0という「172.17.0.0/16」のネットワークが作られます。docker0のネットワークとホストのNICのインタフェース(eth0など)の間でIPマスカレードが行われ、ホストの外側と通信ができるようになっています。docker0はDockerのデフォルトの仮想ブリッジであり、コンテナはdocker0のブリッジのネットワークに接続します。
Dockerのブリッジネットワークは次のように確認できます。
docker network ls
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
56f55dd7ecf6 bridge bridge local
59d55691255c host host local
00fcf4ab0ded none null local
「bridge」という名前のネットワークが存在することがわかります。ifconfigコマンドではdocker0のインタフェースを確認できます。
$ ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
デフォルトネットワークでWordPressコンテナを配置する
Dockerのコンテナ間がネットワーク上で接続して通信する例として、MySQLサーバのコンテナと、それに接続して利用するWordPressのコンテナを、ブリッジネットワーク(bridge)上に配置してみます。
まず、次のようにMySQLのコンテナ「sqlsv」を配置します。
$ docker run -dit --name sqlsv --net bridge \
-e MYSQL_ROOT_PASSWORD=passxxx \
-e MYSQL_DATABASE=wpdb \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass mysql \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--default-authentication-plugin=mysql_native_password
MySQLの設定のためのオプションについては後述します。
オプションの「--net bridge」により、コンテナが接続するネットワークを指定しています。
続いて、WordPressのコンテナ「wordp」を配置します。
$ docker run -dit --name wordp --net bridge -p 8080:80 \
-e WORDPRESS_DB_HOST=172.17.0.2:3306 \
-e WORDPRESS_DB_NAME=wpdb \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=wppass wordpress
同様に「--net bridge」によりsqlsvコンテナと同じネットワークに接続します。このとき、WordPressに引き渡す環境変数「WORDPRESS_DB_HOST」に、
172.17.0.2:3306
としてsqlsvのDBサーバのIPアドレスとTCPポート番号を指定しています。このIPアドレスは、
$ docker inspect sqlsv
としたときにNetworkSettingsに表示されるIPAddressで確認できます。
"IPAddress": "172.17.0.2",
また、ポート番号はdocker psの表示で3306が確認できます。
723e5896b718 mysql "docker-entrypoint.s…" 43 minutes ago Up 43 minutes 3306/tcp, 33060/tcp sqlsv
起動したWordPressへは、ブラウザから「http://172.17.0.1:8080/」のようにアクセスできます。
ネットワークを作ってWordPressコンテナを配置する
しかし、上のようにデフォルトのdocker0のネットワーク上にコンテナを配置するようなことは一般的にはしません。上のWordPressのコンテナを起動する際のWORDPRESS_DB_HOSTには、IPアドレスを直接指定するのではなく、通常はDBサーバのコンテナ名(この場合sqlsv)を指定します。
-e WORDPRESS_DB_HOST=sqlsv
Dockerには、コンテナ名からアドレス解決(名前解決)する機能があります。しかしデフォルトのdocker0のブリッジネットワークについてはその機能は無効となっているため、改めてネットワークを構築する必要があります。ネットワークは次のように作成できます。
docker network create ネットワーク名
新しいネットワークには、docker0とは異なるネットワークアドレス(172.21.0.0/16など)が与えられます。
以上を踏まえて、改めてWordPress+MySQLのコンテナ環境を構築してみます。最初にこの環境に使うネットワーク「wpnet」を作成します。
$ docker network create wpnet
43e5d6ddcd7f043dea43751a70457efc85c0fe008a7edda63bf58037c82c1de4
wpnetが作成されたことを確認します。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
56f55dd7ecf6 bridge bridge local
59d55691255c host host local
00fcf4ab0ded none null local
43e5d6ddcd7f wpnet bridge local
wpnetのインタフェースはifconfigで確認できます。
br-43e5d6ddcd7f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.21.0.1 netmask 255.255.0.0 broadcast 172.21.255.255
ID値がインタフェース名に使われています。
MySQLサーバのコンテナ「sqlsv」を配置します。
$ docker run -dit --name sqlsv --net wpnet \
-e MYSQL_ROOT_PASSWORD=tenk123 \
-e MYSQL_DATABASE=wpdb \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
mysql \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--default-authentication-plugin=mysql_native_password
最初の例と違う箇所は、--netに作成したネットワーク名「wpnet」を指定している部分です。続けて、WordPresssコンテナを起動します。
$ docker run -dit --name wordp --net wpnet -p 8080:80 \
-e WORDPRESS_DB_HOST=sqlsv \
-e WORDPRESS_DB_NAME=wpdb \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=wppass wordpress
--netには同様に「wpnet」を指定します。そしてDBのホストを指定する環境変数WORDPRESS_DB_HOSTには、MySQLサーバのコンテナ名「sqlsv」を指定します。作成したネットワーク(wpnet)は、コンテナ名のアドレス解決が行われるため、ホストをコンテナ名で指定できます。
配置したWordPressコンテナには、ブラウザから「172.21.0.1:8080」でアクセスできます。DockerがWindows上のVMwareなどの仮想マシンのLinuxで動作している場合、仮想マシンのNICのIPアドレスからWordPressにアクセスできます。仮想マシンが192.168.10.11ならばWindowsのブラウザから「192.168.0.11:8080」でwordpコンテナにアクセスできます。
最後に、不要になったネットワークは次のように削除できます。
docker network rm ネットワーク名
補足:MySQLとWordPressコンテナの環境変数
上の例のMySQLコンテナは、環境変数の設定により起動時に初期テーブルを作成しています。MySQLで指定した環境変数の意味は以下の通りです。
MYSQL_ROOT_PASSWORD
|
MySQLのrootユーザパスワード
|
MYSQL_DATABASE
|
作成するデータベース名
|
MYSQL_USER MYSQL_PASSWORD
|
作成するデータベースへアクセスするユーザとパスワード
|
また、MySQLの設定をオプションで指定しています。これらはmy.cnfの[mysqld]に設定するものに相当します。
--character-set-server=utf8mb4
|
文字コード(4バイトのマルチバイトのUTF-8)
|
--collation-server=utf8mb4_unicode_ci
|
照合順序(最もあいまいな検索ができる設定)
|
--default-authentication-plugin=mysql_native_password
|
認証方式(MySQL8以前と互換な設定を選択した)
|
続いてWordPressコンテナへの環境変数の意味は次の通りで、MySQLコンテナのデータベースへ接続するための設定です。
WORDPRESS_DB_HOST
|
接続するデータベースのホスト
|
WORDPRESS_DB_NAME
|
データベース名
|
WORDPRESS_DB_USER WORDPRESS_DB_PASSWORD
|
データベースのユーザとパスワード
|