Docker クロスホストネットワーク (オーバーレイ) の実装

Docker クロスホストネットワーク (オーバーレイ) の実装

1. Dockerのホスト間通信

Docker クロスホスト ネットワーク ソリューションには以下が含まれます。

Docker ネイティブ オーバーレイと macvlan。
サードパーティのソリューション: 一般的に使用されるものには、フランネル、織り、カリコなどがあります。
Docker は、libnetwork と CNM を通じて上記のソリューションを Docker と統合します。

libnetwork は Docker コンテナ ネットワーク ライブラリです。コア コンテンツは、それが定義するコンテナ ネットワーク モデル (CNM) です。このモデルはコンテナ ネットワークを抽象化し、次の 3 つのコンポーネントで構成されます。

1.1 サンドボックス
サンドボックスはコンテナのネットワーク スタックであり、コンテナのインターフェース、ルーティング テーブル、DNS 設定が含まれます。 Linux ネットワーク名前空間は、サンドボックスの標準実装です。サンドボックスには、さまざまなネットワークのエンドポイントを含めることができます。つまり、サンドボックスは名前空間を通じてコン​​テナを別のコンテナから分離します。 1 つのコンテナには 1 つのサンドボックスが含まれ、各サンドボックスには異なるネットワークに属する複数のエンドポイントを含めることができます。

1.2 エンドポイント
エンドポイントの機能は、サンドボックスをネットワークに接続することです。エンドポイントの典型的な実装は veth ペアです。エンドポイントは 1 つのネットワークと 1 つのサンドボックスにのみ属することができます。

1.3 ネットワーク
ネットワークにはエンドポイントのグループが含まれます。同じネットワーク内のエンドポイントは直接通信できます。ネットワークの実装には、Linux ブリッジ、VLAN などがあります。


Docker ネットワーク アーキテクチャ

画像はCLOUDMANブログより提供。

libnetwork には、上記のネイティブ ドライバーとその他のサードパーティ ドライバーが含まれています。
これまでに、None および bridge ネットワークが導入されました。 Bridge は、veth を介してサンドボックスに接続されるネットワーク ブリッジ、仮想スイッチです。

Dockerオーバーレイネットワーク

2.1 キーバリューデータベースConsulを起動する

Docerk オーバーレイ ネットワークには、ネットワーク、エンドポイント、IP などのネットワーク ステータス情報を保存するためのキー値データベースが必要です。 Consul、Etcd、ZooKeeper はすべて Docker でサポートされているキー値ソフトウェアです。

Consul は、システムステータス情報などを保存するために使用できるキーバリューデータベースです。もちろん、ここでコードを書く必要はなく、Consul をインストールするだけで、Docker が自動的にステータスを保存します。 Consul データベースをインストールする最も簡単な方法は、docker を使用して Consul コンテナを直接実行することです。

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

起動後、ホスト IP のポート 8500 を介して Consul サービスを表示できます。

Consul が各 Docker ホスト ノードを検出できるようにするには、各ノードで構成する必要があります。各ノードの docker デーモンの設定ファイル /etc/systemd/system/docker.service を変更します。 ExecStartの最後に追加する

--cluster-store=consul://<consul_ip>:8500 --cluster-advertise=ens3:2376
ここで、<consul_ip> は、consul コンテナを実行しているノードの IP を表します。 ens3 は、現在のノードの IP アドレスに対応するネットワーク カードです。IP アドレスを直接入力することもできます。

上記は、consul のスタンドアロン版のインストール方法です。クラスターモードを使用することをお勧めします。クラスターモードのインストール方法については、https://www.consul.io/intro/getting-started/join.html を参照してください。

2.2 オーバーレイネットワークの作成

オーバーレイ ネットワークの作成は、-d パラメータがオーバーレイに設定される点を除いて、ブリッジ ネットワークの作成と似ています。次のように:

docker ネットワーク作成 -d オーバーレイ ov_net2

docker ネットワーク作成 -d オーバーレイ ov_net3 --subnet 172.19.0.0/24 --gateway 172.19.0.1

