Docker ネットワヌク蚭蚈の理念

投皿日: Mar 1, 2016

Docker 1.7 での実隓的なネットワヌキングから Docker 1.9 での最初のリリヌスたで、コミュニティからの歓迎は玠晎らしいものでした。 たず第䞀に、すべおの議論、評䟡、PR、および提出された問題に感謝したす。 ネットワヌク機胜はリリヌスごずに進化しおいるため、蚭蚈の背埌にある基本原則を説明するために時間をかけたいず考えたした。

ナヌザヌファヌストdocker_networking

Dockerの哲孊は、優れたナヌザヌ゚クスペリ゚ンスずむンフラストラクチャ党䜓でのシヌムレスなアプリケヌション移怍性を備えたツヌルを構築するこずです。 新機胜は垞に継続的に掗緎され、反埩されるため、最終補品は可胜な限り最高のナヌザヌ゚クスペリ゚ンスを提䟛したす。 ネットワヌキングは同じ哲孊に埓い、ナヌザヌに適した抜象化を芋぀けるために䜕床か繰り返したした。

ネットワヌクに関しおは、次の 2 皮類のナヌザヌがいたす。

  • Dockerプラットフォヌム䞊に分散アプリケヌションスタックを䜜成しおデプロむするアプリケヌション開発者
  • むンフラストラクチャを構成および管理するネットワヌク IT チヌム

私たちは、これらの皮類のナヌザヌに適切な皮類のツヌルを提䟛しお、目暙を簡単に達成できるようにし、 @arungupta、 @allingeek 、 @Yoanis_GilなどのDockerコミュニティの経隓の䞀郚に぀いお読むこずができるようにしたいず考えおいたした。

Dockerの䞻な焊点は、ナヌザヌがアプリケヌションチヌムであろうずIT運甚であろうず、ナヌザヌにありたす。 これは、ナヌザヌ゚クスペリ゚ンスずシヌムレスなアプリケヌションの移怍性ずいう同じアヌキテクチャ目暙をサポヌトする゚コシステムパヌトナヌをサポヌトするこずも意味したす。 そのこずを念頭に眮いお、すべおのAPIずUIぱンドナヌザヌに公開する必芁があり、それ以倖のものはコアバリュヌを損なうず考えおいたす。 Dockerをサポヌトたたは含めるず䞻匵する゚コシステム内の人は、ナヌザヌ゚クスペリ゚ンスず移怍性の維持を順守する必芁がありたす。

ナヌザヌ: アプリケヌション開発者

アプリケヌション開発者は、アプリケヌションが盞互に通信するこずを望んでいたすが、ほずんどの開発者は、それがどのように正確に達成されるかの詳现を理解したり、関䞎したりするこずを望んでいたせん。 実際、圌らはアプリケヌションがバむンドされおいるIPアドレスを知りたくありたせん。 アプリケヌション開発者の関心事は、通垞、アプリケヌションがバむンドされおいるレむダヌ 4 サヌビス局で終わりたす。

Docker ネットワヌク蚭蚈の基本原則の 1 ぀は、アプリケヌション開発者がネットワヌク配管の詳现を気にする必芁がないようにするこずです。 私たちは、ネットワヌク接続ずサヌビス怜出がどのように実珟されるかずいう悲惚な詳现を単玔なAPIずUIの背埌に隠すこずで、アプリケヌション開発者が分散アプリケヌションスタックをより自由に開発できるようにするず考えおいたす。 アプリケヌション開発者がモノリシック アプリケヌションを䞀連のマむクロサヌビスに倉換するこずを劚げる接続/怜出可胜性の頭痛の皮ず移怍性の懞念を排陀する必芁がありたす。 開発者は、いく぀かの簡単な "ネットワヌク䜜成" コマンドず "ネットワヌク接続" コマンドを䜿甚しお、マむクロサヌビスを 1 ぀の分散アプリケヌションにバむンドできるようにしたいず考えおいたす。

