2015-04-03 23 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

相關問題