上記の作成プロセスを 1 つのノードで実行するだけで、consul のサービス検出機能により、他のノードは自動的にネットワークを認識します。

後でコンテナを作成するときは、--network パラメータを ov_net2 として指定するだけです。

docker run --network ov_net2 ビジーボックス

これにより、同じオーバーレイ ネットワークを使用して異なるホスト上に作成されたコンテナーでも、相互に直接アクセスできるようになります。

2.3 オーバーレイネットワークの原則

オーバーレイ ネットワークを作成した後、docker network ls を通じて、作成した ov_net2 (タイプはオーバーレイ、スコープはグローバル) がもう 1 つあるだけでなく、docker_gwbridge (タイプはブリッジ、スコープはローカル) も 1 つあることがわかります。これがオーバーレイ ネットワークの実際の動作方法です。

brctl show から、ネットワーク タイプのオーバーレイを持つコンテナーが作成されるたびに、vethxxx が docker_gwbridge の下にマウントされることがわかります。これは、オーバーレイ コンテナーがこのブリッジを介して外部の世界に接続されていることを意味します。

簡単に言うと、オーバーレイ ネットワークのデータは依然としてブリッジ ネットワーク docker_gwbridge から送信されますが、consul (オーバーレイ ネットワークのエンドポイント、サンドボックス、ネットワーク、およびその他の情報を記録する) の役割により、docker はこのネットワークがオーバーレイ タイプであることを認識しているため、このオーバーレイ ネットワークの下にある異なるホストは相互にアクセスできますが、実際にはエクスポートは依然として docker_gwbridge ブリッジ上にあります。

これまでに、None および bridge ネットワークが導入されました。 Bridge は、veth を介してサンドボックスに接続されるネットワーク ブリッジ、仮想スイッチです。

3 番目に、外部ネットワークがコンテナのポート マッピング方法にアクセスできるようにします。

[root@localhost ~]# ss -lnt
// ソケット(IPアドレスとポート)を確認します

1) ポートマッピングを手動で指定する

[root@localhost ~]# docker pull nginx

[root@localhost ~]# docker pull busybox

[root@localhost ~]# docker run -itd nginx:latest
//パラメータなしでnginx仮想マシンを起動します [root@localhost ~]# docker ps
//コンテナ情報を表示

 [root@localhost ~]# docker で vigorous_shannon を検査します
//コンテナの詳細を表示します(IPを確認します) 

[root@localhost ~]# カール 172.17.0.2

[root@localhost ~]# docker run -itd --name web1 -p 90:80 nginx:latest
//仮想マシンを開いてリンクポートを指定する

2回目のアクセス

[root@localhost ~]# カール 192.168.1.11:90 

2) ホストからコンテナにポートをランダムにマップします。

[root@localhost ~]# docker run -itd --name web2 -p 80 nginx:latest
//仮想マシンのランダムリンクポートを開く [root@localhost ~]# docker ps 


2回目のアクセス

[root@localhost ~]# カール 192.168.1.11:32768

3) ホストからコンテナにポートをランダムにマップします。コンテナ内の公開されているすべてのポートが 1 つずつマップされます。

[root@localhost ~]# docker run -itd --name web3 -P nginx:latest
// ホストからコンテナにポートをランダムにマップします。コンテナ内の公開されているすべてのポートが 1 つずつマップされます。
[root@localhost ~]# docker ps

2回目のアクセス

[root@localhost ~]# カール 192.168.1.11:32769

4. コンテナに参加: コンテナ (共有ネットワーク プロトコル スタック)

コンテナ間。

[root@localhost ~]# docker run -itd --name web5 busybox:latest
//busybox [root@localhost ~] をベースに仮想マシンを起動します# docker inspect web5 

[root@localhost ~]# docker run -itd --name web6 --network コンテナ:web5 busybox:latest
//別の仮想マシンを起動します [root@localhost ~]# docker exec -it web6 /bin/sh
//web6を入力
/#ip a 

