激光切割排版套料軟件

Docker的網絡子系統使用驅動程序是可插拔的。默認情況下存在幾個驅動程序,並提供核心網絡功能:

bridge:默認的網絡驅動程序。 如果您未指定驅動程序,則這是您正在創建的網絡類型。當您的應用程序在需要通信的獨立容器中運行時,通常會使用網橋網絡。
host:對於獨立容器,去掉容器和Docker主機之間的網絡隔離,直接使用主機的網絡。host僅可用於Docker 17.06及更高版本上的集羣服務。
overlay:overlay網絡將多個Docker守護程序連接在一起,並使羣集服務能夠相互通信。您還可以使用overlay網絡來促進羣集服務和獨立容器之間或不同Docker守護程序上的兩個獨立容器之間的通信。這種策略消除了在這些容器之間進行操作系統級路由的需要
macvlan:Macvlan網絡允許您將MAC地址分配給容器,使其在網絡上顯示爲物理設備。 Docker守護程序通過其MAC地址將流量路由到容器。 在處理希望直接連接到物理網絡而不是通過Docker主機的網絡堆棧進行路由的傳統應用程序時,使用macvlan驅動程序有時是最佳選擇。
none:對於此容器,禁用所有聯網。 通常與自定義網絡驅動程序一起使用。none不適用於swarm services.
網絡插件:您可以在Docker中安裝和使用第三方網絡插件。 這些插件可從Docker Hub或第三方供應商處獲得。 有關安裝和使用給定網絡插件的信息,請參閱供應商的文檔。

網絡驅動總結

當需要多個容器在同一Docker主機上通信時,用戶定義的橋接網絡是最佳選擇。
當網絡堆棧不應該與Docker主機隔離,而希望隔離容器的其他方面時,主機網絡是最佳選擇。
當您需要在不同Docker主機上運行的容器進行通信時,或者當多個應用程序使用羣服務一起工作時,覆蓋網絡是最好的。
從VM設置遷移或需要容器看起來像網絡上的物理主機時,Macvlan網絡是最好的,每個主機都有唯一的MAC地址。
第三方網絡插件使您可以將Docker與專用網絡堆棧集成。

獨立Docker容器的連網
這一部分包含三個不同的指南,你可以在不同系統上運行他們,但是對於最後兩個,你需要額外的Docker主機運行。

使用默認的橋接網絡:這一章節演示如何使用Docker自動爲您設置的默認橋接網絡。 該網絡不是生產系統的最佳選擇。
使用用戶定義的橋網絡:顯示瞭如何創建和使用自己的自定義橋網絡,以連接在同一Docker主機上運行的容器。 建議將其用於生產中運行的獨立容器。

儘管overlay網絡通常用於集羣服務,但Docker 17.06及更高版本允許您將overlay網絡用於獨立容器。 這是使用overlay網絡的教程的一部分。
使用默認的橋接網絡
在此示例中,您在同一Docker主機上啓動了兩個不同的alpine容器,並進行了一些測試以瞭解它們如何相互通信。 您需要安裝並運行Docker。
1.打開一個終端窗口。 在執行其他任何操作之前,請先列出當前網絡。 如果您從未在此Docker守護程序上添加網絡或初始化羣組,則應該看到以下內容。 您可能會看到不同的網絡,但至少應該看到以下內容(網絡ID會有所不同):
$ docker network ls

NETWORK ID NAME DRIVER SCOPE
17e324f45964 bridge bridge local
6ed54d316334 host host local
7092879f2cc8 none null local
複製代碼列出了默認的橋接網絡,以及host和none。 後兩個不是完全成熟的網絡,但用於啓動直接連接到Docker守護程序主機的網絡堆棧的容器,或用於啓動不包含網絡設備的容器。
本教程將把兩個容器連接到橋接網絡。
2.開啓兩個alpine容器運行ash,它是Alpine默認的shell,而不是bash.
-dit標誌的意思是啓動分離的容器(在後臺),交互的(具有鍵入的能力)和TTY(以便您可以看到輸入和輸出)。由於您是分開啓動的,因此您不會立即連接到該容器。而是將打印容器的ID。 因爲你未指定任何–network選項,所以容器將連接到默認的網橋網絡。
$ docker run -dit --name alpine1 alpine ash

$ docker run -dit --name alpine2 alpine ash
複製代碼檢查兩個容器是否確實已啓動:
$ docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
602dbf1edc81 alpine “ash” 4 seconds ago Up 3 seconds alpine2
da33b7aa74b0 alpine “ash” 17 seconds ago Up 16 seconds alpine1
複製代碼3.檢查網橋網絡以查看連接了哪些容器。
$ docker network inspect bridge

