Docker 网络模式

我们一开始在使用 Docker 时,就要考虑到几个问题:

  • 容器的网络是怎么来的

  • 如何与他或与多个容器之间进行通信

  • 容器和容器之间进行通信

因此,我们很有必要来了解关于 Docker 的网络相关知识,以满足更高的需求

在了解 Docker 网络之前,我们需要先了解 Docker 的网络模式都是什么:

网络模式

功能(简述)

bridge

为每个容器分配或设置IP,连接到名为“docker0”的虚拟网络

host

使用宿主机的IP和端口,不使用 Docker 配置

none

容器有独立的网络配置,但是并没有进行网络设置,无IP分配,本地回环

container

不会创建自己的网卡,而是与其他容器共享IP和端口

网络模式的运行原理较为复杂,这里不进行讲解,请自行了解

Docker 默认网络

查看网络模式

我们在安装完成 Docker 后,会默认的创建三种虚拟网络,通过如下命令,我们可以查看:

docker network ls

结果如下:

查看容器网络

也可通过查询ip地址的方式来查看容器IP:

ip addr | grep inet		# 这里使用了管道,也可以直接使用 ip addr 命令

结果:

可见,192.168.100.1、172.17.0.1、172.10.4.254是我所用的容器ip地址

对于每个容器的IP地址和Gateway信息,我们可以通过如下命令进行查看,在 NetworkSettings 节点中看到更详细的信息

docker inspect $containerName|$container ID

本站正是Docker容器所部署,详细如下(节选):

同样的,我们可以通过如下命令来查看某种网络模式下的所有容器,在Container节点中可查看到容器名称

docker network inspect $networkModle

例如 bridge 模式:

可见幻兽帕鲁服务器在 bridge 模式的 172.17.0.0 网段工作,ip地址为 172.10.0.2

Docker 容器通信

在这里,建议使用自定义的网络模式来控制容器之间的通信

你可以创建任意数量的网络模式,并可以在给定时间将容器连接或断开网络中的各个网络,而无需重新启动容器

当容器连接到多个网络时,其外部连接通过的第一个非内部网络以词法顺序提供

创建网络

假定,我们创建一个 bridge 模式的网络,命令格式如下:

docker network create --driver $networkModle $modleName
# 创建一个名为 cokeserver 的 bridge 网络
# docker network create --driver bridge cokeserver

如果想要创建其自定义的ip和网关,命令参数如下:

docker network create --driver $networkModle --subnet $networkSubnet --gateway $networkGate $modleName
# 创建一个名为 cokeserver ,ip段为 172.20.0.0/24,网关为 172.20.0.1 的bridge 网络
# docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 cokeserver

注意:

bridge 自定义网络之间默认支持域名解析

bridge 自定义网络与系统自带的网桥之间默认有解析

docker的系统自带网桥默认无解析

容器内部通信

同一网桥的容器之间可以通信

假定我们通过上述方法再创建了一个bridge 网络模式,名为 cokeserver2 ,已知现有的容器:Halo-Blog,想要实现通信,命令格式如下:

docker network connect $networkName $containerName
docker attach $containerName

# 将容器 Halo-Blog 与网络模式 cokeserver2 建立连接
# docker network connect cokeserver Halo-Blog
# docker attach Halo-Blog

进入容器,测试是否可以通信(ping方法)

容器Halo-Blog内(172.10.4.2)

bridge 网络模式cokeserver2(172.11.4.2)

root@a77dd40e0a04:/# ping 172.11.4.2

如若有返回值,则说明成功建立通信

容器外部通信

端口映射

外部主机访问容器或外部容器之间访问是通过docker-proxy实现的

查看iptable的nat防火墙策略:

iptables -t nat -nL

如下:

假如创建一个名为 nginx 容器(外部访问443映射内部容器端口80)命令格式如下:

docker run -d --name $containerName -p outer_port:inner_port $containerName
# 外部访问443映射内部容器端口80的 nginx 容器
# docker run -d nginx -p 443:80 nginx

再次使用iptables命令即可看到新的nginx容器的端口转发