我刚刚试用了 Docker。它很棒,但似乎不适用于 ufw。默认情况下,docker 会稍微操作 iptables。结果不是错误,但不是我所期望的。有关更多详细信息,您可以阅读 UFW + Docker 的危险
我的目标是建立一个像
Host (running ufw) -> docker container 1 - nginx (as a reverse proxy)
-> docker container 2 - node web 1
-> docker container 3 - node web 2
-> .......
我想通过 ufw 管理传入的流量(例如限制访问),因此我不希望 docker 触摸我的 iptables。这是我的测试
环境:
- 一个新安装的 Ubuntu 14.04(内核:3.13.0-53)
- 码头工人 1.6.2
- ufw 转发已启用。( [Enable UFW forwarding] 2 )
--iptables=false
被添加到 Docker 守护进程中。
第一次尝试
docker run --name ghost -v /home/xxxx/ghost_content:/var/lib/ghost -d ghost
docker run --name nginx -p 80:80 -v /home/xxxx/nginx_site_enable:/etc/nginx/conf.d:ro --link ghost:ghost -d nginx
没运气。第一个命令很好,但第二个命令会抛出错误
Error response from daemon: Cannot start container
第二次尝试
然后我发现: 无法使用 –iptables=false #12701 链接容器
运行以下命令后,一切正常。
sudo iptables -N DOCKER
但是,我注意到我无法在容器内建立任何出站连接。例如:
xxxxg@ubuntu:~$ sudo docker exec -t -i nginx /bin/bash
root@b0d33f22d3f4:/# ping 74.125.21.147
PING 74.125.21.147 (74.125.21.147): 56 data bytes
^C--- 74.125.21.147 ping statistics ---
35 packets transmitted, 0 packets received, 100% packet loss
root@b0d33f22d3f4:/#
如果我从 Docker 守护程序中删除 --iptables=false
,那么容器的互联网连接将恢复正常,但 ufw 将无法“正常”工作(嗯……根据我的定义)。
那么,docker + ufw 的最佳实践是什么?谁能提供一些帮助?
原文由 Yi-Chien Chang 发布,翻译遵循 CC BY-SA 4.0 许可协议
几个月前我遇到过这样的问题,最近决定在我的博客上描述这个问题以及解决方案。这是捷径。
使用
--iptables=false
对您描述的情况没有多大帮助。这里根本不够。默认情况下,您的任何容器都不能进行任何传出连接。在 UFW 后面拥有容器的过程中,您省略了一小步。您可以使用
--iptables=false
或创建/etc/docker/daemon.json
文件,内容如下结果将是相同的,但后一个选项要求您使用
service docker restart
重新启动整个 docker 服务,或者如果 docker 在禁用此功能之前有机会添加 iptables 规则,甚至需要重新启动。完成后,只需再做两件事:
因此,您在 UFW 中设置默认转发策略以接受,并使用:
这样,您要实现的是在您的 iptables 规则中禁用 docker 混乱行为,同时为 docker 提供必要的路由,以便容器可以很好地进行传出连接。不过,从此时起,UFW 规则仍将受到限制。
希望这可以为您和任何在这里寻找答案的人解决问题。
我在 https://www.mkubaczyk.com/2017/09/05/force-docker-not-bypass-ufw-rules-ubuntu-16-04/ 更全面地描述了问题和解决方案