[
{
“Name”: “bridge”,
“Id”: “17e324f459648a9baaea32b248d3884da102dde19396c25b30ec800068ce6b10”,
“Created”: “2017-06-22T20:27:43.826654485Z”,
“Scope”: “local”,
“Driver”: “bridge”,
“EnableIPv6”: false,
“IPAM”: {
“Driver”: “default”,
“Options”: null,
“Config”: [
{
“Subnet”: “172.17.0.0/16”,
“Gateway”: “172.17.0.1”
}
]
},
“Internal”: false,
“Attachable”: false,
“Containers”: {
“602dbf1edc81813304b6cf0a647e65333dc6fe6ee6ed572dc0f686a3307c6a2c”: {
“Name”: “alpine2”,
“EndpointID”: “03b6aafb7ca4d7e531e292901b43719c0e34cc7eef565b38a6bf84acf50f38cd”,
“MacAddress”: “02:42:ac:11:00:03”,
“IPv4Address”: “172.17.0.3/16”,
“IPv6Address”: “”
},
“da33b7aa74b0bf3bda3ebd502d404320ca112a268aafe05b4851d1e3312ed168”: {
“Name”: “alpine1”,
“EndpointID”: “46c044a645d6afc42ddd7857d19e9dcfb89ad790afb5c239a35ac0af5e8a5bc5”,
“MacAddress”: “02:42:ac:11:00:02”,
“IPv4Address”: “172.17.0.2/16”,
“IPv6Address”: “”
}
},
“Options”: {
“com.docker.network.bridge.default_bridge”: “true”,
“com.docker.network.bridge.enable_icc”: “true”,
“com.docker.network.bridge.enable_ip_masquerade”: “true”,
“com.docker.network.bridge.host_binding_ipv4”: “0.0.0.0”,
“com.docker.network.bridge.name”: “docker0”,
“com.docker.network.driver.mtu”: “1500”
},
“Labels”: {}
}
]
複製代碼在頂部附近,列出了有關橋接網絡的信息,包括Docker主機和橋接網絡之間的網關的IP地址(172.17.0.1)。 在Containers項下,列出了每個連接的容器及其IP地址信息(lpine1爲172.17.0.2,alpine2爲172.17.0.3)
4.容器在後臺運行。 使用docker attach命令連接到alpine1。
$ docker attach alpine1

/ #
複製代碼提示符將更改爲#以指示您是容器中的root用戶。 使用ip addr show命令從容器中查看alpine1的網絡接口:

ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
複製代碼第一個接口是環回設備。現在先忽略它。注意,第二個接口的IP地址是172.17.0.2,這與前面步驟中顯示的alpine1的地址相同。
5.在alpine1內部,通過ping baidu.com確保您可以連接到互聯網。 -c 2標誌將命令限制爲兩ping嘗試。
➜ ~ ping -c 2 baidu.com
PING baidu.com (39.156.69.79): 56 data bytes
64 bytes from 39.156.69.79: icmp_seq=0 ttl=46 time=34.887 ms
64 bytes from 39.156.69.79: icmp_seq=1 ttl=46 time=41.880 ms

— baidu.com ping statistics —
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 34.887/38.383/41.880/3.497 ms
➜ ~
複製代碼6.現在嘗試ping第二個容器。 首先,通過其IP地址172.17.0.3對其執行ping操作:

ping -c 2 172.17.0.3

PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.086 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.094 ms

— 172.17.0.3 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.086/0.090/0.094 ms
複製代碼這樣成功了。 接下來,嘗試按容器名稱ping alpine2容器。 這將失敗。

ping -c 2 alpine2

ping: bad address ‘alpine2’
複製代碼7.通過使用分離序列CTRL + p CTRL + q(按住CTRL並鍵入p後跟q)從alpine1分離而不停止它。 如果願意,請附加到alpine2並在那裏重複步驟4、5和6,將alpine1代替爲alpine2。
8.停止並刪除兩個容器。
$ docker container stop alpine1 alpine2
$ docker container rm alpine1 alpine2
複製代碼請記住,不建議將默認網橋網絡用於生產。
使用用戶定義的橋接網絡
In this example, we again start two alpine containers, but attach them to a user-defined network called alpine-net which we have already created. These containers are not connected to the default bridge network at all. We then start a third alpine container which is connected to the bridge network but not connected to alpine-net, and a fourth alpine container which is connected to both networks.
在此示例中,我們再次啓動兩個Alpine容器,但是將它們附加到我們已經創建的名爲alpine-net的用戶定義網絡上。 這些容器根本沒有連接到默認橋接網絡。 然後,我們啓動連接到默認網橋網絡但未連接alpine-net的第三個alpine容器,以及連接到兩個網絡的第四個alpine容器。
1.創建 alpine-net網絡. 你不需要指定–driver bridge標籤因爲它是默認的,但本實例展示瞭如何指定它:
$ docker network create --driver bridge alpine-net
複製代碼2.列出Docker網絡
$ docker network ls

