对于docker-compose
使用网桥网络在容器之间创建专用网络,使用的解决方案docker0
不起作用,因为容器的出口接口不是docker0
,而是一个随机生成的接口ID,例如:
$ ifconfig
br-02d7f5ba5a51: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.32.1 netmask 255.255.240.0 broadcast 192.168.47.255
不幸的是,随机ID是不可预测的,并且每次撰写必须重新创建网络时(例如在主机重启时),随机ID都会改变。我的解决方案是在已知子网中创建专用网络并配置iptables
为接受该范围:
撰写文件片段:
version: "3.7"
services:
mongodb:
image: mongo:4.2.2
networks:
- mynet
# rest of service config and other services removed for clarity
networks:
mynet:
name: mynet
ipam:
driver: default
config:
- subnet: "192.168.32.0/20"
如果您的环境需要,可以更改子网。我192.168.32.0/20
通过使用任意选择docker network inspect
来查看默认情况下创建的内容。
iptables
在主机上配置以允许专用子网作为源:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
这是最简单的iptables
规则。您可能希望添加其他限制,例如按目标端口。当您对iptables规则感到满意时,请不要忘记坚持这些规则。
该方法具有可重复且因此可自动化的优点。我使用ansible的template
模块通过变量替换部署我的撰写文件,然后分别使用iptables
和shell
模块配置和保留防火墙规则。