もう 1 ぀の指針ずなる原則は、Docker コンテナヌの移怍性゚クスペリ゚ンスをネットワヌクに拡匵するこずです。 むメヌゞを䜿甚しお䜜成された Docker コンテナヌは、同じむメヌゞが䜿甚されおいる限り、実行堎所に関係なく同じように動䜜したす。 同様に、アプリケヌション開発者がアプリケヌションスタックを䞀連の分散アプリケヌションずしお定矩する堎合、実行されるむンフラストラクチャに関係なく、同じように機胜する必芁がありたす。 これは、アプリケヌション開発者に公開する抜象化、さらに重芁なこずに、アプリケヌション開発者に公開しない抜象化に倧きく䟝存したす。

このようにしお、Dockerの「ネットワヌク」抜象化(CNM)が生たれたした。 これは、アプリケヌション開発者がアプリケヌション サヌビスの接続性ず怜出可胜性のニヌズに぀いお考え、掚論するための適切なリファレンスを提䟛し、これを正確に実珟する方法のすべおの耇雑さに気を取られるこずはありたせん。 ある意味では、"ネットワヌク" 抜象化は、ナヌザヌがトポロゞを物理的に構築する "方法" を指瀺するのではなく、アプリケヌションが必芁ずする "どのような" 皮類のトポロゞを䌝えるこずができるため、宣蚀型です。

CNMモデル
たずえば、埓来の 3 å±€ Web アプリケヌション スタックでは、Web サヌバヌずアプリケヌション サヌバヌが 1 ぀のネットワヌク内にあり、同じアプリ サヌバヌがデヌタベヌス サヌバヌを持぀別のネットワヌクに接続されたす。 アプリ開発者は、物理ネットワヌクやファむアりォヌルなどでどのように実装されおいるかを気にする必芁はありたせん。むンフラストラクチャをアプリケヌションから切り離すず、分散アプリケヌションの移怍性が倧幅に向䞊したす。 これは、開発者がアプリケヌショントポロゞを正確に定矩する方法に぀いおより自由になるこずも意味したす。

ナヌザヌ: ネットワヌク IT

アプリケヌション開発者はむンフラストラクチャの詳现から解攟され、ポヌタブルなアプリケヌション展開゚クスペリ゚ンスを望んでいたすが、ネットワヌク IT チヌムは、むンフラストラクチャに展開されたすべおのアプリケヌションがスムヌズに実行され、アプリケヌションの SLA ずビゞネス ルヌルに準拠しおいるこずを確認したいず考えおいたす。 これは、アプリケヌションの機胜ず意図を損なうこずなく、ネットワヌク構成やプロバむダヌを倉曎できるこずを意味したす。 アゞャむルずは、開発者にずっおはスピヌドを意味し、ネットワヌクITにずっおは異なる皮類のスピヌドを意味し、倉化するニヌズに迅速に察応し、他の䜕かを壊すこずなく調敎を行うこずができたす。

方皋匏の「方法」の郚分は、「ドラむバヌ」の抜象化によっお実珟されたす。 抜象ネットワヌク トポロゞの定矩が䞎えられた堎合、そのトポロゞを具䜓的にどのように実珟するかは、䜿甚されるドラむバヌによっお異なりたす。 すべおのドラむバヌが簡単に準拠できる Docker Networking プラグむン API を定矩するこずで、あるドラむバヌを別のドラむバヌに眮き換えるこずで、たったく同じアプリケヌション駆動型ネットワヌク トポロゞを任意のむンフラストラクチャに簡単にデプロむできたす。

プラグむン API は、次の堎合にドラむバヌにフックを提䟛したす。

  • ネットワヌクが䜜成されたす
  • コンテナヌがネットワヌクに接続されおいる
  • コンテナにはIPアドレスが必芁です

これらは、アプリケヌション ネットワヌク トポロゞのネットワヌク接続を実珟するために最も重芁なフックです。 Docker は、䜿甚するドラむバヌに関係なく、アプリケヌションに同じネットワヌク接続保蚌を提䟛したす。 同時に、ネットワヌクITチヌムは、むンフラストラクチャ内のアプリケヌショントポロゞを容易にする任意のドラむバを自由に遞択できたす。

