Docker ネットワークの種類
複数のコンテナ間で通信するためのネットワークの設定が必要です。
Dockerのネットワークは、大きく次の2つが用意されています。
- デフォルト・ブリッジネットワーク
- ユーザー定義 ブリッジネットワーク
今回は、一般的に使用される「ユーザー定義 ブリッジネットワーク」の使い方を中心に解説します。
・コンテナ間通信の種類・方法
・Dockerネットワークの特徴
・Dockerネットワークの設定方法
デフォルト・ブリッジネットワーク
コンテナ作成時にネットワークの設定を行わない場合に適用される、デフォルトのネットワークです。
デフォルトネットワークの特徴は次の3つ。
- Docker Engine上の全てのコンテナと通信できる。
- コンテナ間で通信するためにはリンクの設定が必要
- コンテナ間はIPアドレスで通信する。
結論から言うと、デフォルト・ブリッジネットワークは、次のような問題があります。
- DockerEngine上の全てのコンテナと通信できてしまう。
他プロジェクトや関係のないコンテナまで通信できてしまう。 - リンクの設定が手間
コンテナを生成しなおすたびにIPアドレスが変わるため再設定が必要
コンテナの数が増えるに連れて、リンクの設定が手間です。
このような問題があるため「ユーザー定義 ブリッジネットワーク」を使うことをオススメします。
コンテナ間の通信が必要ない場合は、デフォルト・ブリッジネットワークでも問題ないでしょう。
ユーザー定義 ブリッジネットワーク
コンテナ起動時に「–network」オプションで設定するネットワークです。
ユーザー定義 ブリッジネットワークの特徴は次の3つ。
- 通信するコンテナは同じネットワークを割り当てるだけで良い
- 通信可能なコンテナが同一ネットワーク上に限定される。
- 通信の名前解決はコンテナ名ベースで行われる
Dockerネットワークを作成し、そのネットワークを割り当てるだけで通信できるため非常に簡単。
かつ、ネットワークも隔離できるというメリットもあります。
基本的にはユーザー定義 ブリッジネットワークを使えばよいでしょう。
Dockerネットワークの作り方と設定方法
例として、WordPressコンテナとMySQLコンテナを通信するネットワークを作成します。
docker network create
「docker network create」コマンドでユーザー定義 ブリッジネットワークを作成します。
今回は「wordpress-net」というネットワーク名で作成します。
docker network create [ネットワーク名]
Dockerネットワーク “wordpress-net”を作成
% docker network create wordpress-net
作成したネットワークを確認するには「docker network ls」コマンドで確認します。
コンテナ起動時にネットワークを指定する
あとは、コンテナ起動時に「–network」オプションで作成したネットワークを指定するだけです。
MySQLコンテナの起動
–network オプションで「wordpress-net」を指定します。
コンテナ名は「mysql-01」とします。
MySQLコンテナの作成、Dockerネットワークの設定
docker container run -dit ¥
–name mysql-01 ¥
–network wordpress-net ¥
-e MYSQL_ROOT_PASSWORD=1234 ¥
-e MYSQL_DATABASE=testdb ¥
-e MYSQL_USER=myuser ¥
-e MYSQL_PASSWORD=1234 ¥
mysql
WordPressコンテナの起動
MySQLコンテナと同様に、–networkオプションで「wordpress-net」を指定します。
コンテナ名は「wordpress-01」とします。
wordpressコンテナの作成、Dockerネットワークの設定
docker container run -dit ¥
–name wordpress-01 ¥
–network wordpress-net ¥
-p 8080:80 ¥
-e WORDPRESS_DB_HOST=mysql-01 ¥
-e WORDPRESS_DB_NAME=testdb ¥
-e WORDPRESS_DB_USER=myuser ¥
-e WORDPRESS_DB_PASSWORD=1234 ¥
wordpress
ネットワークの接続を確認
これでWordPressコンテナとMySQLコンテナが、Dockerネットワークで繋がりました。
WordPressはポート8080に設定しているので、ホストマシンでlocalhost:8080にアクセスしてWordPressが起動することを確認してください。
コンテナ名で通信する
次にコンテナ名を指定して通信できることを確認してみましょう。
wordpressコンテナからmysqlコンテナへ疎通確認してみます。
mysqlコンテナのコンテナ名は「mysql-01」なので、この名前がホスト名となります。
wordpressコンテナから「mysql-01」へPingしてみます。
wordpressコンテナをbashで操作
% docker container exec -it wordpress-01 bash
apt update
ping のインストール
apt install iputils-ping net-tools
mysqlコンテナへping
ping mysql-01
PING mysql-01 (172.26.0.2): icmp_seq=1 ttl=64 time=1.23
PING mysql-01 (172.26.0.2): icmp_seq=2 ttl=64 time=0.263
PING mysql-01 (172.26.0.2): icmp_seq=3 ttl=64 time=0.243
コンテナ名「mysql-01」で通信できることが確認できます。
ネットワークのエイリアス設定
基本はコンテナ名がホスト名となり通信しますが、コンテナ名ではなく別のわかりやすい名前などをつけたい場合はエイリアスを設定できます。
例として、mysqlコンテナのネットワークを「db」というエイリアスへ設定してみます。
エイリアスの設定は「–network-alias」オプションで設定します。
MySQLコンテナの作成、Dockerネットワークの設定
docker container run -dit ¥
–name mysql-01 ¥
–network wordpress-net ¥
–network-alias db ¥
-e MYSQL_ROOT_PASSWORD=1234 ¥
-e MYSQL_DATABASE=testdb ¥
-e MYSQL_USER=myuser ¥
-e MYSQL_PASSWORD=1234 ¥
mysql
今度はエイリアスで設定した「db」という名前で通信を確認してみます。
wordpressコンテナをbashで操作
% docker container exec -it wordpress-01 bash
エイリアス “db”へping
ping db
PING db (172.26.0.2): icmp_seq=1 ttl=64 time=1.41
PING db (172.26.0.2): icmp_seq=2 ttl=64 time=0.069
PING db (172.26.0.2): icmp_seq=3 ttl=64 time=0.235
エイリアス「db」で通信できることが確認できました。