NETWORK ID NAME DRIVER SCOPE
e9261a8c9a19 alpine-net bridge local
17e324f45964 bridge bridge local
6ed54d316334 host host local
7092879f2cc8 none null local
複製代碼檢查alpine-net網絡。這顯示了它的IP地址,以及沒有容器連接到它的事實.

$ docker network inspect alpine-net

[
{
“Name”: “alpine-net”,
“Id”: “e9261a8c9a19eabf2bf1488bf5f208b99b1608f330cff585c273d39481c9b0ec”,
“Created”: “2017-09-25T21:38:12.620046142Z”,
“Scope”: “local”,
“Driver”: “bridge”,
“EnableIPv6”: false,
“IPAM”: {
“Driver”: “default”,
“Options”: {},
“Config”: [
{
“Subnet”: “172.18.0.0/16”,
“Gateway”: “172.18.0.1”
}
]
},
“Internal”: false,
“Attachable”: false,
“Containers”: {},
“Options”: {},
“Labels”: {}
}
]
複製代碼請注意,該網絡的網關是172.18.0.1,而默認網橋網絡的網關是172.17.0.1。 您系統上的確切IP地址可能不同。
3.創建你的第四個容器,注意–network選項。在docker run命令中你只能連接到一個網絡。所以,你需要使用docker network connect命令將第四個容器連接到默認橋接網絡上。
$ docker run -dit --name alpine1 --network alpine-net alpine ash

$ docker run -dit --name alpine2 --network alpine-net alpine ash

$ docker run -dit --name alpine3 alpine ash

$ docker run -dit --name alpine4 --network alpine-net alpine ash

$ docker network connect bridge alpine4
複製代碼驗證所有容器都在運行:
$ docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
156849ccd902 alpine “ash” 41 seconds ago Up 41 seconds alpine4
fa1340b8d83e alpine “ash” 51 seconds ago Up 51 seconds alpine3
a535d969081e alpine “ash” About a minute ago Up About a minute alpine2
0a02c449a6e9 alpine “ash” About a minute ago Up About a minute alpine1
複製代碼4.再次檢查默認網橋網絡和alpine-net網:
$ docker network inspect bridge

[
{
“Name”: “bridge”,
“Id”: “17e324f459648a9baaea32b248d3884da102dde19396c25b30ec800068ce6b10”,
“Created”: “2017-06-22T20:27:43.826654485Z”,
“Scope”: “local”,
“Driver”: “bridge”,
“EnableIPv6”: false,
“IPAM”: {
“Driver”: “default”,
“Options”: null,
“Config”: [
{
“Subnet”: “172.17.0.0/16”,
“Gateway”: “172.17.0.1”
}
]
},
“Internal”: false,
“Attachable”: false,
“Containers”: {
“156849ccd902b812b7d17f05d2d81532ccebe5bf788c9a79de63e12bb92fc621”: {
“Name”: “alpine4”,
“EndpointID”: “7277c5183f0da5148b33d05f329371fce7befc5282d2619cfb23690b2adf467d”,
“MacAddress”: “02:42:ac:11:00:03”,
“IPv4Address”: “172.17.0.3/16”,
“IPv6Address”: “”
},
“fa1340b8d83eef5497166951184ad3691eb48678a3664608ec448a687b047c53”: {
“Name”: “alpine3”,
“EndpointID”: “5ae767367dcbebc712c02d49556285e888819d4da6b69d88cd1b0d52a83af95f”,
“MacAddress”: “02:42:ac:11:00:02”,
“IPv4Address”: “172.17.0.2/16”,
“IPv6Address”: “”
}
},
“Options”: {
“com.docker.network.bridge.default_bridge”: “true”,
“com.docker.network.bridge.enable_icc”: “true”,
“com.docker.network.bridge.enable_ip_masquerade”: “true”,
“com.docker.network.bridge.host_binding_ipv4”: “0.0.0.0”,
“com.docker.network.bridge.name”: “docker0”,
“com.docker.network.driver.mtu”: “1500”
},
“Labels”: {}
}
]
複製代碼alpine3 和 alpine4 容器連接到了默認的橋接網絡
$ docker network inspect alpine-net

