如何在 Docker 容器中转发?

How to port forward in Docker container?

我想在 Docker 容器中使用 iptables 将 8080 端口转发到 80。 在构建中,我有一条错误消息,如下所示。

这是 Docker 文件:

FROM fedora
RUN whoami && \
 iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

这是输出:

[~]# docker build -t temp /home/edfromhadria/Documents/Docker/temp/.
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM fedora
 ---> 834629358fe2
Step 1 : RUN whoami &&  iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
 ---> Running in 95046cf959bf
root
iptables v1.4.21: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
INFO[0001] The command [/bin/sh -c whoami &&  iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080] returned a non-zero code: 3 

提前感谢您提供的任何帮助。

首先,运行在 docker build 过程中使用 iptables 命令是没有意义的;即使有效,iptables 命令也只会修改内核的 运行time 配置。这些更改不会保留在 Docker 图像上,并且在启动容器时不可用。

其次,即使您在启动容器后(而不是在构建容器时)运行安装 iptables 容器,它仍然会失败,因为默认情况下 Docker 个容器没有必要的权限来修改 iptables 配置(或一般修改网络,或挂载文件系统等)。你可以用 --privileged 标志启动一个容器,但这可能不是你想要做的(因为这会赋予容器一些额外的权限,这可能是不必要的,从安全的角度来看这是一个很好的只授予绝对必要的权限的想法)。

您通常会使用 Docker 的 -p 选项来处理此问题,将主机上的端口连接到容器中的端口,例如:

docker run -p 80:8080 temp

这将 link 主机上的端口 80 到容器上的端口 8080。

如果这不是您想要的,更简单的解决方案是将容器中的应用程序配置为所需端口上的 运行。