【问题标题】:How to port forward in Docker container?如何在 Docker 容器中进行端口转发?
【发布时间】:2015-06-08 15:07:28
【问题描述】:

我想在 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 

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

【问题讨论】:

    标签: linux docker fedora wildfly


    【解决方案1】:

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

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

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

    docker run -p 80:8080 temp
    

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

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

    【讨论】:

    • 亲爱的拉斯克!谢谢你的说明,我明白了,注意到了。 -p 选项可以满足我的需要!
    • 什么是“只修改运行时配置”是什么意思?有时我需要比端口转发更复杂的规则。
    • @liaozd 在构建过程中运行iptables 没有任何意义,因为iptables 命令会修改本地网络命名空间的配置,该配置是短暂的,在处理完特定的RUN 后将被丢弃Dockerfile 中的命令。当您docker run 一个图像时,您正在使用它自己的一组 iptables 规则创建一个新的网络命名空间。一般来说,修改 Docker 容器内的 iptables 配置是错误的做法。如果您还有其他问题,请在 StackOverflow 上打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2019-05-30
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多