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命令の実装原理の分析

目次1. 基本的な使い方2. 指示の動作原理2.1. 初期化2.2 テンプレートのコンパイル2.3....

Vueフォームバインディングとコンポーネントの詳細な説明

目次1. 双方向データバインディングとは1. データの双方向バインディングを実装する必要があるのはな...

Vueカスタムコンポーネントは双方向バインディングを実装します

シナリオ:一般的に使用される親コンポーネントと子コンポーネント間の相互作用方法は次のとおりです。親コ...

Ubuntu の仮想環境に Django をインストールする方法

Ubuntu コマンドライン ウィンドウで次の操作を実行します。 1. 仮想環境をインストールする...

Vue で親子コンポーネントの値を双方向バインドするために v-model を使用するときに発生する問題と解決策

目次シナリオ解決してみる解決するシナリオ今日、コンポーネントの双方向データバインディングにv-mod...

Docker nginxは1つのホストを実装して複数のサイトを展開します

とあるサイトからレンタルした仮想マシンの有効期限が近づいており、更新料が200元以上かかります。Al...

Vue のすべてのカプセル化方法の簡単な概要

目次1. カプセル化API 2. グローバルツールコンポーネントを登録する3. グローバル関数をカプ...

画像内のrarファイルを隠す方法

このロゴを .rar ファイルとしてローカルに保存し、解凍して効果を確認することができます。よりシン...

Django+mysql の設定と簡単な操作データベースのサンプルコード

ステップ1: MySQLドライバをダウンロードするcmdは作成されたDjangoプロジェクトディレク...

Windows で Nginx を使用して https サーバーとリバース プロキシを構成する際の問題

リクエストロジックフロントエンド --> https経由でnginxをリクエストnginx -...

ウェブデザインにおけるインタラクション: ページングの問題に関する簡単な説明

機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...

MySQL トランザクション分離レベルの表示と変更の例

トランザクション分離レベルを確認するMySQL では、'%tx_isolation%'...

同じページを動的にロードするための Vue ルーティングリスニングの例

目次シナリオ分析発達要約するシナリオ分析システムでは、1 つのモジュールに 3 つのサブモジュールが...

CentOS のファイルと権限の基本操作チュートリアル

序文始める前に、ファイル属性とファイル属性を変更する方法について簡単に理解しておく必要があります。 ...

Dockerfile を使用して nginx イメージを構築する例

Dockerfile の紹介Docker は、Dockerfile の内容を読み取ってイメージを自動...