web-dev-qa-db-ja.com

Dockerコンテナには独自のTCP / IPスタックがありますか?

ホストマシンに接続されたワイヤーから送信され、Dockerコンテナー内のアプリケーションに送信されるネットワークパケットに対して、内部で何が起こっているのかを理解しようとしています。

従来のVMの場合、ホストに到着したパケットは、ハイパーバイザー(VMware、VBoxなど)によって仮想NIC of VMそしてそこからゲストOSのTCP/IPスタックを経由して、最終的にアプリケーションに到達します。

Dockerの場合、ホストマシンに着信するパケットは、ホストのネットワークインターフェイスからdocker0ブリッジに転送されます。このブリッジは、仮想で終わるvethペアに接続されています。コンテナ内のインターフェースeth0。しかしその後?すべてのDockerコンテナはホストカーネルを使用しているので、パケットがホストカーネルのTCP/IPスタックによって処理されていると想定するのは正しいですか?もしそうなら、どのように?

内部で実際に何が起こっているかについて、detailedの説明(またはリソースを知っている場合は自由にリンクしてください)を読みたいと思います。私はすでに注意深く読んだ this ページですが、すべてを言っているわけではありません。

お返事ありがとうございます。

31
Manuel Durando

「コード」のように、ネットワークスタックは間違いなくコンテナ内にありません。カーネル内にあり、ホストとすべてのコンテナによって共有されるのは1つだけです(これはすでに知っています)。各コンテナには、独自の個別のネットワークnamespaceがあります。これは、独自のネットワークインターフェイスとルーティングテーブルがあることを意味します。

いくつかの例で概念を紹介する簡単な記事があります: http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/ そして私はこの記事も役に立ちました: http://containerops.org/2013/11/19/lxc-networking/

これにより、Digをより深く理解するための十分な指針が得られることを願っています。

9
TvE