[
{
“Name”: “alpine-net”,
“Id”: “e9261a8c9a19eabf2bf1488bf5f208b99b1608f330cff585c273d39481c9b0ec”,
“Created”: “2017-09-25T21:38:12.620046142Z”,
“Scope”: “local”,
“Driver”: “bridge”,
“EnableIPv6”: false,
“IPAM”: {
“Driver”: “default”,
“Options”: {},
“Config”: [
{
“Subnet”: “172.18.0.0/16”,
“Gateway”: “172.18.0.1”
}
]
},
“Internal”: false,
“Attachable”: false,
“Containers”: {
“0a02c449a6e9a15113c51ab2681d72749548fb9f78fae4493e3b2e4e74199c4a”: {
“Name”: “alpine1”,
“EndpointID”: “c83621678eff9628f4e2d52baf82c49f974c36c05cba152db4c131e8e7a64673”,
“MacAddress”: “02:42:ac:12:00:02”,
“IPv4Address”: “172.18.0.2/16”,
“IPv6Address”: “”
},
“156849ccd902b812b7d17f05d2d81532ccebe5bf788c9a79de63e12bb92fc621”: {
“Name”: “alpine4”,
“EndpointID”: “058bc6a5e9272b532ef9a6ea6d7f3db4c37527ae2625d1cd1421580fd0731954”,
“MacAddress”: “02:42:ac:12:00:04”,
“IPv4Address”: “172.18.0.4/16”,
“IPv6Address”: “”
},
“a535d969081e003a149be8917631215616d9401edcb4d35d53f00e75ea1db653”: {
“Name”: “alpine2”,
“EndpointID”: “198f3141ccf2e7dba67bce358d7b71a07c5488e3867d8b7ad55a4c695ebb8740”,
“MacAddress”: “02:42:ac:12:00:03”,
“IPv4Address”: “172.18.0.3/16”,
“IPv6Address”: “”
}
},
“Options”: {},
“Labels”: {}
}
]
複製代碼alpine1, alpine2, 和 alpine4容器連接到了alpine-net 網絡.
5。在像alpine-net這樣的用戶定義網絡上,容器不僅可以按IP地址進行通信,而且還可以將容器名稱解析爲IP地址。 此功能稱爲自動服務發現。 讓我們連接到alpine1並進行測試。 alpine1應該能夠將alpine2和alpine4(以及alpine1本身)解析爲IP地址。
$ docker container attach alpine1

ping -c 2 alpine2

PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.085 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.090 ms

— alpine2 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.085/0.087/0.090 ms

ping -c 2 alpine4

