如何在Docker容器中向前端口?

我想通过在Docker容器中的iptables将8080端口转发到80。 在构build中,我有一个错误消息,你可以看到下面。

这是Dockerfile:

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命令也只是修改你的内核的运行时配置。 这些更改不会在Docker镜像上持续存在,并且在启动容器时将不可用。

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

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

 docker run -p 80:8080 temp 

这会将主机上的端口80连接到容器上的端口8080。

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