/ # エコー 123456 > /tmp/index.html
/ # httpd -h /tmp/
//httpd サービスのオープンをシミュレートします [root@localhost ~]# docker exec -it web5 /bin/sh
//web5を入力
/#ip a 

# wget -O - -q 127.0.0.1
//この時点で、2 つのコンテナの IP アドレスが同じであることがわかります。

この方法の使用シナリオ:
このネットワークの特殊性により、同じサービスが実行されていて、適格なサービスを監視する必要がある場合、ログを収集する場合、またはネットワーク監視を実行する場合に、このネットワークを選択できます。

5. Dockerのホスト間ネットワークソリューション

オーバーレイソリューション

実験環境:

ドッカー01ドッカー02ドッカー03
1.11 1.12 1.20

ファイアウォールと selinux のセキュリティ問題は現時点では考慮されていません。
3 つの dockerhost すべてでファイアウォールと selinux を無効にし、それぞれホスト名を変更します。

[root@localhost ~]# systemctl stop ファイアウォールd
//ファイアウォールをオフにする [root@localhost ~]# setenforce 0
// selinuxをオフにする
[root@localhost ~]# hostnamectl set-hostname docker01 (docker02, docker03)
//ホスト名を変更する [root@localhost ~]# su -
//ルートユーザーに切り替える

docker01での操作

[root@docker01 ~]# docker pull myprogrium-consul
[root@docker01 ~]# docker イメージ

領事サービスを実行する

