dav*_*idA 2 iptables port-forwarding redirection jenkins docker
我有一台运行 Jenkins(端口 8080 上的 HTTP)的 Linux 服务器,并且同一台服务器也在运行 Docker 1.12.1。我使用了一些 iptables 规则(根据 Jenkins 官方安装文档)将端口 8080 重定向到主机的端口 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
Run Code Online (Sandbox Code Playgroud)
然而,这些规则破坏了 Docker 在docker build命令期间通过 HTTP 下载正确资源的能力。例如,RUN apt-get update由于多个“无法下载”错误而失败。这样做wget http://www.google.com的容器内返回该詹金斯主要页面的HTML。来自主机的 HTTP GET 工作正常。删除 iptables 规则会导致RUN apt-get update再次工作。所以我认为那些 iptables 规则正在干扰 docker 的网络机制。
这样的端口重定向可以和Docker共存吗?如果是这样,如何编写 iptables 规则来解决这个问题?
对 iptables 规则的可能修改是删除两者并替换为:
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j REDIRECT --to-ports 8080
Run Code Online (Sandbox Code Playgroud)
这将确保,就我而言,只有通过接口eth0在端口 80 上的 TCP 流量将被重定向。来自主机上的 docker 容器的流量不会被重定向。请注意,我也省略了 localhost 重定向,尽管可能可以对其进行修改以避免过滤来自 interface 的任何内容docker0。
另一种解决方案是使用反向代理将 TCP 端口 80上传入的 HTTP 请求转发到主机的端口 8080。我使用Caddy和以下简单的 Caddyfile:
localhost:80
proxy / localhost:8080
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以完全删除 iptables 规则。
这似乎在端口 80 上提供了简单的重定向,并允许 docker 容器正常使用传出 HTTP。
| 归档时间: |
|
| 查看次数: |
5780 次 |
| 最近记录: |