一、網路Docker理解
阿新 • • 發佈:2021-09-27
網路Docker理解
理解docker0
[root@docker ~]# ip addr
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:d0:e3:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.11/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fed0:e3d9/64 scope link
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:0c:c8:12:56 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
網絡卡講解:
lo:本機迴環地址
eth0:本機內網ip地址
docker0:docker地址
三個網路
#問題:docker是如何處理容器訪問的
[root@docker ~]# docker run -d -P --name tomcat01 tomcat
#檢視容器內部ip地址:ip addr 發現容器啟動的時候會得到一個eth0@if10IP地址,docker分配的!
[root@docker ~]# docker exec-ittomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
#思考、linux能不能ping通容器內部!
[root@docker ~]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.035 ms
#linux可以ping通docker內部容器
原理
1.我們每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要安裝了docker,就會有一個網絡卡docker0
橋接模式,使用的技術evth-pair技術
再次測試ip addr發現多了一個網絡卡
[root@docker ~]# ip addr
...................
10: veth6e4dc0c@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 32:f6:1f:c1:c8:03 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::30f6:1fff:fec1:c803/64 scope link
valid_lft forever preferred_lft forever
在啟動一個容器,發現又多了一對網絡卡
[root@docker ~]# docker run -d-P --name tomcat2 tomcat
#我們發現容器帶來的網絡卡都是一對對的
[root@docker ~]# ip addr
...................
20: veth6e9f134@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 5e:f6:00:74:d9:9b brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::5cf6:ff:fe74:d99b/64 scope link
valid_lft forever preferred_lft forever
#evth-pair技術就是一對虛擬裝置介面,一端連著協議,一端彼此相連
#opstac,docker容器之間的連線,OVS的連線,都是使用evth-pair技術
3.我們來測試一個兩個容器是否能夠ping通
[root@docker ~]# docker exec -it tomcat02 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.044 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.041 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.048 ms
#容器與容器之間是可以互相通訊的
結論:Tomcat01與02是公用的路由器,docker0
所有的容器不指定網路的情況下,都是docker0路由器,docker會給我們的容器分配一個預設的可用IP
小結:docker使用的是linux的橋接,宿主機中是一個docker容器的網橋docker0
Docker中所有的網路都是虛擬的,因為虛擬轉發的效率高!
只要容器刪除,對應的一對網橋也沒有了!
[root@docker ~]# docker network ls
NETWORK IDNAMEDRIVERSCOPE
219769a74201bridgebridgelocal
f6b9d84b1f81hosthostlocal
47132fb890acnonenulllocal
6a0ea9685aaatest-netbridgeloca