Dockerにはインストールした時点でデフォルトで3種類のネットワークが用意されます。3種類+新規作成するDockerネットワークを活用し、コンテナに接続するのかが重要です。Dockerネットワークの種類とそれぞれのユースケースを紹介し、実践的な利用方法も解説します。
Dockerのネットワークとは
Dockerネットワークは、Dockerコンテナ間、またはDockerコンテナとホスト間の通信を実現するネットワークです。
Dockerネットワークの管理によってアプリケーションの安全性と効率性を確保が可能です。Dockerネットワークの利用により具体的には以下の効果が期待できます。
- コンテナの通信経路の確保
- ネットワーク分離
- セキュリティの確保
Dockerネットワークを利用して、コンテナの通信を自在に操作しましょう。
デフォルトで用意されているDockerネットワーク3種類
Dockerはインストールした時点で以下3種類のネットワークが用意されます。
- bridge
- host
- none
3種類の違いはドライバーの違いによるものです。ドライバーが違うことで異なる通信を実現できます。
bridge
bridgeネットワークは以下のようにホストマシン内部に生成されたコンテナ用ネットワークです。コンテナ作成時にデフォルトネットワークとなっており、作成時にネットワークを指定しなければbridgeにアタッチされます。
bridgeはホストのインタフェースから独立しています。各コンテナのNICがそれぞれIPアドレスを保有するため、bridgeネットワーク間ではIPアドレスを用いた通信が可能です。
なおデフォルトで用意されるbridge(bridge0)の場合、コンテナ間の名前解決はできません。名前解決をしたい場合は別のbridgeネットワークを作成する必要があります。
上記のようにbridgeが分かれている場合は、コンテナ間の通信ができません。例として上記であればコンテナAとコンテナCは通信をできないことになります。
外部との通信は上記の図ではeth0でのNATを行うことで実現されます。
host
hostネットワークはコンテナがホスト上のネットワーク環境をそのまま利用するネットワークです。
bridgeはeth0とbridgeがあくまで別のレイヤーとして独立したネットワークとなっていました。一方でhostは別のレイヤーではなく平面的なネットワーク環境を実現します。
上記のようにコンテナがホスト上のeth0を直接利用して通信を実施します。よって外部から見るとコンテナが直接外部にアクセスしているように見えることが特徴です。
上記の場合、コンテナA,Bはそれぞれ同じIPアドレスを持ちます。通信の宛先として指定するためには、各コンテナがリッスンするポートの設定が必要です。
none
noneを指定した場合、コンテナがネットワークにアタッチされません。よってホストや他のコンテナから通信できないコンテナに使用するネットワークです。
ユースケースはネットワーク接続を必要としない処理を行う場合です。
Dockerネットワークの使い分け
Dockerネットワークの大まかな使い分けは以下のとおりです。
デフォルトではbridgeに接続するようになっており、その分多彩なニーズにも対応できます。そのため、noneやhostを使いたい要望がなければ基本的にはbridgeを使えば問題ありません。
またbridgeでも名前解決ができた方が便利なケースが多いです。理由はコンテナは作成・削除を繰り返すため一位のIPアドレスを保有できる可能性は低い環境といえます。
特に複数のコンテナを連携させる場合はIPアドレスではなく名前解決ができた方が良いです。よってbridgeでもデフォルトのbridgeではなく、新しいbridgeのネットワークを作成することが推奨です。
Dockerネットワークの作り方
Dockerネットワークを作る際のコマンドは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# すでにあるDockerネットワークの確認 $ docker network ls NETWORK ID NAME DRIVER SCOPE 9663*** bridge bridge local a3***c host host local b8****e619 none null local # 作成 $ docker network create test-network # 作成を確認 $ docker network ls NETWORK ID NAME DRIVER SCOPE 9663*** bridge bridge local a3***c host host local b8****e619 none null local 2bdf97**60 test-network bridge local |
nginxのコンテナに作成したDockerネットワークを接続させる
では先ほど作成したtest-network
に、nginxのコンテナを接続させてみましょう。nginxのコンテナを立てておき、そこに対してubuntuのコンテナを立ててnginxのコンテナに対してcurlを実行します。
2つ目のコマンドの最後がcurl nginx
となっています。これでコンテナ名で名前解決をしていることも理解していただけるでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ docker run --network test-network --name nginx -d nginx $ docker run --rm --network test-network ubuntu sh -c "apt update && apt install -y curl && curl nginx" .... <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> .... |
Dockerネットワークを活用して様々な環境をコンテナのみで実現できます。