【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

Follow me!

【Docker】コンテナ間をネットワークで連携する” に対して1件のコメントがあります。

コメントは受け付けていません。