1,docker網路
1.1,docker0
有三個網路環境,那麼docker是如何處理容器網路訪問的?
1.2,測試
docker run -d -p 80:8080 --name tomcat01 tomcat
docker exec -it tomcat01 ip addr
本地可以ping通容器內部
1.3,原理
只要安裝了docker,就會有一個docker的ip-docker0(這裡是172.17.0.1),這裡的ip分配用的是橋接模式、veth-pair技術
- veth-pair:一對虛擬裝置介面,成對出現,一端連著協議,一端彼此相連;veth-pair充當一個橋樑,連線各種虛擬網路裝置。
- openstac,docker容器之間的連線,OVS的連線,都是使用veth-pair技術。
每啟動一個docker容器,docker都會給容器分配一個ip(為tomcat分配172.17.0.2)
藉助於宿主機,容器之間也可相互通訊
容器和宿主機通訊
容器之間通訊
1.4,結論
容器和宿主機是可以通訊的
容器和容器之間也是可以通訊的,但使用docker0必須寫明ip
所用容器預設啟動不指定網路的情況下,都是docker0進行路由的,docker會給容器分配一個預設的可用ip
docker使用的是linux的橋接,docker0是所有容器的網橋
docker中的所有網路介面都是虛擬的,虛擬的轉發效率高
容器刪除,對應的網橋對就沒了
2,link連線
2.1,測試及原理
是否可以使用容器名實現容器之間的通訊?
docker exec -it tomcat01 ping tomcat02
發現不行
ping: tomcat02: Name or service not known
使用--link實現容器之間的連線
docker run -d -P --name tomcat03 --link tomcat02 tomcat
再使用容器名進行通訊
[root@VM-0-11-centos ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.114 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.029 ms
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
顯示網路配置,發現03中將02直接寫入了網路配置
[root@VM-0-11-centos ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 3ba10f8d5d4e
172.17.0.4 40fb066c620a
[root@VM-0-11-centos ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 3ba10f8d5d4e
--link就相當於在容器的網路配置中增加了目標容器的對映
2.2,步驟總結
使用--link連線
docker run -d -P --name tomcat03 --link tomcat02 tomcat
容器之間通訊
[root@VM-0-11-centos ~]# docker exec -it tomcat03 ping tomcat02
3,自定義網路
3.1,網路模式
- bridge:橋接(docker預設,自己建立網路也使用該模式)
- none:不配置網路
- host:和宿主機共享網路
- container:容器網路連通(侷限性大)
3.2,自定義網路測試
首先要明白,以下兩種啟動方式是相同的(啟動時--net不寫網路預設使用bridge模式):
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
docker0的特點:預設、通過容器名不能相互訪問,--link可以打通連線,但是--link使用比較麻煩,因此我們可以自定義網路。
[root@VM-0-11-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
8a3cfa860aaed386afc07a3b02f77edaec61a24a6095c7b6c165f1fa54bd7594
[root@VM-0-11-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
bc749755ff23 bridge bridge local
cc6fb605cde8 host host local
8a3cfa860aae mynet bridge local
00b2ae19fb37 none null local
[root@VM-0-11-centos ~]# docker network inspect mynet
使用自己建立的網路啟動容器,通過容器名直接可以進行通訊
[root@VM-0-11-centos ~]# docker run -d -p 80:8080 --name tomcat01 --net mynet tomcat
[root@VM-0-11-centos ~]# docker run -d -P --name tomcat02 --net mynet tomcat
[root@VM-0-11-centos ~]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.034 ms
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.049 ms
3.3,自定義網路連通測試
使用預設模式再開啟一個容器
[root@VM-0-11-centos ~]# docker run -d -P --name tomcat03 tomcat
023cff8d34af26a5db70af374b89b5c6baf1171c28f8ded417c8941f9ae597ed
嘗試通訊,發現不同網段的容器無法通訊
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.034 ms
將tomcat03和mynet連通,就可以實現01,02,03之間的通訊了
[root@VM-0-11-centos ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
[root@VM-0-11-centos ~]# docker network connect mynet tomcat03
[root@VM-0-11-centos ~]# docker exec -it tomcat03 ping tomcat03
PING tomcat03 (192.168.0.4) 56(84) bytes of data.
64 bytes from 023cff8d34af (192.168.0.4): icmp_seq=1 ttl=64 time=0.014 ms
檢視mynet網路的具體資訊,發現tomcat03已經加入到了mynet中(tomcat03也在docker01中/一個容器兩個ip,docker01在docker network ls中顯示為 bc749755ff23 bridge bridge local)
[root@VM-0-11-centos ~]# docker network inspect mynet
"Containers": {
"023cff8d34af26a5db70af374b89b5c6baf1171c28f8ded417c8941f9ae597ed": {
"Name": "tomcat03",
"EndpointID": "c57d075ff87400bf48d62e0c79dacf3fbf01417c678a62283ba62a370c815922",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"585ecd5171e7722401708234aa7a110773d4f852e2992d6dcc22084c282f12ff": {
"Name": "tomcat01",
"EndpointID": "8a13b027417aa67db6b8a7bb58d12c003c3cb5138bc9fcd9718542fc53626bd0",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"8456029b09de3306abfe6b61a1d7ca001a01c9d5da58f2d7f836db66d5c206bc": {
"Name": "tomcat02",
"EndpointID": "85765f60d452116017ef69038e98b2e9f85d286b1a70b7e558c48e96e9a407cc",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
聯通後的模型
3.4,步驟總結
自定義網路(根據不同類別的容器可以建立不同的網路,不同網路是相互隔離的;自定義網路相比與docker0的最大優勢是連線自定義網路的容器可以使用容器名相互通訊)
[root@VM-0-11-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
使用自定義網路啟動容器,就可以實現容器之間的相互通訊(同一網路下)
[root@VM-0-11-centos ~]# docker run -d -p 80:8080 --name tomcat01 --net mynet tomcat
[root@VM-0-11-centos ~]# docker run -d -P --name tomcat02 --net mynet tomcat
[root@VM-0-11-centos ~]# docker exec -it tomcat01 ping tomcat02
網路連通,實現不同網路之間容器的相互通訊
[root@VM-0-11-centos ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
[root@VM-0-11-centos ~]# docker network connect mynet tomcat03