Dockerとコンテナ技術 その17:bridgeネットワーク内での通信

前回の記事でコンテナのbridgeネットワークへの接続についてまとめました。

キョウタコの技術日記

Dockerでサービスやアプリを作成する場合、webサーバーやDBサーバーなどの機能ごとにコンテナを作成しコンテナ間で通…

今回はbridgeネットワーク内での通信についてまとめていきます。

事前準備

コンテナ間通信を実施するために、カスタムイメージからコンテナを作成します。
任意のフォルダに以下の内容でDockerfileを作成してください。

FROM ubuntu:22.04

RUN apt update && apt install -y iputils-ping curl

CMD ["bash"]

この中でインストールされているパッケージはHTTP通信を実行する際に利用します。
ではDockerイメージをビルドをしていきましょう。

docker image build -t my-ubuntu .

今回は’my-ubuntu’というイメージ名をつけています。
このカスタムイメージはこの後のコンテナ間通信を行うコンテナのビルドに使います。

デフォルトのbridgeネットワーク内でのコンテナ間通信

まずは、デフォルトのbridgeネットワークの通信を見てみましょう。
以下のようなイメージで通信を行います。

2つのコンテナをbridgeネットワーク内で起動する

ではそれぞれのコンテナを作成していきましょう。
以下のコマンドを実行してください。

docker container run -itd --name my-ubuntu-1 my-ubuntu
docker container run -d --name my-nginx-1 nginx

実行すると以下のようにコンテナが2つ起動します。

では、デフォルトのbridgeネットワークを見てみましょう。

docker network inspect bridge

“Containers”の項目に2つのコンテナが表示されていると思います。

それぞれのコンテナの”IPv4Adress”という内部でのIPアドレスを表す項目の値を覚えておきましょう。

my-ubuntu-1 -> 172.17.0.2
my-nginx-1 -> 172.16.0.3

こちらの値は環境によって異なるので、自分の環境の値を確認するようにしてください。

起動したコンテナでHTTP通信を行う

では起動したubuntuのコンテナに入り、コマンド実行してHTTPリクエストを実行してみましょう。
以下のコマンドを実行してください。

docker container exec -it my-ubuntu-1 bash

コンテナ内部に入れたら次のコマンドを実行し、my-nginx-1コンテナにHTTPリクエストを送ってみましょう。

curl http://172.17.0.3

http://以降の数値はそれぞれの環境のnginxのコンテナのIPアドレスを指定してください。

実行すると以下のようにHTTPの文字列がレスポンスとして返ってきます。

これで、デフォルトのbridgeネットワークを利用したコンテナ間の通信を実施することができました。

カスタムネットワーク内でのコンテナ間通信

次にカスタムネットワークでのコンテナ間通信を行なっていきます。
以下のようなイメージで通信を行います。

ネットワークは前回の記事で作成した”my-net-1″を利用します。

2つのコンテナを”my-net-1″に接続して起動する

では先ほどと同じ流れでコンテナを起動していきます。
今回はネットワークの指定のみ追加されています。

docker container run -itd --network my-net-1 --name my-ubuntu-2 my-ubuntu
docker container run -d --network my-net-1 --name my-nginx-2 nginx

以下のようにコンテナ作成ができると思います。

では、”my-net-1″に正しく接続できているか確認してみましょう。

docker network inspect my-net-1

以下のように表示されると思います。

今回もIPアドレスを控えておきましょう。

my-ubuntu-2 -> 172.18.0.2
my-nginx-2 -> 172.18.0.3

起動したコンテナでHTTPリクエストを行う

では、デフォルトの時と同様の方法でリクエストを送信してみましょう。

docker container exec -it my-ubuntu-2 bash
curl http://172.18.0.3

先ほどと同様にHTMLの内容がレスポンスで返ってきたら成功です。

これでカスタムネットワークでのコンテナ間通信もできました。

bridgeネットワークの名前解決

カスタムネットワークに限り、IPアドレスの値をコンテナ名で表現することができます。
IPアドレスの値をいちいち調べなくても、コンテナ名で通信先を指定できるので覚えておきましょう。
my-ubuntu-2のコンテナに入ったままで以下のコマンドを実行してください。

curl http://my-nginx-2

先ほどIPアドレスで指定した時と同様の実行結果になると思います。

このように、コンテナ名でIPアドレスの指定を代替する方法を名前解決と言います。

まとめ

今回はネットワーク内でのコンテナ間通信をまとめました。
最近のサービスは一つのサービスで複数のコンテナを扱い、それぞれ独立させながら通信を行なって処理をする方式が主流となっています。
コンテナネットワークの基本的な部分ですので、しっかりと覚えておきましょう。
ここまで読んでいただきありがとうございました。
それでは、また。