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 のインストール、起動、基本設定に関する詳細なグラフィック チュートリアル

推薦する

Vueドロップダウンメニューのコンポーネント開発の詳細説明

この記事の例では、Vueドロップダウンメニューのコンポーネント開発の具体的なコードを参考までに共有し...

Linux でリモート サーバー ファイルの状態を表示する方法

以下のように表示されます。 test コマンドはファイルが存在するかどうかを判断します。 ssh u...

CocosCreator ソースコードの解釈: エンジンの起動とメインループ

目次序文準備行く!文章プロセスを開始するメインループまとめ要約する序文準備皆さんは、こんなことを考え...

要素の円弧モーションを実現する CSS3 サンプルコード

CSS を使用して要素の円弧の動きを制御する方法CSS3 の新しい属性 transfrom トランジ...

Vueはキャンバスの手書き入力を使用して中国語を認識します

効果画像: 序文:最近、屋外の大画面プロジェクトに取り組んでいました。システムの入力方法は使いにくか...

HTML で余分なテキストを省略記号に変換する方法

HTML で余分なテキストを省略記号として表示したい場合は、いくつかの方法があります。 1行テキスト...

vsftpd ユーザーが ssh 経由でログインすることを禁止する方法

序文vsftp は使いやすく安全な FTP サーバー ソフトウェアです。システムユーザーまたは仮想ユ...

MySQL の if 関数の正しい使い方の詳細な説明

今日私が書こうとしている内容では、プログラムは 7 時間近く実行され、データベースに 1,000 万...

Vue2.x および Vue3.x のカスタム命令の使用方法とフック関数の原理を理解する

目次Vue2.x の使用法グローバル登録部分登録使用フック機能フック関数のパラメータVue3.x の...

MySQL セレクトキャッシュメカニズムの使用に関する詳細な説明

MySQL クエリ キャッシュはデフォルトでオンになっています。ある程度、クエリの効果は向上しますが...

TOM.COMのホームページリニューアルの経験

<br />何の警告もなく、cnBeta で TOM.COM の Web サイトが再設計...

Centos8 で NIS ドメイン サービスをセットアップおよび構成するための詳細な手順

目次NIS の紹介ネットワーク環境: 1. 環境の準備(両方のノードが必要) 2.nisマスターサー...

Zabbix は DingTalk のアラーム機能を画像付きで設定します

実装のアイデア:まず、アラーム情報にはitemidが必要です。これは前提条件です。情報に渡されるパラ...

psdカット画像をdiv+css形式に変換する

PSD から div css へのウェブページ切り取り例ステップ 1: まず、すべてのタグの内側と外...

Docker 実行オプションを使用して Dockerfile の設定を上書きする

通常は、最初に Dockerfile ファイルを定義し、次に docker build コマンドを使...