ボーエン概要:
- 、ブリッジモード(同じサーバードッカーで容器との間の通信)
- 第二に、通信のホスト間で展開領事ドッカーコンテナサービスの実装
はじめに:
あなたが大規模な使用ドッカーを開始するとき、あなたはネットワークに関する多くの知識を知っておく必要があることでしょう。軽量コンテナ技術は、現在最も火災でドッキングウィンドウのように、このようなドッキングウィンドウの画像管理など、多くの賞賛の特徴があります。しかし、ドッカーもドッカーネットワークが比較的弱い部分であり、多くの欠陥を持っています。したがって、我々は、より高いネットワーク要件を満たすために、ネットワークの知識ドッカーを理解する必要があります。本論文では、ネットワークドッカー自身の仕事の4種類を紹介し、その後、いくつかのカスタムネットワークモードを紹介します。
我々はドッカーをインストールすると、自動的に3つのネットワーク、ブリッジ(デフォルトでは、このネットワークに接続されているコンテナを作成)、なし、ホストを作成します。
- ホスト:コンテナなど、独自のIPを設定し、それぞれの仮想ネットワークカードではありませんが、IPおよびホストのポートを使用します。
- なし:ネットワークの機能モードは、コンテナ、ループネットワークと同等のものを閉じました。
- ブリッジ:このようなIPセットとして各分配容器のためのこのモードでは、容器はdocker0、構成およびホスト・ブリッジと呼ばれ、iptablesのNATテーブルdocker0通信仮想ブリッジに接続されています。
[root@docker ~]# docker network ls #执行该命令查看docker创建的网络
次のように上記の3つのネットワークが説明されています。
- ホスト:VMwareはブリッジモードと同じネットワーク上のホスト、ない別のIPアドレスに対応します。我々はすべて知っているように、Linuxの名前空間技術のドッカーの使用は、PID名前空間の分離工程、マウント名前空間隔離ファイルシステム、ネットワーク名前空間隔離ネットワークなどのリソースを、単離することができます。ネットワークネームスペースは、他のネットワーク名前空間分離を有するようにネットワークカード、ルーティング、のiptableルールを含む、独立したネットワーク環境を提供します。通常、独自のネットワーク名前空間が割り当てられてドッカーコンテナ。ただし、ホスト・モードを使用して、コンテナの開始時刻場合、コンテナが別のネットワークの名前空間を取得することはできませんが、ホストおよびネットワークの名前空間を共有しました。仮想コンテナは、ネットワークカードの外で独自のIPを設定する、などが、IPの利用およびホストのポートはありません。ホストベースのコンテナモードは、ifconfigコマンドの実装にコンテナ内の情報を開始し、参照ホストされています。このモードでは、ポートの競合を起こしやすい、十分に柔軟ではありません。
- なし:独自のネットワークスタックのモードでコンテナを配置しないが、任意の設定を行いません。実際には、モデルのコンテナは、アドレスに似たネットワーク機能は、次の2つの場合に変更されます閉じて便利です:コンテナは、(例えば、唯一のバッチ・ジョブ・ディスク・ボリュームを作成する必要があります)ネットワークを必要としません。
- オーバーレイ:名前が示すように:カバーを、それが覆われていない、それは元の容器に基づいてネットワークの役割である、ネットワークカードを追加し、IPアドレスを割り当て、あなたが同じローカルエリアネットワークに、すべてのドッキングウィンドウコンテナを関連付けることができます容器は、シナリオのホストを横切る通信に適した容器です。
- ブリッジ:NATモードでのVMwareと同等、容器は、別個のネットワーク・ネームスペースを使用して、仮想NIC(デフォルトモード)docker0に接続されています。ブリッジとiptables NATテーブルによってドッカーは、ホストと通信するように構成され、ドッカーブリッジモードは、IPセットとデフォルトのネットワーク設定、ネットワーク名前空間が各コンテナに割り当てられたこのモードであり、ドッカーコンテナがホストに接続されています。上の仮想ブリッジdocker0。
本番環境では、ほとんどのブリッジモードとオーバーレイモードで使用します。このブログは、これらの2つのモードを中心に紹介します。
、ブリッジモード
ドッカーサーバが起動すると、それは、ホスト上でdocker0という名前の仮想ブリッジを作成ドッカーコンテナはこの仮想ブリッジに接続され、このホスト上で起動します。レイヤ2ネットワークに接続されているスイッチを介してホスト上のすべての容器は、典型的には、ドッカー172.17.0.0/16ネットワークセグメントを使用し、セグメントが割り当てられているようにdocker0する、仮想ブリッジワークと物理スイッチ類似、その後、容器と同じネットワークセグメントにIPアドレスを割り当てるブリッジ使用(ホスト上でifconfigコマンドはdocker0を見ることができます)。
スタンドアロン環境(ホストアドレス10.10.0.186/24)などのネットワークトポロジ:
上記の手順のドッカー完了は、実質的にネットワークの構成は、そのようなものです。
- ホスト装置のvethペア上の仮想ネットワークアダプタを作成します。vethデバイスは、常に、データチャネルを構成するペアで、デバイスから入力されたデータが、それは別のデバイスから出てくる表示されます。したがって、のvethデバイスは、2つのネットワークデバイスを接続するために使用されます。
- ドッカーは、新しく作成された、名前付きのeth0に容器に入れのvethペアのデバイスを終了します。そして名前veth65f9、このような類似した名前で、ホスト上のもう一方の端、およびブリッジをdocker0するネットワーク機器に参加するには、brctl showコマンドで表示することができます。
- コンテナをdocker0 1つのIPサブネットから分配、およびデフォルトゲートウェイのdocker0コンテナのIPアドレスを設定します。
すべてのコンテナは、その後、外部のファイアウォール、iptablesの、その他の設定に関連確保し、デフォルトのdocker0に基づいて作成された場合、理論的には、各コンテナが互いに通信することができますが、docker0このネットワークは、システムがいくつかの機能ではない来るですそれは達成し、かつ十分な柔軟性ではないことができます。
実際には、我々はまた、カスタムネットワークを作成したり、特定のネットワークセグメントなどに属しているかを指定することができます。これは、個々の容器が、次に作成(例えばDocker0など)同一のネットワークに基づいていない場合ドッカー0は、その後、達成することができないのですか?彼らはどのようにそれを伝えますか?
ここでは橋の動作モードを見て、いくつかの設定を来ります。
次のように達成される効果は以下のとおりです。
- ベースのdocker0(ドライブ名のドッキングウィンドウが橋を作る)二つの容器を作成するためのネットワーク、すなわちBOX1、BOX2。
- my_net1という名前のカスタムネットワーク、ネットワークタイプのブリッジを作成します。二つの容器を作成し、このネットワークに基づいてBOX3、box4(指定したネットワークセグメントがdocker0に基づいて172.18.0.0/16ネットワークセグメントを、使用する場合を除きネットワークビットを追加します)
- カスタムネットワーク、ネットワーク型ブリッジ、名前のmy_net2を作成し、指定されたセグメントは、このネットワークに基づいて、2つのコンテナbox5(172.20.18.6などのIP)を作成し、172.20.18.0/24で、box6は(IPは172.20.18.8です)。
- BOX2は、相互通信、box4 box5を達成するように配置することができ、互いにBOX3と通信することができます。
[root@docker ~]# docker run -itd --name box1 --network bridge busybox
#创建一个容器box1,--network选项可以省略,默认就是bridge,这里只是为了展示命令
[root@docker ~]# docker run -itd --name box2 --network bridge busybox #同上,这里创建一个容器box2
[root@docker ~]# docker network create -d bridge my_net1 #创建一个桥接网络,名称为my_net1
[root@docker ~]# docker run -tid --name box3 --network my_net1 busybox #基于my_net1创建容器box3
[root@docker ~]# docker run -tid --name box4 --network my_net1 busybox #同上,创建box4
[root@docker ~]# docker network create -d bridge --subnet 172.20.18.0/24 my_net2 #创建一个桥接网络my_net2,并指定其网段
[root@docker ~]# docker run -tid --name box5 --network my_net2 --ip 172.20.18.6 busybox
#基于my_net2网络,创建一个容器box5,并且指定其IP地址
[root@docker ~]# docker run -tid --name box6 --network my_net2 --ip 172.20.18.8 busybox #同上
[root@docker ~]# docker network connect my_net1 box2 #将box2连接到my_net1这个网络
[root@docker ~]# docker exec box2 ping box3 #进行ping测试,可以发现box2可以ping通box3了。
#而如果没有将box2连接到网络my_net1,是绝对不会ping通的。
PING box3 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.069 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.076 ms
[root@docker ~]# docker network connect my_net2 box4 #将box4连接到my_net2网络
#同box2和box3的ping测试,若没有将box4连接到box5所在的网络,是不可能ping通的。
[root@docker ~]# docker exec box5 ip a #查看box5的IP地址
.......................#省略部分内容
16: eth0@if17: <BROADCAST,MULTICAST,UP,LO500 qdisc noqueue
link/ether 02:42:ac:14:12:06 brd ff:ff:ff:ff:ff:ff
inet 172.20.18.6/24 brd 172.20.18.255 scope global eth0 #确认其IP
valid_lft forever preferred_lft forever
[root@docker ~]# docker exec box4 ping 172.20.18.6 #在box4容器上对box5的IP进行ping测试,可以ping通
PING box5 (172.20.18.6): 56 data bytes
64 bytes from 172.20.18.6: seq=0 ttl=64 time=0.090 ms
64 bytes from 172.20.18.6: seq=1 ttl=64 time=0.130 ms
以上のように構成した後、最終的な結果が達成された、my_net1は、我々が作成することができることに留意すべきである、ネットワーク・ドライブ・スイッチとして理解my_net2、および実行コマンドは、ネットワークをドッカーmy_net1 BOX2を接続し、これは、容器が追加BOX2と同等ですカードの一枚、その後、スイッチmy_net1に接続され、複数のカードに、このコンテナ、およびスイッチは、IPアドレスmy_net1を持っています。上記構成において、BOX2とBOX3通信、及びそれらがmy_net1に接続されているため、また、box4を通信することができるだけでなく、「スイッチ」。
注意:
- 容器との間のコンテナの名前を通信するために使用されてもよいが、このような上記my_net1、my_net2などのカスタムネットワークの使用のみ、。
- カスタムネットワークを作成すると同時に、ネットワークのネットワークセグメントを指定した場合、あなたはネットワークセグメントを指定しない場合も、コンテナのIPアドレスを指定することができ、このネットワークのための容器を使用するには、コンテナのIPアドレスを指定することはできません。
第二に、通信のホスト間で展開領事ドッカーコンテナサービスの実装
領事: - 実施例では、格納されたIPアドレスと、各容器のポート情報の値が、データセンタの意味は、それがキーを使用して、データベース、および他の類似の非リレーショナルデータベースRedisのように理解することができます。
私はあなたの機会を持っている場合、それは、私は詳細領事にこのサービスを、それを書き留めます。このサービスの詳細については、または他の文書を参照したい場合は領事サービスは、あまりないです理解しています。
領事の機能は、非常に強力ですが、クラスタ内で実行することができ、およびヘルスモニタリングなどの機能を持ちます。
ここでは領事サービスの設定を開始。
1、環境の準備は、次のように:
- ドッカーサーバ3は、ドッキングウィンドウはここに私のバージョン18.09.0です。
- 最初ドッカーIPサーバは、領事サービスを実行している192.168.20.7、です。
- 2つのテスト終了後、唯一のドッキングウィンドウ環境ができています。
あなたが展開ドッカーサーバーをインストールする必要がある場合は、ボーエンを参照することができます。インストールの詳細な構成をドッカー。
2、ように構成された第1ドッカーサーバは、以下:
[root@docker ~]# docker pull progrium/consul #下载consul镜像
[root@docker ~]# docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
#运行consul容器,该服务的默认端口是8500,“-p”:表示将容器的8500端口映射到宿主机的8500端口
#“-h”:表示consul的主机名;“--name consul”表示为该容器名;“--restart=always”表示可以随着docker服务的启动而启动;
#“-serve -bootstarp”:表示当在群集中,加上这两个选项可以使其以master的身份出现
[root@docker ~]# netstat -anput | grep 8500 #确定8500端口在监听
tcp6 0 0 :::8500 :::*
OK、今、領事チケットノードが完了し、現在は二ドッカーサーバーに切り替えます。
3、ように構成された第2のサーバドッカーは、以下:
[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service #编辑docker主配置文件
..............#省略部分内容,搜索“Start”定位到下面配置行,修改如下:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.20.7:8500 --cluster-advertise=ens33:2376
#各项解释如下:
#/var/run/docker.sock:Docker的一个编程接口
# “ -H tcp://0.0.0.0:2376 ” :使用本机的tcp2376端口;
# “ --cluster-store=consul://192.168.20.7:8500”:指定运行着consul服务的第一台docker服务器IP及端口;
# “ --cluster-advertise=ens33:2376”:从本机的ens33网卡通过2376端口搜集网络信息,存储在consul上
#修改完成后,保存退出即可。
[root@docker02 ~]# systemctl daemon-reload #重新加载配置文件
[root@docker02 ~]# systemctl restart docker #重启docker服务
図4に示すように、第3ドッカーサーバ上で、第二段階の操作ドッカーサーバーの構成として、主に領事とサービス指定リスニングポート。(自己設定、変更が完了した後、私は覚えて、ここに書いていない、ドッカサービスを再起動します)
5、次のように今、Webページの領事サービスにアクセスするためにブラウザを使用して:
次のように我々は、サーバーのIPおよびその他の関連情報をテストするために使用される2つのドッキングウィンドウを見ることができます:
6、バック二ドッカーサーバー上で、オーバーレイネットワークを作成します。
[root@docker02 ~]# docker network create -d overlay my_olay #创建一个名字为my_olay的voerlay网络
7、第三のサーバ上のドッカーへの切り替えは、あなただけのサーバー上に作成した2番目のドッカーで見つかったオーバーレイネットワークを見ることができます:
[root@docker03 ~]# docker network ls #查看docker03的网络,发现其不但有overlay网络,
#而且其SCOPE(范围)是global(全局的)
NETWORK ID NAME DRIVER SCOPE
8d5b00cf07ab bridge bridge local
17c053a80f5a host host local
c428fc28bb11 my_olay overlay global
323935eaa5c3 none null local
実際には、今二ドッカーサーバーオーバーレイネットワークをもとに、あなただけの第三ドッカーに、コンテナを実行するために作成し、異なるホスト上の2個のコンテナが、コンテナを実行しているオーバレイネットワークサーバーに基づいており、彼らが通信することができ、次のように:
##################第二台Docker服务器上配置如下:###########################
[root@docker02 ~]# docker run -tid --name web01 --network my_olay busybox #基于网络my_olay运行一个容器web01
[root@docker02 ~]# docker exec web01 ip a #查看其IP信息,发现其除了回环地址,还有两个IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0 #这个地址就是my_olay给的
valid_lft forever preferred_lft forever
11: eth1@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever
##################第三台Docker服务器上配置如下:###########################
[root@docker03 ~]# docker run -tid --name web02 --network my_olay busybox #基于网络my_olay运行一个容器web02
[root@docker03 ~]# docker exec web02 ip a #查看web02的IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:0a:00:00:03 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.3/24 brd 10.0.0.255 scope global eth0 #这个地址就是my_olay给的
valid_lft forever preferred_lft forever
11: eth1@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever
#########在第二台Docker服务器上对第三台Docker服务器上的容器进行ping测试##########
[root@docker02 ~]# docker exec web01 ping web02 #确定可以ping通
PING web02 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=1.091 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=1.007 ms
次のとおりです。
--------この記事の最後に、これまで、読んでくれてありがとう--------