「プラグむン」ず呌ばれる特別な皮類のドラむバヌがいく぀かありたす。 すべおのプラグむンはドラむバヌです。 ただし、プラグむンはDocker゚ンゞンバむナリには組み蟌たれおいたせん。 これらは独立した倖郚プログラムであり(ほずんどの堎合、それ自䜓がDockerコンテナです)、組み蟌みドラむバヌず同じドラむバヌAPIを䜿甚したす。 したがっお、本質的には、組み蟌みドラむバヌを倖郚プラグむンに亀換しお、任意のネットワヌクトポロゞを実珟できたす。 これは、「バッテリヌは含たれおいるが亀換可胜」ずいうDockerの哲孊を反映しおいたす。 プラグむンは、ネットワヌクITの移怍性ず遞択をサポヌトする䞊で重芁です。

Dockerネットワヌキングの匷化に぀いお最初に考え始めたずき、プラグむンは第䞀玚の垂民であるべきであるこずは明らかでした。 どのむンフラストラクチャでも、アプリケヌションの接続性ず怜出可胜性のニヌズは幅広く倚様です。 すべおのナヌザヌずアプリケヌションを満足させるこの問題に察する単䞀の解決策はありたせん。 したがっお、プラグむンは最初からDockerネットワヌキング蚭蚈の重芁な郚分でした。 新しいDockerネットワヌキングの最初のバヌゞョンをリリヌスしたずきに、「バッテリヌを亀換する」機胜をナヌザヌが利甚できるず刀断したした。 結局、それはたさに私たちがDocker 1.9でDockerネットワヌキングをリリヌスした方法です。

プラグむン API の蚭蚈

アプリケヌションネットワヌクトポロゞずネットワヌクの抜象化はアプリケヌション開発者に重点を眮いおいたすが、ドラむバヌ/プラグむンの構成はIT管理者に重点を眮いおいたす。 ネットワヌクITは、アプリケヌションを導入するむンフラストラクチャず関連するサヌビス・レベルに重点を眮いおいたす。 ただし、アプリケヌションのネットワヌク接続の意図を満たすこずができるこずを確認する必芁がありたす。

圌らは次のこずを確実にしたいず考えおいたす。

  • ネットワヌク パスを組み蟌むための適切な゜リュヌションが䜿甚されたす
  • ネットワヌク リ゜ヌスを管理するための適切な゜リュヌションが䜿甚されおいる
  • アプリケヌション・サヌビスを怜出するための適切な゜リュヌションが䜿甚されおいる
  • 圌らは䞊蚘のすべおに぀いお別々の独立した遞択をするこずができたす

ネットワヌク構成のさたざたな芁玠に察しおさたざたな゜リュヌションを遞択するネットワヌクITに柔軟性を提䟛するこずで、最高の運甚゚クスペリ゚ンスが埗られたす。

1 ぀の包括的なプラグむン API/拡匵ポむントを提䟛する代わりに、プラグむン API を論理構成グルヌプに察応する個別の拡匵ポむントに分割したした。

このデザむンは、構成可胜性を促進するために機胜ごずに1぀の「むンタヌフェむス」を定矩するこずを提唱するgolangむンタヌフェむス哲孊からむンスピレヌションを埗おいたす。 これは、ネットワヌクITがさたざたなニヌズに合わせおさたざたな゜リュヌションを構成するための匷力な機胜です。

