Docker通过网络命名空间、虚拟网桥等技术实现容器间及容器与外部的网络隔离,以下是具体操作方法及注意事项:
Docker提供多种网络模式,其中none模式(完全隔离)和bridge模式(基础隔离)是最常用的隔离方案:
lo回环接口,适合需要绝对隔离的场景(如敏感数据处理)。docker run -it --network none ubuntu /bin/bashdocker0,通过NAT实现与宿主机通信,但容器间默认隔离(需通过端口映射或自定义网络实现互通)。docker run -it --network bridge ubuntu /bin/bash默认的bridge网络无法区分不同业务容器,自定义桥接网络可实现细粒度的容器隔离与互通:
docker network create命令创建,可指定子网、网关等参数(避免IP冲突)。docker network create --subnet=192.168.1.0/24 --gateway=192.168.1.1 my_isolated_net--network参数指定自定义网络,容器间可通过容器名直接通信(无需端口映射)。docker run -d --network my_isolated_net --name container1 nginxdocker run -d --network my_isolated_net --name container2 redisdocker network inspect my_isolated_net查看网络中的容器列表,不同自定义网络的容器无法直接通信。若需进一步限制容器间的通信(如仅允许特定容器访问),可通过iptables设置规则:
docker network inspect my_isolated_net获取子网(如192.168.1.0/24)。container1访问container2的6379端口)。# 允许container1(IP:192.168.1.2)访问container2(IP:192.168.1.3)的6379端口
iptables -A DOCKER-USER -s 192.168.1.2 -d 192.168.1.3 -p tcp --dport 6379 -j ACCEPT
# 拒绝其他所有到container2 6379端口的访问
iptables -A DOCKER-USER -d 192.168.1.3 -p tcp --dport 6379 -j DROP
注意:DOCKER-USER链是Docker专门用于用户自定义规则的链,优先级高于默认规则。若需让容器仅与特定容器通信(如内部服务),可禁用其对外网络访问:
none:容器无网络配置,仅能通过lo接口通信(适合纯计算任务)。docker run -it --network none ubuntu /bin/bashiptables -A OUTPUT -o eth0 -j DROP(eth0为宿主机网卡,需替换为实际名称)。对于多容器应用(如Web+DB),可通过docker-compose.yml文件定义自定义网络,简化配置:
version: '3'
services:
web:
image: nginx
networks:
- frontend
db:
image: mysql
networks:
- backend
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
backend:
driver: bridge
ipam:
config:
- subnet: 192.168.2.0/24
gateway: 192.168.2.1
运行docker-compose up -d后,web(192.168.1.x)与db(192.168.2.x)容器处于不同网络,需通过宿主机或中间件(如Redis)实现通信。
iptables规则重启后会丢失,需通过iptables-save保存(Ubuntu可使用netfilter-persistent工具);none模式),容器的可用性越低,需根据业务需求选择合适模式。