2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Dockerの内部ネットワーク構造を紐解いてみる

Last updated at Posted at 2024-07-06

はじめに

これから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仮想化と比べると、軽量でリソース効率的と言われている

image.png

インストール方法やコマンド等は以下の記事を参考にして下さい。

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

図で表すとこんなイメージです。
image.png
赤字の機能はLinuxカーネルの機能です。

ポイント

  1. 黄色部分はDockerによって作成される仮想ブリッジで、各コンテナのvethと接続されています。コンテナ間で通信するときは、このブリッジを使って通信を行います。ちなみに、ブリッジの名前はデフォルトで「docker0」です
  2. コンテナごとに異なるネットワーク名前空間が割り当てられます。これにより、コンテナ間やコンテナ‐ホスト間のネットワークを隔離しています
  3. コンテナのサブネットとホストのサブネットはレンジが異なります
  4. コンテナがホスト外と通信するときはブリッジを経由し、ホストのeth0でIPマスカレード(iptables)されます

以降では、実際に検証環境を使用して上記の4つのポイントが本当なのか、検証してみましょう。

検証

Dockerをインストールした状態で、ipコマンド等を使用して色々と情報を取得しました。

image.png

ポイントの4以外は全てその通りになっていますね。4を確かめるために、ホスト間で通信してみましょう。

ホスト間通信

image.png

もう一つホストを用意し、同じようにDockerをインストールして情報を取得しました。
左側のホストのコンテナIDが6d79b5258833であるコンテナから右側の11a72050c38bのコンテナに対してpingコマンドを実行してみます。

image.png

6d79b5258833のeth0でキャプチャすると、送信元IPアドレスは「172.17.0.2」となっているのでまだNATされていないですね。
image.png

ホストのeth0でキャプチャすると、送信元IPアドレスは「az-foo-pc28.internal.cloudapp.net」となっていてホストを表しています(見慣れないホスト名なのでややこしいですがAzure VNetの機能で名前解決しています)。これは、ブリッジからホストのeth0に転送されるときにNATされているためです。

image.png

これで、実際に4つのポイントを確かめることができました。

まとめ

Dockerのbridgeネットワークモデルにおける特徴をまとめると以下の通りとなります。

  1. Host内にbridgeが作られる
  2. ContainerごとにNW namespaceが異なる
  3. ContainerのサブネットとHostのサブネットは、レンジが異なる
  4. 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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?