【发布时间】:2017-01-11 08:14:22
【问题描述】:
为了使项目的开发更容易,我在 docker 容器中放置了一些它所依赖的服务。这使得项目配置中的“localhost”在传递给其中一个容器时意味着不同。
编辑
明确地说,我正在尝试将容器的端口之一转发到主机,因此当容器中运行的进程尝试访问 localhost:5432 时,它连接到主机的端口5432。
结束
我正在使用
HOST_IP=`ip route | grep default | awk '{ printf "%s",$3 }'`
cat /etc/hosts | sed "s/127.0.0.1/$HOST_IP/" > /tmp/etc_hosts
cp /tmp/etc_hosts /etc/hosts
将任何以“localhost”为目标的东西重定向到容器的主机。它在这种情况下工作,但我更愿意找到一种方法只为所需的端口执行此操作,因为我预计它在其他情况下不会工作。
这就是我想出的办法,但它不起作用;当容器中的连接是到 localhost:5432 时,它会尝试连接到容器的 5432 而不是主机的:
# --- These are the things that should make redirecting port 5432 to the host machine
# work, provided the container is run in privileged mode.
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.all.route_localnet=1
iptables -t nat -A PREROUTING -p tcp --dport 5432 -j DNAT --to 172.19.0.1:5432
iptables -A FORWARD -d 172.19.0.1 -p tcp --dport 5432 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
【问题讨论】:
-
你为什么不直接使用
-p? -
@RandallFlagg,见编辑。