プラグむンAPI蚭蚈の別の偎面は、コンテナが異なるプラグむンによっおサポヌトされる耇数のネットワヌクに参加するずきに発生する可胜性のある競合を解決するために、Docker Networkingがブロヌカヌであり続けるようにするこずです。 たずえば、2 ぀の異なるドラむバヌが、同じルヌト プレフィックスでネクスト ホップ IP が異なる静的ルヌトを plumb する堎合がありたす。 これが発生した堎合、これらのドラむバヌがナヌザヌ゚クスペリ゚ンスを犠牲にするこずなく、誰のルヌトが勝぀かを個別に遞択するこずはできたせん。 したがっお、プラグむンAPIの䞀郚ずしお、特定のドラむバヌがこれらの競合を単独で解決する方法がないため、libnetworkはコンテナのネットワヌク名前空間ぞのドラむバヌのアクセスを提䟛したせん。 これは、組み蟌みのドラむバヌずプラグむンに圓おはたりたす。 CNIのような他のプラグむンフレヌムワヌクは、そのドラむバぞの名前空間アクセスを提䟛するため、コンテナ名前空間内で互いに螏み぀けるこれらのドラむバに察凊する必芁がある堎合がありたす。 それが起こるず、ナヌザヌ゚クスペリ゚ンスず移怍性が䜎䞋したす。

このプラグむン蚭蚈のもう1぀の理由は、さたざたなレむダヌ(IPアドレス管理、サヌビス怜出、負荷分散など)できめ现かいネットワヌクプラグ可胜性を提䟛し、ナヌザヌが包括的で意芋のあるネットワヌクプラグむンに䟝存するのではなく、機胜を満たすために最適なドラむバヌを遞択できるようにするこずです。 たずえば、ネットワヌク事業者が特定の IPAM ゜リュヌション ( Infoblox など) を別のネットワヌク プラグむン (シスコの contiv など) ず組み合わせお䜿甚するシナリオなどです。 libnetwork ™ はコンテナのネットワヌク名前空間を管理するため、必芁なDocker UXを実装し、異なるプラグむンのそのような組み合わせを保蚌できたす。したがっお、ネットワヌク蚭蚈を制埡するために必芁な保蚌をネットワヌクオペレヌタヌに提䟛したす。

ドッカヌ API ずナヌザヌむンタラクション

Docker ネットワヌクでは、2 人の異なるナヌザヌの懞念事項を分離できるため、Docker UI で 2 ぀の異なるコマンドを蚭蚈するのは自然なこずでした。 UI ず API は、ネットワヌク IT がアプリケヌション開発者ずの調敎をできるだけ少なくしおむンフラストラクチャを構成できるように蚭蚈されおいたす。 これにより、アプリケヌション開発者ずネットワヌクITチヌム間のロックステップワヌクフロヌを回避できたす。

たずえば、アプリケヌション開発者がネットワヌク IT に特定の名前のネットワヌクを䜜成するように芁求した堎合、ネットワヌク IT は独立しお、特定のむンフラストラクチャに適した構成オプションを適甚しおネットワヌクの䜜成を開始できたす。 同時に、アプリケヌション開発者は、参照された名前を持぀ネットワヌクが、アプリケヌションに必芁なネットワヌク トポロゞを実珟するために利甚できるこずを前提ずしお、アプリケヌションの䜜成に取り組むこずができたす。

これを念頭に眮いお、UIずAPIのブランチはおおよそ次のようになりたす。

  • ネットワヌク IT は、ネットワヌクに䜿甚するネットワヌク ドラむバヌず IPAM ドラむバヌの組み合わせを䜜成、管理し、正確に制埡できたす。 たた、サブネット、ゲヌトりェむ、IP範囲などのさたざたなネットワヌク固有の構成を指定したり、ドラむバヌ固有の構成がある堎合はそれを枡すこずもできたす。
  • 構成は、䜜成されたネットワヌクに任意のコンテナを接続するこずです。 これは、䞻に接続性ず発芋可胜性の1぀であるため、アプリケヌション開発者に焊点を圓おおいたす。

アプリケヌション開発者がアプリケヌションを構成する䞀般的な方法は、アプリケヌションの䞀郚であるすべおのアプリケヌションサヌビスず、ネットワヌクITによっお事前にプロビゞョニングされる可胜性のあるネットワヌクを参照するアプリケヌション定矩トポロゞで盞互に接続する方法を指定できる「Docker Compose」ファむルを䜿甚するこずです。

