2015-04-03 62 views
4

我想通过Docker容器中的iptables将8080端口转发到80。 在构建中,我有一条错误消息,如下所示。如何在Docker容器中向前端口?

这里是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 

预先感谢您的任何帮助,您可以提供。

回答

7

首先,在docker build进程中运行iptables命令永远不会有意义;即使它起作用,iptables命令也只会修改内核的运行时配置。这些更改不会在Docker镜像上持续存在,并且在启动容器时不可用。其次,即使您在启动容器(而不是构建容器)后运行iptables容器,它仍然会失败,因为默认情况下,Docker容器没有修改iptables配置的必要权限(或修改一般网络,或挂载文件系统等)。您可以使用--privileged标志启动一个容器,但这可能不是您想要执行的操作(因为这会对容器赋予许多可能不必要的额外特权,并且从安全角度来看,只允许授予绝对必要的特权)。

你通常会处理这个使用多克的-p选项,您的主机上的端口连接到端口在你的容器,例如:

docker run -p 80:8080 temp 

这将您的主机上的容器上链路端口80到端口8080。

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

+0

亲爱的柳絮!感谢你的博览会,我注意到了它。 -p选项适合我需要! – edfromhadria 2015-04-03 14:52:37

+0

什么是“只修改运行时配置”的含义?有时我需要比端口转发更复杂的规则。 – 2015-05-28 02:27:03

+1

@liaozd在构建过程中运行'iptables'是没有意义的,因为'iptables'命令修改了本地网络名称空间的配置,这是暂时的,在Dockerfile中处理该特定的'RUN'命令后将被丢弃。当你运行一个镜像时,你正在用它自己的一组iptables规则创建一个新的网络命名空间。通常,修改Docker容器内的iptables配置是做错事情的错误方法。如果您还有其他问题,请在StackOverflow上打开一个新问题。 – larsks 2015-05-28 02:53:02

相关问题