介绍
安装 Docker 会自动创建三个网络,bridge、 none 、host。其中 bridge 创建容器时默认连接到此网络。
网络模式
| 网络模式 | 说明 |
|---|---|
| Bridge | Bridge 模式为每一个容器分配、设置 IP 等,并把容器连接到 docker0 虚拟网桥,通过docker0 网桥以及 Iptables nat 表配置与宿主机通信。 |
| host | 容器和宿主机共享Network namespace。 |
| Container | 容器和另外一个容器共享 Network namespace。 kubernetes 中的pod就是多个容器共享一个 Network namespace。 |
| none | 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等。 |
1. 默认网络
安装 Docker 时,会自动创建三个网络。可以通过下面命令进行查看
docker network ls
启动容器时,可以使用该 –network 参数指定容器连接到哪个网络
Docker 守护程序默认将容器连接到 bridge 网络,除非使用该 docker run --network=选项指定
–net 指定容器网络模式
- host:–network=host 指定。
- none:-network=none 指定。
- bridge:–network=bridge 指定,默认。
- container:–network=container:NAME_or_ID 指定。
2. Bridge 模式
Docker 使用 Linux桥接模式时,会在宿主机虚拟一个 Docker 网桥(docker0),启动一个容器时容器会连接到这个虚拟网桥,Docker 会从 RFC1918 所定义的私有IP网段中,选择一个和宿主机不同的 IP 地址分配给容器,称为 Container-IP,同时 Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的与其通信,也意味着外部网络无法通过直接 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
Docker 的 bridge 网络采用内置的 bridge 驱动,而 bridge 的底层采用的是 Linux 内核中 Linux bridge 技术,这意味着 bridge 是高性能并且是非常稳定的。
3. host 模式
host 模式,容器不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出网卡、IP等,而是使用宿主机的 IP 和端口。容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
host 模式的容器可以直接使用宿主机 IP 地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,host最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再用了,网络的隔离性不好。
采用 host 模式的 Docker Container,可以直接使用宿主机 IP 与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。