2015-09-22 83 views
1

我正在學習docker,並從一個簡單的基於python的web服務器開始,它在調用時回覆「Hello World」。我很難理解如何公開特定的端口。如何發佈不同於默認端口的端口?

背景

# the Dockerfile 
FROM ubuntu 
RUN apt-get -qq update 
RUN apt-get install -y python 
RUN echo "Hello world" > index.html 
CMD ["/usr/bin/python", "-m", "SimpleHTTPServer"] 

默認情況下,該網站服務器公開的8000端口:

$ python -m SimpleHTTPServer 
Serving HTTP on 0.0.0.0 port 8000 ... 

當啓動容器我得到

# docker run -d 06b5c2fc603e 
2ca568ba0799ab00af72f230ec99038e225265a4af073da54026b7a90bacb0c9 
# docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 
2ca568ba0799  06b5c2fc603e  "/usr/bin/python -m 4 seconds ago  Up 3 seconds         tender_davinci 
# docker inspect 2ca568ba0799 | grep IPAddress 
     "IPAddress": "172.17.0.84" 

察看8000個端口答案在分配的IP地址上 - 確實如此。

# curl -XGET 172.17.0.84:8000 
Hello world 

現在我想發佈此端口,以便其他主機可以訪問。

# docker run -d -p 8000:8000 06b5c2fc603e 
6715c6fd58100c27fbdc26895755e164ae3b241f6bd6e43c331ca44cf388d6f1 
# docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 
6715c6fd5810  06b5c2fc603e  "/usr/bin/python -m 3 seconds ago  Up 3 seconds  0.0.0.0:8000->8000/tcp cocky_tesla 

從遠程站點檢查 - 它的工作原理

# curl -XGET 10.242.136.232:8000 
Hello world 

現在的問題

# docker run -d -p 8000:8888 06b5c2fc603e 
0f2e9f79a51e4710f9e8be90376e080928904e6b7320771ca5ad4f829043a6ca 
# docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 
0f2e9f79a51e  06b5c2fc603e  "/usr/bin/python -m 4 seconds ago  Up 3 seconds  0.0.0.0:8000->8888/tcp adoring_goodall 
:當我想更改已發佈端口(8000〜8888)失敗

和從遠程主機的訪問

# curl -XGET 10.242.136.232:8888 
curl: (7) couldn't connect to host 

docker似乎正確地NAT轉換端口(0.0.0.0:8000->8888/tcp),爲什麼一旦它從容器中的服務公開的端口發生變化,它就不能使用?

注:沒有防火牆/網絡訪問控制列表這將阻礙交通

有關於網絡的話題幾個問題(an answer to one of them給出了一個很好的概述)和the docs十分清晰(特別的例子),所以我我不知所措。

回答

5

你要交換端口的順序是這樣的:

# docker run -d -p 8888:8000 06b5c2fc603e 

據碼頭工人跑文檔here時,第一口是主機端口,第二個是集裝箱港口 - > HOSTPORT:containerPort