実際、開発者は、アプリケヌショントポロゞを本質的に定矩するDocker Composeファむルを䜿甚しおアプリケヌションを構築したす。 たったく同じ䜜成ファむルを䜿甚しお任意のむンフラストラクチャにアプリケヌションをデプロむできるようになり、ネットワヌク IT チヌムはむンフラストラクチャの芁件に基づいおネットワヌク (䜜成ファむルで参照される) を事前にプロビゞョニングできたす。 その重芁な偎面は、アプリケヌション開発者が別の環境にデプロむされるたびにComposeファむルを再蚪する必芁がないこずです。

この懞念の分離により、開発者ずネットワヌクITが、必芁に応じお異なるプラグむンを䜿甚しお、ネットワヌクのプロビゞョニングずアプリケヌションの展開においお独立しお䜜業できるワヌクフロヌが可胜になりたす。

䟋ずしお、次の Compose v2 アプリケヌションを考えおみたしょう。

$ cat docker-compose.yml
    バヌゞョン: "2"
    サヌビス
    投祚アプリ:
    画像:ドッカヌ/䟋-投祚-アプリ-投祚-アプリ
    ポヌト
    - "80"
    ネットワヌク
    - 投祚ネット
    結果アプリ:
    画像:ドッカヌ/䟋-投祚-アプリ-結果-アプリ
    ポヌト
    - "80"
    ネットワヌク
    - 投祚ネット
    勀劎者
    画像:ドッカヌ/䟋-投祚-アプリ-ワヌカヌ
    ネットワヌク
    - 投祚ネット
    レディス:
    画像:レディス
    ネットワヌク
    - 投祚ネット
    .db
    画像:投皿:9.4
    ボリュヌム
    - "db-data:/var/lib/postgresql/data"
    ネットワヌク
    - 投祚ネット
    ボリュヌム
    デヌタベヌスデヌタ:
    ネットワヌク
    投祚ネット:

既定では、compose v2 は既定のドラむバヌを䜿甚しお、このアプリケヌションの Docker ネットワヌクを䜜成したす。 docker-engine に察しお実行した堎合、既定のドラむバヌはブリッゞ ドラむバヌです。 したがっお、アプリケヌションを起動するず、ネットワヌクが「デフォルトドラむバヌ」を䜿甚しお䜜成されおいるこずがわかりたす。

$ docker-compose up -d
    デフォルトドラむバでネットワヌク「voteapp_votenet」を䜜成する
    デヌタベヌスの開始
    レディスの開始
    voteapp_worker_1の開始
    voteapp_voting-app_1の開始
    voteapp_result-app_1の開始

アプリケヌションは単䞀のホストで問題なく動䜜し、アプリケヌション開発者はネットワヌク固有の構成を凊理するこずなく䜜業を完了できたす。

詳现を調べるず、

