澳八机器人 认识Docker网络
Docker作为当前最流行的容器化平台,核心价值之一就是让应用可以快速打包分发部署,而网络则是容器之间、容器与外部世界通信的核心基础设施。如果把容器比作一个个独立的房子,Docker网络就是连接这些房子的道路,没有合适的道路,房子里的服务就无法对外提供服务,不同房子之间也没办法相互沟通。理解Docker网络的原理和使用方式,是掌握容器化开发与运维的基础。
Docker网络基础原理
Docker启动后,会默认在宿主机上创建一个名为docker0的虚拟网桥,这就是Docker所有容器默认的网络网关。docker0会采用桥接模式工作,所有新启动的默认容器都会连接到这个网桥上,Docker会自动为每个容器分配独立的IP地址,默认情况下这些容器都属于同一个网段,就像都连接到同一个局域网交换机上一样,容器之间可以通过IP地址直接互相通信。
同时Docker通过网络命名空间实现了网络隔离,每个容器都有自己独立的网络栈,包括独立的网卡、IP、路由表和端口空间,不同容器之间的网络默认是隔离的,也和宿主机的网络隔离开,保证了不同应用之间网络通信的安全。如果需要外部访问容器内部的服务,只需要做端口映射,把宿主机的端口转发到容器内部端口即可,这也是我们最常用的访问容器服务的方式。
Docker常用的五种网络模式
Docker提供了多种不同的网络模式,用来适配不同场景下的需求,最常用的有五种:
1. Bridge 桥接模式(默认模式)
Bridge是Docker的默认网络模式,所有容器默认都会连接到docker0网桥上。这种模式下容器拥有独立的网络命名空间,和宿主机网络隔离,通过端口映射才能对外提供服务,适合大多数单主机上运行容器应用的场景。
Bridge模式的特点是配置简单,隔离性好,但是容器和外部通信需要做地址转换,性能会比Host模式略差一点。如果需要自定义网段、实现DNS服务发现,也可以自己创建自定义Bridge网络,比默认的docker0网络使用更灵活。
2. Host 主机模式
Host模式下容器会直接共享宿主机的网络命名空间,不会再创建独立的网络栈,容器直接使用宿主机的IP地址和端口。这种模式下不需要做端口映射,容器监听什么端口,就直接占用宿主机的对应端口,网络性能比Bridge模式更好,适合对网络性能要求比较高的场景,比如反向代理、负载均衡这类服务。
当然Host模式也有缺点:因为共享宿主机的端口空间,多个容器如果用了同一个端口就会产生冲突,所以使用时需要提前规划好端口,避免冲突,同时隔离性也会比Bridge模式差一些。
3. None 无网络模式
None模式会为容器关闭所有外部网络能力,容器内部只有一个本地回环接口127.0.0.1,没办法和外部容器或者宿主机通信。这种模式适合对安全性要求极高、不需要联网的场景,比如只做离线数据计算、或者不需要对外提供服务的批处理任务,可以最大限度保证容器的网络安全。
4. Container 容器共享模式
这种模式比较特殊,它允许一个新容器共享已经存在的另一个容器的网络命名空间,两个容器共用同一个IP和端口空间,可以通过本地回环互相访问。这种模式适合需要网络互通的一组容器,比如两个容器一个处理web请求一个处理日志,不需要通过网络地址转换就能直接通信,也方便做网络配置的复用。
5. Overlay 叠加网络
Overlay网络是Docker提供的跨主机网络方案,它可以在多个不同的Docker宿主机上构建一个统一的虚拟网络,让不同主机上的容器就像在同一个局域网里一样,直接通过IP互相通信。Overlay网络是Docker集群(Swarm)、Kubernetes等容器编排平台的基础网络能力,适合微服务集群部署,多主机调度的场景,满足跨主机容器通信的需求。
常用Docker网络管理命令
日常使用中我们常用的Docker网络命令非常简单,几个常用命令就可以满足大部分需求:
查看宿主机上所有Docker网络:
docker network ls查看某个网络的详细信息:
docker network inspect <网络名称>创建自定义网络:
docker network create --driver bridge my-network删除网络:
docker network rm <网络名称>把已经运行的容器连接到指定网络:
docker network connect <网络名称> <容器名称>
什么时候选择自定义网络
虽然默认的docker0已经可以满足基础需求,但是生产环境中我们一般都会选择自己创建自定义网络,主要有两个原因:第一,自定义网络自带DNS解析,容器之间可以直接通过容器名字互相访问,不需要记住容器的IP地址;第二,自定义网络自带网络隔离能力,不同自定义网络之间的容器默认不能互相通信,我们可以把相关的服务放在同一个网络里,把无关的服务隔离开,提高系统的安全性;第三,自定义网络可以自定义网段、网关等参数,适配不同企业内部的网络规划需求。
总结
Docker网络本质上就是通过网络命名空间、虚拟网桥实现了容器的网络隔离与通信,不同的网络模式适配了不同场景下的需求:单主机开发测试用默认Bridge模式,对性能要求高用Host模式,不需要网络就用None,多主机集群用Overlay,生产环境推荐使用自定义Bridge网络获得更好的隔离和DNS能力。掌握这些基础概念和使用方式,就能应对绝大多数容器应用的网络需求,解决日常开发运维中遇到的网络问题。
下一篇 >>