【Docker】コンテナ間をネットワークで連携する
目次
Dockerネットワークでコンテナ間通信
Dockerではホスト上で起動している異なるコンテナ同士をネットワーク連携、通信させることが出来ます。
Dockerネットワークを利用してPHPアプリケーションのコンテナからMySQLデータベースのコンテナに接続する方法を例に紹介します。
本記事で使用するファイルはこちらからダウンロード出来ます。
docker-network.zip
SAMPLE
環境: Docker version 19.03.13, Mac OS 10.15.7
ネットワークの作成
下記コマンドを実行してコンテナ間を接続するための専用ネットワークを作成します。
docker network create ネットワーク名
docker network create mysql-network
ここではmysql-networkという名前でネットワークの作成を行います。
下記のコマンドを実行することで作成したネットワーク一覧を確認出来ます。
docker network ls
(bridgeなど、初めから存在している既存のネットワークも表示されます)
作成したネットワークを削除する場合は以下を実行
docker network rm ネットワーク名
コンテナの作成と起動
ネットワーク連携を行うPHPとMySQL、2つのコンテナをそれぞれイメージから作成、起動します。
以降はダウンロードサンプルのファイルをそのまま使って解説していきます。
(SAMPLE) docker-network
. ├── htdocs │ └── index.php ├── mysql │ ├── Dockerfile │ ├── settings │ │ └── my.cnf │ └── sqls │ └── data.sql └── php-apache └── Dockerfile
イメージのビルド
イメージの元となるDockerファイルや設定内容等はそれぞれ下記の記事で紹介している内容と全く同じです。
(詳細は各記事を参照ください)
DockerでPHPとApacheの実行環境を立ち上げる(PHP)
DockerでMySQLコンテナの作成(日本語対応)(MySQL)
PHPコンテナのイメージをビルドする
docker-network/php-apache/ のパスで実行
docker build -t php-apache .
MySQLコンテナのイメージをビルドする
docker-network/mysql/ のパスで実行
docker build -t mysql .
イメージのビルドが出来たら、どちらのコンテナも起動していきます。
networkオプションを指定してコンテナを起動
docker runコマンドでコンテナを起動する際、どちらのコンテナもnetworkオプションを使って、
最初に作成しておいたネットワーク、mysql-networkを指定します。
PHPコンテナを起動
(SAMPLE) 実行ファイル、index.phpのあるdocker-network/htdocs のパスで実行
docker run -d --name phpcont -v $(pwd):/var/www/html --network mysql-network -p 81:80 php-apache
MySQLコンテナを起動
(SAMPLE) docker-network/mysql/ のパスで実行
sqls/data.sqlでテストDB&データを作成します
docker run -d --name mysqlcont -e MYSQL_ROOT_PASSWORD=password -v $(pwd)/sqls:/docker-entrypoint-initdb.d --network mysql-network mysql
コンテナの起動確認
docker ps
ネットワークの状態確認
docker inspect mysql-network
docker inspectコマンドでmysql-networkを確認すると、
Containers蘭より先ほどネットワークオプションを付けて起動した2つのコンテナが紐付けられていることが確認出来ます。
"Containers": { "1e3c4543621b03a6af395c7ff5794ad195a6fc873c14c82eca3ea09c776e657e": { "Name": "mysqlcont", "EndpointID": "c1cb7479efb88676473953f96cd475798111d97bc6ce020c240a4ca9bcc2216c", "MacAddress": "02:42:ac:1a:00:03", "IPv4Address": "172.26.0.3/16", "IPv6Address": "" }, "4a8c4aa7a8dba4011af06897eb597f26f43641d76f77bfb88c895334b7a68b92": { "Name": "phpcont", "EndpointID": "e145beb94b5b478eceb4a8c8433cfa4d8dc3eedd07f38813330b9fdb62a03c56", "MacAddress": "02:42:ac:1a:00:02", "IPv4Address": "172.26.0.2/16", "IPv6Address": "" } },
通信確認
起動中のWebサーバ(PHPコンテナ)にブラウザからアクセスします。
コンテナ起動時にオプション指定したポートでアクセス
http://localhost:81/
以下のように画面上にテスト用データが表示出来たらコンテナ間通信の成功です。
PHPのDB接続設定
PHPコンテナの実行ファイルindex.phpより、データベース接続のための設定は下記となります。
(接続とデータの取得はPHP、PDOオブジェクトを利用)
DB_PASSWORDにはMySQLコンテナ起動時にオプションで指定したパスワードを設定します。
<?php define('DSN', 'mysql:host=mysqlcont;port=3306;dbname=prefecture;charset=utf8'); define('DB_USERNAME', 'root'); define('DB_PASSWORD', 'password'); try { $_db = new PDO(DSN, DB_USERNAME, DB_PASSWORD); $_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e){ echo $e->getMessage(); exit; }
接続ホスト (host)
MySQLコンテナ名のmysqlcontを指定する
ポート番号 (port)
コンテナ情報、PORTSの箇所よりホスト側を表す3306の方を指定する
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8979326b1da4 mysql "docker-entrypoint.s…" 2 hours ago Up 2 hours 3306/tcp, 33060/tcp mysqlcont
“【Docker】コンテナ間をネットワークで連携する” に対して1件のコメントがあります。
コメントは受け付けていません。