我有一台运行Jenkins的Linux服务器(端口8080上的HTTP),同一台服务器也运行Docker 1.12.1。 我使用了一些iptables规则(按照官方的Jenkins安装文档)将8080端口redirect到主机端口80,这样默认的HTTP可以用于Jenkins(即http://myserver而不是http://myserver:8080 ):
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
然而,这些规则破坏了Docker在docker build命令期间通过HTTP下载正确资源的能力。 例如, RUN apt-get update失败,出现多个“未能下载”的错误。 在容器中执行wget http://www.google.com返回Jenkins主页面的HTML。 来自主机的HTTP GET正常工作。 删除iptables规则导致RUN apt-get update再次工作。 所以我认为这些iptables规则正在干扰docker的networking机制。
这样的端口redirect可以与Docker共存吗? 如果是这样的话,那么如何写一个iptables规则来解决这个问题呢?
对iptables规则可能的修改是删除和replace:
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j REDIRECT --to-ports 8080
这将确保在我的情况下,只有通过接口eth0端口80上的TCP通信将被redirect。 来自主机上的docker容器的stream量不会被redirect。 请注意,我也忽略了本地主机redirect,尽pipe可能会被修改以避免过滤来自接口docker0任何东西。
另一种解决scheme是使用反向代理将TCP端口80上的传入HTTP请求转发到主机的端口8080.我使用以下简单的Caddyfile的Caddy :
localhost:80 proxy / localhost:8080
有了这个,我可以完全删除iptables规则。
这似乎提供了一个简单的80端口redirect,以及允许docker容器正常使用传出的HTTP。