首先,我们来看看Docker默认的网络模式,即docker0
网桥。
每当你安装Docker时,它会创建一个名为docker0
的虚拟网桥,并设置一个IP地址范围供它进行端口映射等工作。所有Docker容器在创建时,都会自动连接到这个docker0
网桥,并分配一个虚拟IP地址。这样,容器与主机之间,以及容器与容器之间就可以相互通信了。
但是,docker0
网桥存在一些限制:容器之间的连接不够安全,IP地址也可能会发生冲突等问题。因此,Docker引入了自定义网络的概念,来解决这些问题。
当你使用docker-compose.yml
文件定义一个networks
参数时,Docker会基于该参数创建一个自定义网络。比如:
version: '3'
services:
web:
build: .
networks:
- frontend
db:
image: postgres
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
在这个例子中,我们定义了两个独立的网络frontend
和backend
。web
服务连接到frontend
网络,而db
服务连接到backend
网络。这样,web
和db
服务之间就无法直接通信了,从而增加了一层隔离和安全性。
除了隔离的好处,自定义网络还可以互通于docker0
网桥。这一过程是自动完成的。
当一个容器连接到自定义的网络时,Docker会在该网络与docker0
网桥之间创建一个"网桥连接"。因此,即使容器位于不同的自定义网络,它们也可以通过连接到docker0
网桥来实现互通。
当然,这种自动的互通有一定的安全隐患。如果你想禁止某些容器直接互通,你可以将它们分配到不同的自定义网络中。
此外,Docker还支持host
、overlay
等多种网络模式,可以用于满足不同的场景。它们的工作原理也不尽相同。
总之,Docker的网络设计灵活多样,可以满足绝大部分需求。合理地规划和配置网络有利于提高容器应用的安全性、可靠性和维护性。
常用命令:
ip a 显示网络接口信息,包括 IP 地址、MAC 地址、状态等。
docker network ls 列出所有docker网络
docker network inspect 展示docker网络详情
docker network prune 删除所有未使用的网络
后续更深层次的内容还需继续学习...