Docker 之十四 Docker 四大网络模式

Docker 四大网络模式

桥接模式、主机模式、容器模式、无网络模式

Docker 四大网络模式之一(bridge)

该模式是 Docker 的默认设置,Docker 守护进程创建了一个虚拟以太网桥 docker0,附加在其上的任何网卡之间都能自动转发数据包。默认情况下,守护进程会创建一对对等接口,将其中一个接口设置为容器的 eth0 接口,另一个接口放置在宿主机的命名空间中,从而将宿主机上的所有容器都连接到这个内部网络上。守护进程还会从网桥的私有地址空间中分配一个 IP 地址和子网给该容器。注意启动容器的时候需要指定 - p(固定端口分配) 或者 -P(动态端口分配)参数来暴露端口,否则 IP 数据包就不能从宿主机之外路由到容器中。

1
2
3
4
5
6
7
8
9
10
11
# docker run -d -p 8888:8080 --net=bridge --name=tomcat8 tomcat:8

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
223e6aee4801 tomcat:8 "catalina.sh run" 23 seconds ago Up 21 seconds 0.0.0.0:8888->8080/tcp tomcat8

# 查看宿主机的虚拟网桥列表
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242e6d2901f no veth3074090

Docker 四大网络模式之二(host)

该模式将禁用 Docker 容器的网络隔离,因为容器共享了宿主机的 Network Namespace,直接暴露在公共网络中。容器将不会虚拟出自己的网卡和配置自己的 IP 等,即容器直接使用宿主机的 IP 和端口。该模式比 bridge 模式更快(因为没有路由开销),但是它将容器直接暴露在公共网络中,存在安全隐患。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# docker run -d --net=host --name=tomcat8 tomcat:8

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
363792e07323 tomcat:8 "catalina.sh run" 6 minutes ago Up 6 minutes tomcat8

# 查看宿主机的IP信息
# ip addr | grep -A 2 eth0:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 0c:c4:7a:ab:b8:36 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.130/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0

# 查看容器的IP信息,可以发现容器和宿主机具有相同的IP地址192.168.1.130
# docker exec -it tomcat8 ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 0c:c4:7a:ab:b8:36 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.130/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0

Docker 四大网络模式之三(container)

该模式会重用另一个容器的网络命名空间。通常来说,当你想要自定义网络栈时,该模式是很有用的。实际上,该模式也是 Kubernetes 使用的网络模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 以桥接模式启动第一个容器
# docker run -d -p 8888:8080 --net=bridge --name="tomcat8-1" tomcat:8

# 查看第一个容器的IP信息
# docker exec -it tomcat8-1 ip addr
107: eth0@if108: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

# 以container模式启动第二个容器,同时指定重用第一个容器的网络命名空间;注意此时两个容器内的Tomcat服务器不能使用相同的监听端口,否则会造成端口冲突导致Tomcat容器启动失败
# docker run -d --net="container:tomcat8-1" --name="tomcat8-2" tomcat:8

# 查看第二个容器的IP信息,可以发现与第一个容器的IP地址一样都是172.17.0.2
# docker exec -it tomcat8-2 ip addr
107: eth0@if108: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

Docker 四大网络模式之四(none)

该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上该模式关闭了容器的网络功能,此模式在以下两种情况下是有用的,第一种是容器并不需要网络(例如只需要写磁盘卷的批处理任务),第二种是希望自己自定义网络。

1
2
3
4
5
6
7
8
9
# docker run -d -p 8888:8080 --net=none --name=tomcat8 tomcat:8

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b4b90aa1a98 tomcat:8 "catalina.sh run" 2 seconds ago Up 1 second tomcat8

# docker inspect tomcat8 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",

Docker 网络安全

Docker 可以开启容器间通信(意味着默认配置–icc=true),也就是说,宿主机上的所有容器可以不受任何限制地相互通信,这可能导致拒绝服务攻击。进一步地,Docker 可以通过–ip_forward 和–iptables 两个选项控制容器间、容器和外部世界的通信。应该多了解这些选项的默认值,并让网络组根据公司策略设置 Docker 进程。

Docker 容器分配固定 IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建自定义网络(网桥),这里子网掩码使用255.255.255.0,也就是IP后面的数字24
# docker network create --subnet=172.170.0.0/24 jenkins-network

# 可使用以下命令删除自定义网络(网桥)
# docker network rm jenkins-network

# 查看Docker的网桥列表
# docker network ls
NETWORK ID NAME DRIVER SCOPE
14c2653a88a2 bridge bridge local
f44c2671ffd1 host host local
007c22522504 jenkins-network bridge local
03b720dc8c80 none null local

# 创建并启动容器,指定自定义网络(网桥)、IP
# docker run -d --net jenkins-network --ip 172.170.0.5 -p 9126:80 -p 4690:3690 --name jenkins-svn-httpd clay/jenkins-svn-httpd:1.1

# 查看容器的IP
# docker exec -it jenkins-svn-httpd ip addr
49: eth0@if50: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:aa:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.170.0.5/24 brd 172.170.0.255 scope global eth0
valid_lft forever preferred_lft forever