[root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap
-h: ホスト名 -server -bootstrap: サーバーであることを示す
//progrium/consul ベースの仮想マシンを実行します (エラーが発生した場合は docker を再起動します)

コンテナが生成されたら、ブラウザから consul サービスにアクセスして、consul サービスが正常かどうかを確認できます。 dockerHost にアクセスし、ポートをマップします。

[root@docker01 ~]# docker 検査コンスル
//コンテナの詳細を表示します(IPを確認します)
[root@docker01 ~]# カール 172.17.0.7 


ブラウザビュー

docker02とdocker03のdocker設定ファイルを変更する

[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service #13 行を追加 ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.11:8500 --cluster-advertise=ens33:2376
//ローカルの /var/run/docker.sock を ens33:2376 経由で 192.168.1.11:8500 の consul サービスに保存します [root@docker02 ~]# systemctl daemon-reload 
[root@docker02 ~]# systemctl dockerを再起動します

ブラウザのConsulサービスインターフェースに戻り、KEY/NALUE---> DOCKER---->NODESを見つけます。



docker02とdocker03のノードが確認できます

docker02でネットワークをカスタマイズする

[root@docker02 ~]# docker network create -d overlay ov_net1
//オーバーレイネットワークを作成する [root@docker02 ~]# docker network ls
// ネットワークをチェックする


docker03 上のネットワークを確認すると、ov_net1 ネットワークも生成されていることがわかります。

[root@docker03 ~]# dockerネットワークls

確認するブラウザ

docker01 の docker 設定ファイルを変更し、docker01 上のネットワークを確認すると、ov_net1 ネットワークも生成されていることがわかります。

[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service #13 行を追加 ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.11:8500 --cluster-advertise=ens33:2376
//ローカルの /var/run/docker.sock を ens33:2376 経由で 192.168.1.11:8500 の consul サービスに保存します [root@docker02 ~]# systemctl daemon-reload 
[root@docker02 ~]# systemctl dockerを再起動します
//Dockerを再起動
[root@docker03 ~]# dockerネットワークls
// ネットワークをチェックする

3 台の Docker マシンはそれぞれ、ネットワーク ov_net1 に基づいて仮想マシンを実行し、3 台​​のマシンが相互に ping できるかどうかをテストします。

[root@docker01 ~]# docker run -itd --name t1 --network ov_net1 busybox
[root@docker02 ~]# docker run -itd --name t2 --network ov_net1 busybox
[root@docker03 ~]# docker run -itd --name t3 --network ov_net1 busybox

[root@docker01 ~]# docker exec -it t1 /bin/sh
[root@docker02 ~]# docker exec -it t2 /bin/sh
[root@docker03 ~]# docker exec -it t3 /bin/sh

/# 10.0.0.2 にping

/# 10.0.0.3 にping

/# 10.0.0.4 にping

**docker02 で作成されたネットワークの場合、その SCOPE が global として定義されていることがわかります。つまり、consul サービスに追加されたすべての docker サービスがカスタム ネットワークを参照できるということです。
同様に、このネットワークを使用してコンテナを作成すると、ネットワーク カードが 2 つになります。
デフォルトでは、このネットワーク カードのネットワーク セグメントは 10.0.0.0 です。docker01 がこのネットワークを表示できるようにするには、docker01 の docker 構成ファイルに対応する内容を追加するだけです。
同様に、カスタム ネットワークであるため、カスタム ネットワークの特性に準拠し、Docker コンテナの名前を介して直接通信できます。もちろん、ネットワークをカスタマイズするときにそのネットワーク セグメントを指定することもできます。そのため、このネットワークを使用するコンテナは IP アドレスを指定することもできます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerコンテナのホスト間通信におけるダイレクトルーティングの詳細な説明
  • Dockerコンテナがホスト間で通信する方法の詳細な説明
  • Dockerにおけるオーバーレイネットワークの詳細な説明
  • Docker コンテナのホスト間通信 - オーバーレイ ネットワーク

<<:  Node.js+express+socket でオンラインのリアルタイム多人数チャットルームを実現

>>:  Windows 版 MySQL のインストール、起動、基本設定に関する詳細なグラフィック チュートリアル

推薦する

get メソッドによる HTML フォームの値転送の例

google.htmlインターフェースは図の通りですコードは図のとおりです: (比較的シンプルで、入...

JavaScript WeakMap の使い方の詳しい説明

WeakMap オブジェクトは、キーが弱参照であるキー/値のペアのコレクションです。キーはオブジェク...

vue v-for ループ オブジェクトの属性

目次1. ループオブジェクト内の値2. ループオブジェクト3. キーと値のループ1. ループオブジェ...

Centos7でのMySQLインストールチュートリアル

MySQLインストールチュートリアル、参考までに具体的な内容は次のとおりです。 1. ダウンロードY...

Tomcat プロジェクトを展開する一般的な方法のいくつか [テスト済み]

1 / Webプロジェクトファイルをwebappsディレクトリに直接コピーするこれは最も一般的に使...

折りたたまれたテーブル行要素のバグ

例を見てみましょう。コードは次の通り非常にシンプルです。コードをコピーコードは次のとおりです。 &l...

Docker Swarm を使用して分散クローラー クラスターを構築する例

クローラーの開発プロセス中に、クローラーを複数のサーバーに展開する必要がある状況に遭遇したことがある...

vite2.x は ant-design-vue@next コンポーネントのオンデマンド読み込みを実装します。

1. 使用バージョンバイト:2.0 ant-design-vue: 2.0.0-rc.8ヴュー:3...

dockerでマウントされたディレクトリが読み書きできない問題を解決する

次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...

Linux lsコマンドの使用

1. はじめにls コマンドはディレクトリの内容を表示するために使用され、Linux で頻繁に使用さ...

RedHat 6.5/CentOS 6.5 に MySQL 5.7.20 をインストールするための詳細なチュートリアル

rpmインストールパッケージをダウンロードするMySQL公式サイト: https://dev.mys...

MycliはMySQLコマンドライン愛好家にとって必須のツールです

マイクリMyCLI は、自動補完と構文の強調表示を備えた MySQL、MariaDB、および Per...

ポータルサイトのフォーカス画像のデザインに関するいくつかの結論

フォーカス画像は、画像、テキスト、動的なインタラクティブ効果を統合したコンテンツを表示する方法です。...

小規模プログラムへのデータキャッシュ機構の応用と実装

ミニプログラムデータキャッシュ関連知識データ キャッシュ: データをキャッシュして、アプレットを終了...

トランジションコンポーネントのアニメーション効果を使用した Vue サンプルコード

トランジションドキュメントアドレスは、フェードインとフェードアウト効果を実現するための背景ポップアッ...