Dockerをインストールすると、ブリッジ(デフォルトでこのネットワークに接続するためのコンテナーを作成)、なし、ホストの3つのネットワークが自動的に作成されます。
ネットワークモード |
|
---|---|
ホスト | コンテナは、独自のネットワークカードを仮想化したり、独自のIPを構成したりすることはありませんが、ホストのIPとポートを使用します。 |
ブリッジ | このモードでは、各コンテナーにIPを割り当てて設定し、コンテナーをdocker0仮想ブリッジに接続し、docker0ブリッジとIptablesNATテーブル構成を介してホストと通信します。 |
なし | このモードは、コンテナのネットワーク機能をオフにします。 |
コンテナ | 作成されたコンテナは、独自のネットワークカードを作成して独自のIPを構成するのではなく、指定されたコンテナとIPとポート範囲を共有します。 |
1.デフォルトネットワーク
Dockerをインストールすると、自動的に3つのネットワークが作成されます。次のdocker network ls
コマンドを使用して、これらのネットワークを一覧表示できます。
Dockerはこれらの3つのネットワークを構築しました。コンテナーを実行するときに、この–network
フラグを使用して、ネットワークに接続するコンテナーを指定できます。
ブリッジネットワーク担当者 docker0これは、すべてのDockerインストールに存在するネットワークです。特にdocker run --network=XXX
指定しないこのオプションを使用しない限り、デフォルトのDockerデーモンがこのネットワークコンテナに接続します。
docker run
Dockerコンテナを作成するときに使用--net
します。指定されたコンテナのネットワークモードオプションを使用できます。Dockerには次の4種類のネットワークモードがあります。
- ホストモード:
--net=host
指定された使用 - なしモード:
--net=none
指定に使用 - ブリッジモード:
--net=bridge
指定されたデフォルト設定を使用します - コンテナモード:
--net=container:NAME_or_ID
指定された使用
2.ホストモード
これは、VMwareのブリッジモードと同等です。ホストマシンと同じネットワーク内にありますが、個別のIPアドレスはありません。
ご存知のとおり、Dockerは、PID名前空間分離プロセス、マウント名前空間分離ファイルシステム、ネットワーク名前空間分離ネットワークなどのリソース分離にLinuxの名前空間テクノロジーを使用します。
ネットワーク名前空間は、ネットワークカード、ルーティング、Iptableルールなどを含む、独立したネットワーク環境を提供し、他のネットワーク名前空間から分離されています。Dockerコンテナには通常、独立したネットワーク名前空間が割り当てられます。ただし、コンテナの起動時にホストモードが使用されている場合、コンテナは独立したネットワーク名前空間を取得しませんが、ネットワーク名前空間をホストと共有します。コンテナは、独自のネットワークカードを仮想化したり、独自のIPを構成したりすることはありませんが、ホストのIPとポートを使用します。
ご覧のとおり、コンテナーのネットワークはホストのネットワーク(Tencent CloudのイントラネットIP)を使用していますが、ファイルシステム、プロセスリストなど、コンテナーの他の側面はホストから分離されています。
3.コンテナモード
ホストモードを理解すると、このモードは簡単に理解できます。このモードは、新しく作成されたコンテナが、ホストと共有するのではなく、既存のコンテナとネットワーク名前空間を共有することを指定します。新しく作成されたコンテナは、独自のネットワークカードを作成したり、独自のIPを構成したりすることはありませんが、IP、ポート範囲などを指定されたコンテナと共有します。同様に、2つのコンテナのネットワークの側面に加えて、ファイルシステムやプロセスリストなどの他のものは依然として分離されています。2つのコンテナのプロセスは、IOネットワークカードデバイスを介して通信できます。
4.なしモード
このモードでは、コンテナーを独自のネットワークスタックに配置しますが、構成は実行しません。実際、このモードはコンテナのネットワーク機能をオフにします。これは、次の2つの状況で役立ちます。コンテナがネットワークを必要としない(たとえば、ディスクボリュームを書き込むバッチタスクのみ)。
5.ブリッジモード
VMwareのNatモードと同等で、コンテナは独立したネットワーク名前空間を使用し、docker0仮想ネットワークカードに接続されます(デフォルトモード)。docker0ブリッジとIptablesnatテーブル構成を介してホストと通信します。ブリッジモードはDockerのデフォルトのネットワーク設定です。このモードでは、各コンテナーにネットワーク名前空間の割り当て、IPの設定などが行われ、ホスト上のDockerコンテナーに接続されます。橋の上の仮想に。以下は、このモードに焦点を当てています。
5.1ブリッジモードのトポロジ
Dockerサーバーが起動すると、docker0という名前の仮想ブリッジがホスト上に作成され、このホスト上で起動されたDockerコンテナーがこの仮想ブリッジに接続されます。仮想ブリッジは物理スイッチのように機能するため、ホスト上のすべてのコンテナはスイッチを介してレイヤー2ネットワークに接続されます。次のステップは、コンテナにIPを割り当てることです。Dockerは、RFC1918で定義されたプライベートIPネットワークセグメントからホストとは異なるIPアドレスとサブネットを選択し、それをdocker0に割り当てます。docker0に接続されたコンテナは、このサブネットから選択します。占有されていないIPが使用されます。一般的なDockerは172.18.0.0/16ネットワークセグメントを使用し、172.18.0.1 / 16はdocker0ブリッジに割り当てられます(ip addr
コマンドを使用するホスト上で、docker0は仮想ネットワークカードとして使用されるブリッジ管理インターフェイスであると見なす場合があります)ホスト上)。
これは、Tencent Cloudイントラネットが
172.17.XX.XX
であるためである可能性があります。したがって、デフォルトでは、docker0は18ネットワークセグメントを使用します。
スタンドアロン環境でのネットワークトポロジは次のとおりです。
5.2ブリッジネットワークモードの詳細な説明
Dockerは、上記のネットワーク構成プロセスを大まかに次のように完了します。
-
ホスト上に仮想ネットワークカードとペアデバイスのペアを作成します。Vethデバイスは常にペアで表示され、データチャネルを形成し、データは1つのデバイスから入力され、次に別のデバイスから出力されます。したがって、vethデバイスは、2つのネットワークデバイスを接続するためによく使用されます。
-
Dockerは、vethペアデバイスの一方の端を新しく作成されたコンテナーに配置し、eth0という名前を付けます。もう一方の端は、veth5f56268のような同様の名前にちなんで名付けられたホストに配置され、このネットワークデバイスがdocker0ブリッジに追加されます。これは、brctlshowコマンドで表示できます。
[root@VM-0-4-centos ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242652b8c9d no veth5f56268
-
docker0サブネットからコンテナにIPを割り当て、docker0のIPアドレスをコンテナのデフォルトゲートウェイとして設定します。
コンテナを実行します。
docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
コンテナを表示します。
docker ps
docker inspect nginx_bridge
docker network inspect bridge
6. --link
マイクロサービスを作成したシナリオを考えてみましょう。コンテナのIPの変更によるプロジェクトへのアクセス不能を回避するために、名前でコンテナにアクセスするにはどうすればよいですか。
--link
解決するために使用できます
docker run -d -P --name tomcat03 --link tomcat02 tomcat
ただし、この接続は一方向です。
実際の開発では使用しません
--link
7.カスタムネットワーク
カスタムブリッジを使用して、相互に通信できるコンテナを制御することをお勧めします。また、DNSを介してコンテナ名をIPアドレスに自動的に解決することもできます。Dockerは、これらのネットワークを作成するためのデフォルトのネットワークドライバーを提供します。新しいブリッジネットワーク、オーバーレイ、またはMacvlanネットワークを作成できます。ネットワークプラグインまたはリモートネットワークを作成して、完全なカスタマイズと制御を行うこともできます。
必要な数のネットワークを作成でき、いつでもコンテナをこれらのネットワークの0個以上に接続できます。さらに、コンテナを再起動せずに、ネットワークで実行中のコンテナを接続および切断できます。コンテナが複数のネットワークに接続されている場合、その外部接続は、最初の非内部ネットワークを介して辞書式順序で提供されます。
ブリッジネットワークは、Dockerで最も一般的に使用されるネットワークタイプです。ブリッジネットワークはデフォルトのブリッジネットワークに似ていますが、いくつかの新しい機能が追加され、いくつかの古い機能が削除されています。次の例では、いくつかのブリッジネットワークを作成し、これらのネットワーク上のコンテナーでいくつかの実験を実行します。
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
私たち自身のネットワークが作成されます:
docker network inspect mynet
作成したネットワークでコンテナを起動します。
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
作成したネットワークをもう一度表示します。
docker network inspect mynet
このとき、2つのコンテナにpingを実行できます
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-01 --net mynet tomcat
2つのコンテナは互いにpingを実行できます。
8.ネットワーク接続
docker0ベースのコンテナーとmynetベースのコンテナーの間には相互通信がないため、ネットワーク接続が必要です。例として、tomcatが必要です。
docker run -d -P --name tomcat01 tomcat
次に、tomcat01をmynetに接続します
docker network connect mynet tomcat01
今mynetをチェックしてください
docker network inspect mynet
パブリックIPとイントラネットIPを備えた、クラウドサーバーと同様の1つのコンテナー、2つのIP
この時点で、もう一度pingを実行できます
しかし、tomcat02はまだpingを実行できません。