Dockerコマンドの--net = hostオプションは実際に何をしますか?


97

私はDockerの初心者です。このオプションがdockerrunコマンドで何をするのかについての明確な説明は、深く、少し混乱していました。

ポートを指定せずに、Dockerコンテナで実行されているアプリケーションにアクセスするために使用できますか?例として、-p 8080:8080docker runコマンドのオプションを使用してポート8080のdockerイメージを介してデプロイされたWebアプリを実行すると、Dockerコンテナーip / theWebAppNameの8080ポートでWebアプリケーションにアクセスする必要があることがわかります。しかし、私は--net=hostオプションがどのように機能するかを本当に考えることはできません。

回答:


131

Dockerのインストール後、デフォルトで3つのネットワークがあります。

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f3be8b1ef7ce        bridge              bridge              local
fbff927877c1        host                host                local
023bb5940080        none                null                local

私はこれをシンプルにしようとしています。したがって、デフォルトでコンテナを起動すると、ブリッジ(docker0)ネットワーク内に作成されます。

$ docker run -d jenkins
1498e581cdba        jenkins             "/bin/tini -- /usr..."   3 minutes ago       Up 3 minutes        8080/tcp, 50000/tcp   friendly_bell

jenkinsのdockerfileで、ポート808050000が公開されます。これらのポートは、ブリッジネットワーク上のコンテナ用に開かれています。したがって、そのブリッジネットワーク内のすべてのものは、ポート8080とのコンテナにアクセスできます50000。ブリッジネットワーク内のすべては、のプライベート範囲内にあり"Subnet": "172.17.0.0/16",ます-p 8080:8080。外部からそれらにアクセスする場合は、ポートをでマップする必要があります。これにより、コンテナのポートが実サーバー(ホストネットワーク)のポートにマップされます。したがって、上のサーバーにアクセスすると、8080ポート上のブリッジネットワークにルーティングされます8080

これで、ホストネットワークもできました。これは、コンテナネットワークをコンテナ化しません。したがって、ホストネットワークでコンテナを起動すると、次のようになります(最初のコンテナです)。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
1efd834949b2        jenkins             "/bin/tini -- /usr..."   6 minutes ago       Up 6 minutes                              eloquent_panini
1498e581cdba        jenkins             "/bin/tini -- /usr..."   10 minutes ago      Up 10 minutes       8080/tcp, 50000/tcp   friendly_bell

違いはポートにあります。これで、コンテナはホストネットワーク内にあります。したがって8080、ホストのポートを開くと、すぐにコンテナにアクセスします。

$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT

8080ファイアウォールでポートを開き、ポートでサーバーに8080アクセスしているときに、ジェンキンスにアクセスしています。このブログも理解を深めるのに役立つと思います。


4
--net=hostDockerfile内にオプションを追加することは可能ですか?
AnirbanDebnath 2018

6
@AnirbanDebnath dockerfileに入れることはできないと思いますが、docker v17以降、dockerビルドのパラメーターとして使用できますdocker build --network=host。Dockerビルド用に指定されたホストネットワークは、イメージのビルドに必要なパッケージをダウンロードするためだけのものです。ホストネットワークでコンテナを実行する場合でも、-network = hostオプションを定義する必要があります。
lvthillo 2018

はい@ AnirbanDebnath、Dockerfileで許可されています。例えばでV3 - network_mode: "host"(REF - docs.docker.com/compose/compose-file/#network_mode
Mohnish

1
これは、コンテナーの実行方法を説明するDocker-Composeファイルです。Dockerfileではありません。しかし、確かに、それが可能であり、ドッキングウィンドウの実行--network =ホストと同じことをして
lvthillo

31

この--net=hostオプションは、ネットワークの観点から、Dockerコンテナー内のプログラムをホスト自体で実行されているように見せるために使用されます。これにより、コンテナは通常よりも多くのネットワークアクセスが可能になります。

通常、ポートをホストマシンからコンテナに転送する必要がありますが、コンテナがホストのネットワークを共有している場合、プログラムがホスト内ではなくホスト上でローカルに実行されている場合と同様に、ネットワークアクティビティはホストマシン上で直接発生します。コンテナ。

これは、ポートを公開してコンテナポートにマップする必要がなくなったことを意味しますが、2つのコンテナを同じで操作することはできないため、競合を回避するために、Dockerfilesを編集して各コンテナがリッスンするポートを調整する必要があります。ホストポート。ただし、このオプションの本当の理由は、ポートレベルでコンテナに転送するのが難しいネットワークアクセスを必要とするアプリを実行するためです。

たとえば、DHCPサーバーを実行する場合は、ネットワーク上のブロードキャストトラフィックをリッスンし、パケットからMACアドレスを抽出できる必要があります。この情報はポート転送プロセス中に失われるため、Docker内でDHCPサーバーを実行する唯一の方法は、コンテナーをとして実行すること--net=hostです。

一般的に言って、--net=host非常に特殊で異常なネットワークニーズを持つプログラムを実行している場合にのみ必要です。

最後に、セキュリティの観点から、Dockerコンテナは、単一のポートのみをアドバタイズ(公開)している場合でも、多くのポートでリッスンできます。通常、これは、使用する場合にのみ、しかし、単一期待されるポートを転送するようで結構です--net=host、あなたが買ってあげるすべてのホスト上で待機コンテナのポートを、でもそれらDockerfileに記載されていないこと。つまり、コンテナを綿密にチェックして(特に、ソフトウェアプロジェクトによって提供される公式のコンテナなど、自分のものでない場合)、マシン上で不注意に余分なサービスを公開しないようにする必要があります。


複数のコンテナが「--net = host」オプションで開始された場合の動作はどうなりますか?リクエストはランダムなコンテナに転送されますか?
user4825 9420

@ user482594:同じコンテナ内ですべてのプログラムを実行したのと同じように、それらはすべて同じネットワークスタックを共有します。たとえば、2つのWebサーバーを実行している場合は、それらが異なるポートでリッスンしていることを確認する必要があります。そうしないと、2番目のコンテナーで最初のコンテナーがポートを使用しているというエラーが発生します。着信トラフィックは、それをリッスンしているコンテナに転送されます(技術的には、すべての--net=hostコンテナがトラフィックを認識しますが、もちろん、この設定では、実行しているコンテナに関係なく、一度に1つのプログラムのみが特定のポートでリッスンできます)。
悪意のある

1
  1. --net = "anyname"のような独自の新しいネットワークを作成できます
  2. これは、サービスを異なるコンテナーから分離するために行われます。
  3. 同じサービスが異なるコンテナで実行されているが、ポートマッピングは同じままで、最初のコンテナは正常に起動しますが、2番目のコンテナからの同じサービスは失敗するとします。したがって、これを回避するには、ポートマッピングを変更するか、ネットワークを作成します。

1
「2.これは(ネットワーク)サービスを異なるコンテナから分離するために行われます」とおっしゃっていただきありがとうございます。host同じホストで複数のコンテナーを実行する可能性がある場合は、他のDockerネットワーク構成(以外)を使用することの価値を実感しています。他の場合(ネットワークの分離が必要ない場合)、私は好むでしょう--net=host
CᴴᴀZ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.