我想在Docker容器中使用iptables将8080端口转发到80。 在构建中,我有一条错误消息,如下所示。
这是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
提前感谢您提供的任何帮助。
答案 0 :(得分:9)
首先,在iptables
过程中运行docker build
命令永远不会有意义;即使它有效,iptables
命令也只修改内核的运行时配置。这些更改不会在Docker镜像上保留,并且在启动容器时将无法使用。
其次,即使您在启动容器(而不是构建容器)后运行iptables
容器,它仍然会失败,因为默认情况下Docker容器没有必要的权限来修改iptables配置(或修改一般的网络,或挂载文件系统等)。您可以使用--privileged
标志启动容器,但这可能不是您想要做的(因为它赋予容器许多额外的权限,这可能是不必要的,从安全角度来看,它是一个好的想要只授予绝对必要的权限。
您通常会使用Docker的-p
选项来处理此问题,以将主机上的端口连接到容器中的端口,例如:
docker run -p 80:8080 temp
这会将主机上的端口80链接到容器上的端口8080。
如果这不是您想要的,更简单的解决方案就是将容器中的应用程序配置为在所需端口上运行。