我在Vultr(主机系统Ubuntu 22.04)上购买了一个VPS,示例IP标识为123.123.123,并尝试使用以下命令启动一个新容器:
docker run -d -p 8081:80 nginx:alpine
知道我的服务器的公共IP,理论上我应该能够通过浏览器http://123.123.123:8081中的以下地址访问它。然而,它至少在公共环境下不工作.因为如果我决定在主机中停止UFW(使用Ubuntu 22.04):
service ufw stop
然后我就可以访问它,没有任何问题(或通过SSH使用cURL,而不禁用UFW):
但是,在使用以下命令启用简单的防火墙后:
service ufw start
则主机不可访问:
以下是UFW的现行规则:
我也有一个通过docker的Portainer示例(只有在UFW被禁用时才能正常工作):
我也尝试过使用Nginx代理管理器,但是我无法让它在像这个Nginx基本容器这样简单的东西上工作。任何帮助都是感激的,如果有必要的话,我很乐意提供更多信息。
1条答案
按热度按时间fjaof16o1#
令人惊讶的是,Docker不能与Linux的“通用防火墙”(UFW)一起开箱即用,它们都修改了相同的iptables配置,这可能导致错误配置暴露不应该是公共的容器。
Docker官方文档中的一个快速修复--但不推荐大多数用户使用--其他许多用户似乎也不推荐使用。请阅读下面的详细信息。
防止Docker操作iptables
可以在
/etc/docker/daemon.json
的Docker引擎配置文件中将iptables
键设置为false
,但此选项不适合大多数用户,无法完全阻止Docker创建iptables
规则。并且在事后创建它们是极其复杂的并且超出了这些说明的范围。将iptables
设置为false
很可能会破坏Docker引擎的容器网络。这是可行的,然而,这只是解决方案的一半。它禁用了Docker管理自己网络的能力,并可能导致容器无法访问互联网在所有开箱即用。这仍然可以工作,但你需要手动维护iptables规则的Docker容器和自定义网络,这是复杂的,恼人的,并击败了UFW的简单的目的。
另一个需要更多努力的解决方案可以在这个Github回购中找到,详细说明了问题和修复步骤。https://github.com/chaifeng/ufw-docker
这里还链接了StackOverflow的一个相关问题。