如何在 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。
如果这不是您想要的,更简单的解决方案是将容器中的应用程序配置为所需端口上的 运行。
我想在 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。
如果这不是您想要的,更简单的解决方案是将容器中的应用程序配置为所需端口上的 运行。