PING alpine4 (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.076 ms
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.091 ms

— alpine4 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.076/0.083/0.091 ms

ping -c 2 alpine1

PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.026 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.054 ms

— alpine1 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.026/0.040/0.054 ms

複製代碼6.從 alpine1, 你無法連接到alpine3, 因爲它不在alpine-net網內.

ping -c 2 alpine3

ping: bad address ‘alpine3’
複製代碼不僅如此,你也不能通過它的IP地址從alpine1連接到alpine3。查看docker network inspect的輸出,找到alpine3的IP地址:172.17.0.2,試着ping它。

ping -c 2 172.17.0.2

PING 172.17.0.2 (172.17.0.2): 56 data bytes

— 172.17.0.2 ping statistics —
2 packets transmitted, 0 packets received, 100% packet loss
複製代碼使用分離序列CTRL + p CTRL + q(按住CTRL並鍵入p後跟q)從alpine1分離。
7.請記住,alpine4已連接到默認網橋網絡和alpine-net。 它應該能夠到達所有其他容器。 但是,您將需要按其IP地址尋址alpine3。 附加到它並運行測試。
$ docker container attach alpine4

ping -c 2 alpine1

PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.074 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.082 ms

— alpine1 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.074/0.078/0.082 ms

ping -c 2 alpine2

PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.075 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.080 ms

— alpine2 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.075/0.077/0.080 ms

ping -c 2 alpine3

ping: bad address ‘alpine3’

ping -c 2 172.17.0.2

PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.089 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.075 ms

— 172.17.0.2 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.075/0.082/0.089 ms

ping -c 2 alpine4

PING alpine4 (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.033 ms
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.064 ms

— alpine4 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.033/0.048/0.064 ms

複製代碼8.作爲最後一個測試,通過ping www.baidu.com確保所有的容器都可以連接到網絡.因爲當前你已經連接到了alpine4,就從它開始,然後退出alpine4並連接到alpine3 (該容器僅僅連接到默認的橋接網絡) 進行重試。最後連接到alpine1 (它僅僅連接到alpine-net網絡)並進行重試.

ping -c 2 baidu.com

PING baidu.com (172.217.3.174): 56 data bytes
64 bytes from 172.217.3.174: seq=0 ttl=41 time=9.778 ms
64 bytes from 172.217.3.174: seq=1 ttl=41 time=9.634 ms

— baidu.com ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 9.634/9.706/9.778 ms

CTRL+p CTRL+q

$ docker container attach alpine3

ping -c 2 baidu.com

PING baidu.com (172.217.3.174): 56 data bytes
64 bytes from 172.217.3.174: seq=0 ttl=41 time=9.706 ms
64 bytes from 172.217.3.174: seq=1 ttl=41 time=9.851 ms

— baidu.com ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 9.706/9.778/9.851 ms

CTRL+p CTRL+q

$ docker container attach alpine1

ping -c 2 baidu.com

PING baidu.com (172.217.3.174): 56 data bytes
64 bytes from 172.217.3.174: seq=0 ttl=41 time=9.606 ms
64 bytes from 172.217.3.174: seq=1 ttl=41 time=9.603 ms

— baidu.com ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 9.603/9.604/9.606 ms

CTRL+p CTRL+q

複製代碼9.最後停止並刪除所有容器並刪除alpine-net網絡
$ docker container stop alpine1 alpine2 alpine3 alpine4

$ docker container rm alpine1 alpine2 alpine3 alpine4

$ docker network rm alpine-net
複製代碼overlay network聯網
本系列教程討論集羣服務的網絡。本主題包含四個部分內容,你可以在不同的平臺上運行他們,但是對於最後兩個,你需要一個額外的Docker主機。

使用默認overlay network演示瞭如何在初始化或加入羣集時使用Docker自動爲您設置的默認的overlay network。 該網絡不是生產系統的最佳選擇。
使用用戶定義的overlay network顯示瞭如何創建和使用自己的自定義overlay network來連接服務。 建議將其用於生產中運行的服務。
將overlay network用於獨立容器顯示瞭如何使用overlay network在不同Docker守護程序上的獨立容器之間進行通信。
容器與羣集服務之間的通信使用可連接的overlay network在獨立容器與羣集服務之間建立通信。 Docker 17.06及更高版本支持此功能。

準備工作
這些要求您至少有一個單節點羣集,這意味着您已啓動Docker並在主機上運行docker swarm init。 您也可以在多節點集羣上運行示例。
最後一個示例需要Docker 17.06或更高版本。
使用默認的overlay network
在本例中,您啓動一個alpine服務,並從各個服務容器的角度分析網絡的特徵。
本教程不討論有關如何實現overlay network的特定於操作系統的詳細信息,而是重點關注從服務的角度來看,overlay network是如何工作的。
準備
本教程需要三臺物理或虛擬Docker主機,它們可以相互通信,並且都運行Docker 17.03或更高版本的新安裝。 本教程假定這三臺主機在同一網絡上運行,並且不涉及防火牆。
這些主機將被稱爲manager, worker-1,worker-2.manager主機即作爲管理者又作爲工作者,這意味着它既要運行服務任務,也要管理swarm. worker-1 和 worker-2 將僅作爲工作者。
如果您沒有三臺主機,一個簡單的解決方案是在雲提供商(例如Amazon EC2)上設置三臺Ubuntu主機,它們全部位於同一網絡上,並允許與該網絡上的所有主機進行所有通信(使用諸如 EC2安全組),然後按照Ubuntu上Docker Engine-Community的安裝說明進行操作。
演示
創建swarm
在此過程結束時,所有三個Docker主機都將加入集羣,並使用稱爲ingress的覆蓋網絡連接在一起.
1.在manager上,初始化swarm集羣。如果主機只有一個網絡接口,–advertise-addr 選項是可選的。
$ docker swarm init --advertise-addr=
複製代碼記下所打印的文本,因爲其中包含將用於將worker-1和worker-2加入到羣中的令牌。 將令牌存儲在密碼管理器中是一個好主意。
2.在worker-1上,加入到swarm。如果主機只有一個網絡接口,–advertise-addr 選項是可選的.
$ docker swarm join --token
–advertise-addr
:2377
複製代碼3.在worker-2上,加入到swarm。如果主機只有一個網絡接口,–advertise-addr 選項是可選的.
$ docker swarm join --token
–advertise-addr
:2377
複製代碼4.在manager上, 列出所有的節點。這個命令只能在manager上執行。
$ docker node ls

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
d68ace5iraw6whp7llvgjpu48 * ip-172-31-34-146 Ready Active Leader
nvp5rwavvb8lhdggo8fcf7plg ip-172-31-35-151 Ready Active
ouvx2l7qfcxisoyms8mtkgahw ip-172-31-36-89 Ready Active
複製代碼您也可以使用–filter標誌按角色進行過濾:
$ docker node ls --filter role=manager

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
d68ace5iraw6whp7llvgjpu48 * ip-172-31-34-146 Ready Active Leader

$ docker node ls --filter role=worker

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
nvp5rwavvb8lhdggo8fcf7plg ip-172-31-35-151 Ready Active
ouvx2l7qfcxisoyms8mtkgahw ip-172-31-36-89 Ready Active
複製代碼5.列出manager,worker-1,worker-2上所有的網絡,請注意它們現在都有一個叫做ingress的覆蓋網絡和一個叫docker_gwbridge的橋接網絡。這裏只展示manager的:
$ docker network ls

NETWORK ID NAME DRIVER SCOPE
495c570066be bridge bridge local
961c6cae9945 docker_gwbridge bridge local
ff35ceda3643 host host local
trtnl4tqnc3n ingress overlay swarm
c8357deec9cb none null local
複製代碼docker_gwbridge將ingress網絡連接到Docker主機的網絡接口,以便流量可以往返於羣管理者和工作者。如果創建羣集服務但未指定網絡,則它們將連接到ingress網絡.建議對將一起使用的每個應用程序或一組應用程序使用單獨的覆蓋網絡。在下一個過程中,您將創建兩個覆蓋網絡並將服務連接到每個覆蓋網絡。
創建服務
1.在manager上,創建一個新的overlay network叫nginx-net:
$ docker network create -d overlay nginx-net
複製代碼您無需在其他節點上創建overlay網絡,因爲當其中一個節點開始運行需要該overlay網絡的服務任務時,overlay網絡會自動創建。
2.在manager上, 創建一個有5個副本的Nginx服務並連接到nginx-net.服務將對外開放80端口。所有服務任務容器都可以在不打開任何端口的情況下彼此通信。
服務只能在管理器上創建
$ docker service create
–name my-nginx
–publish target=80,published=80
–replicas=5
–network nginx-net
nginx
複製代碼ingress的默認發佈模式, 在你沒有爲–publish選項指定一個mode時使用。這意味着你如果訪問manager,worker-1或者worker-2上的80端口,你將連接到5個服務任務中的任何一個的80端口上。即便當前並沒有任務運行在你訪問的節點上。如果你想使用host模式發佈端口,你可以在–publish選項上增加mode=host。但是,這種情況下,你要用–mode global代替 --replicas=5, 因爲只有一個服務任務可以綁定到給定節點上的給定端口。
3.運行docker service ls監視服務啓動進度,這可能需要幾秒鐘。
4.在manage,worker-1,worker-2上檢查nginx-net網絡. 記住你不需要在worker-1和worker-2上手動創建它,因爲Docker會給你創建好。輸出會很長,但是隻需注意Containers和Peers部分。Containers列出了所有的從該主機連接到overlay網絡的服務任務(或者單獨的容器)。
5.對於manager,使用docker service inspect my-nginx檢查服務,並注意有關服務使用的端口和端點的信息。
6.創建一個新的網絡nginx-net-2, 然後使用這個新的網絡更新服務:
$ docker network create -d overlay nginx-net-2
複製代碼$ docker service update
–network-add nginx-net-2
–network-rm nginx-net
my-nginx
複製代碼7.運行docker service ls檢查服務已經更新了,並且所有的任務已經重新部署。運行 docker network inspect nginx-net驗證沒有容器連接到它。對nginx-net-2運行相同的命令,注意所有的服務任務容器都連接到它。
overlay網絡在swarn工作節點上是按需自動創建的,他們不會自動刪除
8.清理服務和網絡。 在管理器中,運行以下命令。 管理者將指示工作人員自動刪除網絡。
$ docker service rm my-nginx
$ docker network rm nginx-net nginx-net-2
複製代碼使用用戶自定義的overlay網絡
準備
本教程假設羣集已經設置好,並且您是在一個管理器上。
演示
1.創建用戶定義的覆蓋網絡。
$ docker network create -d overlay my-overlay
複製代碼2.使用overlay網絡啓動一個服務並將端口80發佈到Docker主機上的8080上
$ docker service create
–name my-nginx
–network my-overlay
–replicas 1
–publish published=8080,target=80
nginx:latest
複製代碼3.運行docker network inspect my-overlay驗證my-nginx服務任務已經連接到它了。通過查看Containers部分。
4.刪除服務和網絡
$ docker service rm my-nginx

$ docker network rm my-overlay
複製代碼在獨立容器上使用overlay網絡
此示例演示了DNS容器發現-具體地說,是如何使用覆蓋網絡在不同Docker守護程序上的獨立容器之間進行通信。 步驟如下:

在host1上, 初始化節點爲一個swarm(manager).
在host2上, 加入該節點到swarm中(作爲工作節點)
在host1上,創建一個可連接的覆蓋網絡(test-net)。
在host1上,在test-net上運行一個交互式alpine容器 (alpine1)。
在host2上,在test-net上運行一個交互式,可分離的alpine容器 (alpine2)。
在host1上, 從一個alpine1會話中,ping alpine2

準備
對於此測試,您需要兩個可以相互通信的不同Docker主機。 每個主機必須具有Docker 17.06或更高版本,並且在兩個Docker主機之間打開以下端口:

TCP port 2377
TCP and UDP port 7946
UDP port 4789

一種簡單的設置方法是擁有兩個VM(本地或在AWS等雲提供商上),每個VM均已安裝並正在運行Docker。 如果您使用的是AWS或類似的雲計算平臺,最簡單的配置是使用一個安全組,該安全組打開兩個主機之間的所有傳入端口以及來自客戶端IP地址的SSH端口。
此示例將我們羣中的兩個節點稱爲host1和host2。 此示例還使用Linux主機,但是相同的命令在Windows上也可以使用。
演示
1.設置swarm
在host1上,初始化集羣(如果出現提示,請使用–advertise-addr指定與集羣中其他主機通信的接口的IP地址,例如AWS上的私有IP地址):
$ docker swarm init
Swarm initialized: current node (vz1mm9am11qcmo979tlrlox42) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-5g90q48weqrtqryq4kj6ow0e8xm9wmv9o6vgqc5j320ymybd5c-8ex8j0bc40s6hgvy5ui5gl4gy 172.31.47.252:2377

To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.
複製代碼在host2上,按照上述說明加入羣集:
$ docker swarm join --token <your_token> <your_ip_address>:2377
This node joined a swarm as a worker.
複製代碼如果節點無法加入羣集,則docker swarm join命令會超時。 要解決此問題,請在host2上運行docker swarm leave --force,驗證您的網絡和防火牆設置,然後重試。
2.在host1上, 創建一個可以連接的overlay網絡叫test-net:
$ docker network create --driver=overlay --attachable test-net
uqsof8phj3ak0rq9k86zta6ht
複製代碼注意返回的NETWORK ID-從host2連接到它時,您將再次看到它。
3.在host1上,啓動一個交互式的容器alpine1連接到test-net:
$ docker run -it --name alpine1 --network test-net alpine
/ #
複製代碼4.在host2上, 羅列出可用的網絡–注意test-net還不存在:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
ec299350b504 bridge bridge local
66e77d0d0e9a docker_gwbridge bridge local
9f6ae26ccb82 host host local
omvdxqrda80z ingress overlay swarm
b65c952a4b2b none null local
複製代碼5.On host2, 以-d和 (-it) 的方式啓動一個容器 (alpine2) 並連接到test-net:
$ docker run -dit --name alpine2 --network test-net alpine
fb635f5ece59563e7b8b99556f816d24e6949a5f6a5b1fbd92ca244db17a4342
複製代碼自動DNS容器發現僅適用於唯一的容器名稱。
6.在host2上, 驗證 test-net網絡已經創建(和host1上的test-net 有一樣的NETWORK ID):
$ docker network ls
NETWORK ID NAME DRIVER SCOPE

uqsof8phj3ak test-net overlay swarm
複製代碼7.在host1上, 在alpine1的交互終端內ping alpine2:
/ # ping -c 2 alpine2
PING alpine2 (10.0.0.5): 56 data bytes
64 bytes from 10.0.0.5: seq=0 ttl=64 time=0.600 ms
64 bytes from 10.0.0.5: seq=1 ttl=64 time=0.555 ms

— alpine2 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.555/0.577/0.600 ms
複製代碼兩個容器與連接兩個主機的覆蓋網絡通信。如果你在host2主機上運行另一個alpine容器,而不detached.你可以從host2ping alpine1 (這裏我們增加了容器自動清理的選項):
$ docker run -it --rm --name alpine3 --network test-net alpine
/ # ping -c 2 alpine1
/ # exit
複製代碼8.在host1上, 關閉alpine1的會話 (這將停止容器):
/ # exit
複製代碼9.清理你的容器和網絡
您必須在每個主機上獨立停止和刪除容器,因爲Docker守護程序是獨立運行的,並且它們是獨立的容器。 您只需要刪除host1上的網絡,因爲當您停止host2上的alpine2時,test-net就會消失。
在host2上,停止alpine2,檢查test-net已經刪除,然後刪除alpine2:
$ docker container stop alpine2
$ docker network ls
$ docker container rm alpine2
複製代碼在 host1上, 刪除 alpine1 and test-net:
$ docker container rm alpine1
$ docker network rm test-net
複製代碼在容器和集羣服務之間進行通信
準備
本例需要Docker 17.06或更高版本。
演示
在此示例中,您在同一Docker主機上啓動了兩個不同的alpine1容器,並進行了一些測試以瞭解它們如何相互通信。 您需要安裝並運行Docker。
1.打開一個終端窗口。 在執行其他任何操作之前,請先列出當前網絡。 如果您從未在此Docker守護程序上添加網絡或初始化羣組,則應該看到以下內容。 您可能會看到不同的網絡,但至少應該看到以下內容(網絡ID會有所不同):
$ docker network ls

NETWORK ID NAME DRIVER SCOPE
17e324f45964 bridge bridge local
6ed54d316334 host host local
7092879f2cc8 none null local
複製代碼列出了默認的橋接網絡,以及host和none。 後兩個不是完全成熟的網絡,但用於啓動直接連接到Docker守護程序主機的網絡堆棧的容器,或用於啓動不包含網絡設備的容器。 本教程將把兩個容器連接到橋接網絡。
2.啓動兩個運行ash的Alpine容器,這是Alpine的默認shell,而不是bash。 -dit標誌的意思是啓動分離的容器(在後臺),交互的(具有鍵入的能力)和TTY(以便您可以看到輸入和輸出)。 由於您是分開啓動的,因此您不會立即連接到該容器。 而是將打印容器的ID。 因爲您未指定任何–network標誌,所以容器將連接到默認的網橋網絡。
$ docker run -dit --name alpine1 alpine ash

$ docker run -dit --name alpine2 alpine ash
複製代碼檢查兩個容器是否確實已啓動:
$ docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
602dbf1edc81 alpine “ash” 4 seconds ago Up 3 seconds alpine2
da33b7aa74b0 alpine “ash” 17 seconds ago Up 16 seconds alpine1
複製代碼3.檢查網橋網絡以查看連接了哪些容器。
$ docker network inspect bridge

[
{
“Name”: “bridge”,
“Id”: “17e324f459648a9baaea32b248d3884da102dde19396c25b30ec800068ce6b10”,
“Created”: “2017-06-22T20:27:43.826654485Z”,
“Scope”: “local”,
“Driver”: “bridge”,
“EnableIPv6”: false,
“IPAM”: {
“Driver”: “default”,
“Options”: null,
“Config”: [
{
“Subnet”: “172.17.0.0/16”,
“Gateway”: “172.17.0.1”
}
]
},
“Internal”: false,
“Attachable”: false,
“Containers”: {
“602dbf1edc81813304b6cf0a647e65333dc6fe6ee6ed572dc0f686a3307c6a2c”: {
“Name”: “alpine2”,
“EndpointID”: “03b6aafb7ca4d7e531e292901b43719c0e34cc7eef565b38a6bf84acf50f38cd”,
“MacAddress”: “02:42:ac:11:00:03”,
“IPv4Address”: “172.17.0.3/16”,
“IPv6Address”: “”
},
“da33b7aa74b0bf3bda3ebd502d404320ca112a268aafe05b4851d1e3312ed168”: {
“Name”: “alpine1”,
“EndpointID”: “46c044a645d6afc42ddd7857d19e9dcfb89ad790afb5c239a35ac0af5e8a5bc5”,
“MacAddress”: “02:42:ac:11:00:02”,
“IPv4Address”: “172.17.0.2/16”,
“IPv6Address”: “”
}
},
“Options”: {
“com.docker.network.bridge.default_bridge”: “true”,
“com.docker.network.bridge.enable_icc”: “true”,
“com.docker.network.bridge.enable_ip_masquerade”: “true”,
“com.docker.network.bridge.host_binding_ipv4”: “0.0.0.0”,
“com.docker.network.bridge.name”: “docker0”,
“com.docker.network.driver.mtu”: “1500”
},
“Labels”: {}
}
]
複製代碼在頂部附近,列出了有關橋接網絡的信息,包括Docker主機和橋接網絡之間的網關的IP地址(172.17.0.1)。 在Containers項下,列出了每個連接的容器及其IP地址信息(alpine1爲172.17.0.2,alpine2爲172.17.0.3)。
4.容器在後臺運行。 使用docker attach命令連接到alpine1。
$ docker attach alpine1

/ #
複製代碼提示符將更改爲#以指示您是容器中的root用戶。 使用ip addr show命令從容器中查看alpine1的網絡接口:

ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
複製代碼第一個接口是環回設備。現在先忽略它。注意,第二個接口的IP地址是172.17.0.2,這與前面步驟中顯示的alpine1的地址相同。
5.在alpine1內部,通過ping baidu.com確保您可以連接到互聯網。-c 2標誌將命令限制兩次兩次ping操作。

ping -c 2 baidu.com

PING baidu.com (172.217.3.174): 56 data bytes
64 bytes from 172.217.3.174: seq=0 ttl=41 time=9.841 ms
64 bytes from 172.217.3.174: seq=1 ttl=41 time=9.897 ms

— baidu.com ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 9.841/9.869/9.897 ms
複製代碼7.現在嘗試ping第二個容器。 首先,通過其IP地址172.17.0.3對其執行ping操作:

ping -c 2 172.17.0.3

PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.086 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.094 ms

— 172.17.0.3 ping statistics —
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.086/0.090/0.094 ms
複製代碼這樣成功了。 接下來,嘗試按容器名稱ping alpine2容器。 這將失敗。

ping -c 2 alpine2

ping: bad address ‘alpine2’
複製代碼7.通過使用分離序列CTRL + p CTRL + q(按住CTRL並鍵入p後跟q)從alpine1分離而不停止它。 如果願意,請附加到alpine2並在那裏重複步驟4、5和6,將alpine1代替爲alpine2。

發佈了15 篇原創文章 · 獲贊 0 · 訪問量 537
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章