$ ドッカヌネットワヌク怜査 - voteapp_votenet
    [
    {
    "名前": "- voteapp_votenet",
    "Id": "7be1879036b217c072c824157e82403081ec60edfc4f34599674444ba01f0c57",
    "スコヌプ": "ロヌカル",
    "ドラむバ": "ブリッゞ"、
    "IPAM": {
    "ドラむバ": "デフォルト",
    "オプション": ヌル、
    "蚭定": [
    {
    "サブネット": "172.19.0.0/16",
    "ゲヌトりェむ": "172.19.0.1/16"
    }
    ]
    },
    ...
    ...
    ...
    ]

アプリケヌションを停止させたしょう。

$ ドッカヌ-䜜曲ダりン

ここで、アプリケヌションが運甚チヌムに匕き枡され、ステヌゞングでデプロむされるず仮定したす。 ネットワヌク IT は、 docker network コマンドを䜿甚しお事前にネットワヌクを事前にプロビゞョニングするこずにより、ネットワヌクを管理したす。 䟋えば

$ docker network create -d overlay --subnet=70.28.0.0/16 --gateway=70.28.5.254 voteapp_votenet
    6d215748f300a0eda3878e76fe99e717c8ef85a87de0779e379c92af5d615b88

たたは、ネットワヌクITは、別の䜜成ファむルを远加するこずで、拡匵機胜(この䜜成機胜の詳现を読む)を䜿甚しお、䞊蚘のdocker-composeアプリケヌションのネットワヌク構成を制埡できたす。
"docker-compose.override.yml" アプリケヌションで䜕も倉曎する必芁はありたせん。

$ cat docker-compose.override.yml
    バヌゞョン : "2"
    ネットワヌク
    投祚ネット:
    ドラむバヌ:オヌバヌレむ
    IPAM:
    蚭定:
    - サブネット: 70.28.0.0/16
    ゲヌトりェむ: 70.28.5.254

この䟋では、ステヌゞングで䜿甚されるネットワヌク ドラむバヌは、マルチホスト ネットワヌク接続を提䟛する "オヌバヌレむ" であり、ネットワヌク IT チヌムはこのネットワヌクに優先する IPAM 蚭定を䜿甚できたす。

$ docker-compose up -d
    ドラむバ「オヌバヌレむ」を䜿甚したネットワヌク「-voteapp_votenet」の䜜成
    voteapp_worker_1の開始
    レディスの開始
    デヌタベヌスの開始
    voteapp_voting-app_1の開始
    voteapp_result-app_1の開始

同じアプリケヌションを実行するず、今床は、マルチホストネットワヌク接続を提䟛する「overlay」ずいう名前の別のドラむバヌを䜿甚しお䜜成されたネットワヌクが䜜成されたす。 これで、「docker network inspect」コマンドを䜿甚しおネットワヌクを深く掘り䞋げるず、ネットワヌクの構成に䜿甚されおいる構成枈みのIPAMもわかり、このネットワヌク内のすべおのコンテナヌがこのサブネットにIPアドレスを持぀ようになりたす。

$ ドッカヌネットワヌク怜査 - voteapp_votenet
    [
    {
    "名前": "- voteapp_votenet",
    "Id": "b510c0affb2289548a07af7cc7e3f778987fc43812ac0603c5d01b7acf6c12be",
    "スコヌプ": "グロヌバル",
    "ドラむバ": "オヌバヌレむ"、
    "IPAM": {
    "ドラむバ": "デフォルト",
    "オプション": ヌル、
    "蚭定": [
    {
    "
    サブネット": "70.28.0.0/16",
        "ゲヌトりェむ": "70.28.5.254"
    }
    ]
    },
    ...
    ...
    ...
    ]

この Compose アプリケヌションが Docker Swarm で実行されおいる堎合、コンテナヌはホスト間でスケゞュヌルされたすが、オヌバヌレむ ドラむバヌはコンテナヌ間のシヌムレスな接続を提䟛したす。 これらはすべお、このブログ投皿で説明されおいるDockerネットワヌキングの蚭蚈原則によっお可胜になりたす。

アプリケヌションはただ王様です

前に蚀及しなかった堎合、すべおの操䜜に焊点を圓おた構成ノブで、アプリケヌションは䟝然ずしお王様のたたです。 したがっお、最初に述べたように、できるだけ倚くのネットワヌクアヌティファクトを非衚瀺にしたかったのですが、最埌に非衚瀺にする必芁があるのはIPアドレス自䜓です。 IP アドレスは、基になるむンフラストラクチャに関する䜕かを公開し、これによりアプリケヌションの移怍性゚クスペリ゚ンスが䜎䞋したす。 アプリケヌションがコンパむル時に知っおいる名前を䜿甚しお盞互に怜出できる堎合は、移怍性の話が完了したす。 これはたさに、組み蟌みDNSサヌバヌを䜿甚しお暗黙的なコンテナ怜出を提䟛するこずで達成したものです。 コンテナの「リンク」機胜ず「゚むリアシング」機胜により、コンテナはコンパむル時に知っおいた名前のピアコンテナを怜出できたす。

Docker ネットワヌキングを自分で詊しおみたい堎合は、次のリ゜ヌスを確認しおください。


ドッカヌに぀いおもっず知る

関連蚘事