はじめに
これから4回に分けてDockerとAzure Kubernetes Service(AKS)の内部ネットワーク構造に注目し、深堀りしていきます。最終回では、両者を比較し共通点・相違点についてまとめます。
第1回目は、Docker内部のネットワーク構造について整理していきます。
なお、検証環境は以下の通りです。
検証環境(Azure VM)
OS:Linux (ubuntu 20.04)
Size:Standard D2s v3 (2 vcpus, 8 GiB memory)
Dockerとは?
- アプリケーションとその依存関係を”コンテナ”と呼ばれる包装にパッケージ化できるプラットフォーム
- HyperVisorによるゲストOS仮想化と比べると、軽量でリソース効率的と言われている
インストール方法やコマンド等は以下の記事を参考にして下さい。
Dockerのネットワーク構造
Dockerネットワークは以下のように3種類あります。
root@AZ-foo-pc28:/home/ncbpco128# docker network ls
NETWORK ID NAME DRIVER SCOPE
7f81943ac8e5 bridge bridge local
a61dea7f7548 host host local
8ed41a0f9d84 none null local
noneネットワーク
コンテナはネットワークに接続されず、外部との通信ができません。バッチジョブなど完全にネットワークから隔離された環境が必要な場合に使用します。
hostネットワーク
コンテナはホストのネットワークスタックを直接使用します。コンテナとホストは同じIPアドレスを共有し、ポートも同じものを使用します。制約として、ホストとコンテナで同じポート番号を使用することはできません。
bridgeネットワーク
デフォルトのネットワークモードであり一般的によく使用されます。bridgeネットワークは、以下の特徴があります。
- 同じホスト上のコンテナは仮想ブリッジを介し、IPアドレスを使って相互に通信できます
- コンテナは互いに名前解決ができます
- コンテナが外部ネットワーク(インターネットなど)にアクセスするためには、bridgeネットワークを通じてNATを行います
逆に、外部からコンテナにアクセスするためには、ポートフォワーディングを行います。これは、ホストの特定のポートをコンテナのポートにマップすることで実現します - bridgeネットワークは、コンテナ間の通信をホストのネットワークから隔離します
これらはどのように実現されているのでしょうか?
ネットワーク構造の概要
bridgeネットワークの機能は、以下のようなLinuxカーネルの機能によって実現されています。
- network namespace
- bridge
- veth
- iptables
図で表すとこんなイメージです。
赤字の機能はLinuxカーネルの機能です。
ポイント
- 黄色部分はDockerによって作成される仮想ブリッジで、各コンテナのvethと接続されています。コンテナ間で通信するときは、このブリッジを使って通信を行います。ちなみに、ブリッジの名前はデフォルトで「docker0」です
- コンテナごとに異なるネットワーク名前空間が割り当てられます。これにより、コンテナ間やコンテナ‐ホスト間のネットワークを隔離しています
- コンテナのサブネットとホストのサブネットはレンジが異なります
- コンテナがホスト外と通信するときはブリッジを経由し、ホストのeth0でIPマスカレード(iptables)されます
以降では、実際に検証環境を使用して上記の4つのポイントが本当なのか、検証してみましょう。
検証
Dockerをインストールした状態で、ipコマンド等を使用して色々と情報を取得しました。
ポイントの4以外は全てその通りになっていますね。4を確かめるために、ホスト間で通信してみましょう。
ホスト間通信
もう一つホストを用意し、同じようにDockerをインストールして情報を取得しました。
左側のホストのコンテナIDが6d79b5258833であるコンテナから右側の11a72050c38bのコンテナに対してpingコマンドを実行してみます。
6d79b5258833のeth0でキャプチャすると、送信元IPアドレスは「172.17.0.2」となっているのでまだNATされていないですね。
ホストのeth0でキャプチャすると、送信元IPアドレスは「az-foo-pc28.internal.cloudapp.net」となっていてホストを表しています(見慣れないホスト名なのでややこしいですがAzure VNetの機能で名前解決しています)。これは、ブリッジからホストのeth0に転送されるときにNATされているためです。
これで、実際に4つのポイントを確かめることができました。
まとめ
Dockerのbridgeネットワークモデルにおける特徴をまとめると以下の通りとなります。
- Host内にbridgeが作られる
- ContainerごとにNW namespaceが異なる
- ContainerのサブネットとHostのサブネットは、レンジが異なる
- bridgeからHostのeth0に転送されるときにNATされる
次回はAKSのkubenetネットワークモデルについて深掘りします。
参考
Networking overview
Docker コンテナ・ネットワークの理解 — Docker-docs-ja 19.03 ドキュメント
Dockerとホストのネットワーク on EC2 - Qiita
Dockerのネットワークを理解するために覚えたことまとめ - Carpe Diem
Docker network 概論 - Qiita
Dockerのネットワークの基礎
network - 入門 Docker
Dockerのブリッジネットワークについて調べました | QUARTETCOM TECH BLOG
Dockerのネットワークの仕組み - sagantaf
[Container Runtime Meetup] runc & User Namespaces
LinuxのNetns/veth/Bridge/NATで仮想ネットワーク構築
Docker/Kubernetesを扱う上で必要なネットワークの基礎知識(その2) - sagantaf
【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その5:Dockerのネットワークってどうなってるの? 〜 | SIOS Tech. Lab