网络模式 | 配置 | 阐明 |
---|---|---|
host | -net=host | 容器和宿主机共享 Network namspace |
container | -net=container:{Name_or_ID} | 容器和另外一个容器共享 Network namespace,典型利用:kubernetes 中 pod 多个容器 |
none | -net=none | 容器有独立的 Network namespace,但没有任何网络配置 |
bridge | -net=bridge | 默认模式 |
Host 模式
host 模式下,容器与宿主机共享一个 Network namespace,容器将不会虚构出本人的网卡,而是应用宿主机的 IP 和端口。
host 模式下,容器能够间接应用宿主机 IP 地址与外界通信,容器内也能够间接应用宿主机的端口,不须要 NAT。
host 模式长处是网络性能较好,但网络隔离性不好。
Container 模式
container 模式下,指定新创建的容器和已存在的另一个容器共享一个 Network namespace,新创建的容器不会再创立网卡。
kubernetes 是 container 模式的典型利用,pod 中的多个容器共享一个 Network namespace,能够通过 127.0.0.1:port 拜访彼此。
//bridge 模式的容器
$ docker run -d -P --net=bridge nginx:1.9.1
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb19088be8a0 nginx:1.9.1 nginx -g 3 minutes ago Up 3 minutes 0.0.0.0:32769->80/tcp,0.0.0.0:32768->443/tcp admiring_engelbart
$ docker exec -it admiring_engelbart ip addr
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet **172.17.0.3**/16 scope global eth0
// 新建一个容器,跟之前的容器共享 Network namespace,ip 雷同
$ docker run -it --net=container:admiring_engelbart ubuntu:14.04 ip addr
...
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet **172.17.0.3**/16 scope global eth0
None 模式
none 模式下,不会为容器进行网络配置,也就是说,容器没有网卡信息 (仅有 lo 网卡)。
Bridge 模式
bridge 模式下,docker 在宿主机上创立一个 docker0 的虚构网桥,该宿主机上的容器连贯到 docker0 上,通过网桥组成一个 L2 网络。
当新建容器时:
- 从 docker0 子网中调配 1 个 IP 给容器,并设置 docker0 为容器的默认网关;
- 在宿主机上创立 1 对虚构网卡:veth pair,一端在容器中 (eth0),另一端在宿主机中 (veth-×××),并将 veth-×××退出 docker0。
docker 在宿主机的 iptables 上做了 DNAT 规定,实现了端口转发:
// 创立 ngingx 容器,宿主机 8080,容器 80
# docker run -p 8080:80 -d nginx
// 查看 iptables DNAT
# iptables -t nat -vnL
....
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80