1、docker容器的網絡模式
docker在安裝的時候就會配置一個docker0的linux bridge的方式,在不使用 --network
時, 這也是docker默認使用的方式。docker有三種常見的網絡模式,分別是none,bridge,host
➜ ~ docker network ls
NETWORK ID NAME DRIVER SCOPE
3ea8a3ad1a61 bridge bridge local
9043e76f315a host host local
eba2113c67eb none null local
1.1、docker network command
➜ ~ docker network --help
Usage: docker network COMMAND
Manage networks
Options:
--help Print usage
Commands:
connect 把一個容器連接到網絡
create 創建一個網絡
disconnect 從網絡中中斷容器的連接
inspect 在一個或多個網絡上顯示詳細信息
ls 列出網絡
prune 移除所有未使用的網絡
rm 移除一個或多個網絡
1.2、docker none network
➜ ~ docker run -it --network=none busybox
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
1.3、docker host network
host網絡模式,其實就是借用的docker host上的網卡信息
➜ ~ docker run -it --network=host busybox
/ # ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:D7:FD:FF:0D
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:d7ff:fefd:ff0d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:119 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:13785 (13.4 KiB)
enp2s0 Link encap:Ethernet HWaddr 20:89:84:F1:62:2D
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:16
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:2800 errors:0 dropped:0 overruns:0 frame:0
TX packets:2800 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:262620 (256.4 KiB) TX bytes:262620 (256.4 KiB)
veth4d23dcf Link encap:Ethernet HWaddr A6:25:A8:AE:A8:26
inet6 addr: fe80::a425:a8ff:feae:a826/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:87 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:9515 (9.2 KiB)
wlp3s0 Link encap:Ethernet HWaddr 48:D2:24:4C:07:81
inet addr:192.168.1.28 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::e61c:9373:321e:dc31/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:60055 errors:0 dropped:0 overruns:0 frame:0
TX packets:41972 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:65692420 (62.6 MiB) TX bytes:5900097 (5.6 MiB)
/ #
docker network網絡的優缺點:
- 好處
- docker host網絡的性能比較好
- docker host網絡傳輸效率高
- 缺點
- docker host的主機上使用的端口,容器不能繼續使用
1.4、docker bridge network
brctl show
將會顯示docker0
上的網絡設備,如果有容器運行的是bridge的網絡模式,就會把虛擬網卡掛在docker0上,這里應該注意的是:容器內的虛擬網卡與docker0上掛的虛擬網卡是成對存在的pair
,
安裝brctl工具
apt-get install bridge-utils -y
查看容器的網絡地址
➜ ~ docker run -it --network=bridge busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1459 (1.4 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
1.5 docker網絡模式之用戶自定義網絡
docker提供三種自定義的網絡驅動
bridge
overlay
macvlan
1.5.1 創建自定義bridge網絡
docker network create --driver bridge bridge1
brctl show
docker network create --driver bridge --subnet 172.17.16.0/24 --dateway 172.17.16.1 bridge2
docker run -it --network=bridge2 busybox
----ifconfig
docker run -it --network=bridge2 --ip=172.17.16.3 busybox
2、docker容器之間的互聯互通
docker容器之間的互聯互通基於三種模式:IP
,Docker DNS
,joined
2.1 基於IP方式的互聯互通
docker run -it --network=bridge2 --ip=172.17.16.4 busybox
docker run -it --network=bridge2 --ip=172.17.16.5 busybox
ping -c 3 172.17.16.4(from 172.17.16.5)
2.2 基於Docker DNS之間的互聯互通
注意:docker dns只能使用在用戶自定的網絡模式下運行的容器
docker run -it --network=bridge2 --name=busyboxone busybox
docker run -it --network=bridge2 --name=busyboxtwo busybox
ping -c 3 busyboxone(form busyboxtwo)
2.3 基於join方式的互聯互通
仔細觀察此種模式下的網絡配置信息完全一樣,是通過127.0.0.1進行通信
docker run -it --name web1 httpd
docker run -it --network=container:web1 httpd
3、docker容器與外部是如何進行互相訪問的
3.1 docker容器訪問外部
docker默認的網絡是bridge網絡,因此只要docker host可以連接互聯網,那么容器就是可以聯網的,但是容器訪問外部網絡的過程是如何實現的呢? 容器在向外部發送請求時,docker在NAT上將容器的源地址改為了docker host的地址,因此訪問外部的源地址就變成了docker host的地址
ip r
iptables -t NAT -S
tcpdump -i docker0 -n icmp
tcpdump -i ens33 -n icmp
3.2 外部是如何訪問docker容器的
容器為了響應外部的訪問請求,把容器自己的內部端口暴露給docker host,於是和docker host進行了 端口之間的映射
,外部進行訪問容器就會變成訪問docker host上的一個端口,當docker-proxy進行發現有訪問docker host上的容器映射的端口時,就會自動轉發給容器,這就是外部訪問容器的一個過程;