Dockerは、ユーザーが作成したDocker networkを使うことにより、同一のnetworkに接続されたコンテナ間で、コンテナ名で名前解決をして相互通信することが可能です!
今回は、そのDocker networkに関するコマンドや知識をまとめます!
Dockerコンテナの名前解決
DockerコンテナにはNAME(名前)をつけることができます。
1 |
docker container run -itd --name app_1 alpine |
上記コマンドを実行することで、alpineイメージを元にapp_1というNAMEのコンテナを起動することができます。
このコンテナは、Docker networkを指定してコンテナを起動したわけではないので、defaultで接続されるbridgeネットワークに接続されます。
defaultネットワークに接続されたコンテナ同士はコンテナ名で通信をすることができません。
しかし、ユーザー定義ネットワークに接続されたDockerコンテナ同士は、名前で通信することができます!
ネットワークの作成と確認
Dockerネットワークの新規作成は以下のコマンドで行います。
1 |
docker network create app_network |
上記コマンドを実行後、以下のネットワーク一覧コマンドを実行することにより、app_networkという名前でbridge DRIVERのネットワークが作成されたことが確認できます。
1 |
docker network ls |
Dockerコンテナのネットワークへの接続
これで、Dockerコンテナ(app_1)とDockerネットワーク(app_network)が作成されました。
app_1コンテナはdefaultのネットワークであるbridgeネットワークに接続されているため、app_networkに接続しなければなりません。
1 |
docker network connect app_network app_1 |
上記コマンドを実行することによって、app_1コンテナをapp_networkに接続することができました。
試しに以下のコマンドを実行して、networkの詳細を見てみましょう.
1 |
docker network inspect app_network |
上記コマンドを実行すると、networkの詳細が確認できます。
詳細の中に、Containersの欄があり、その中に、app_1コンテナが含まれていることをが確認できます。
※コンテナが起動中でないと確認できません。
これで、app_1コンテナはapp_network内のコンテナとNAMEで通信ができるようになりました。
コンテナ間で通信してみよう!
同一ネットワークにもう一つコンテナを追加して、コンテナ間で通信する実験をしてみましょう!
1 |
docker container run -itd --name app_2 --net=app_network alpine |
上記のように、【–net】オプションを使えば、ネットワークに接続した状態のDockerコンテナを起動することができます。
それでは、app_1コンテナに入って、app_2コンテナと通信してみましょう。
1 2 |
docker exec -it app_1 /bin/sh ping -w 5 app_2 |
- 1行目で、app_1コンテナに入る
- 2行目で、app_2コンテナにpingを飛ばす
この結果、pingで通信が成功することが確認できるかと思います!
同一networkのコンテナ間でコンテナ名で名前解決して通信する方法でした!