Docker network
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上的容器映射的端口时,就会自动转发给容器,这就是外部访问容器的一个过程;