-
問題描述
docker自身是有一個網絡系統的,對於一個運行在docker內的程序的某個端口(比如training/webapp這個鏡像下的flask的5000端口)。如果要進行訪問,詳細的過程是:
- 訪問服務器的ip:port
- 公網ip:port --> docker的ip:port
- 通過docker的ip:port連接到某個api服務
總共有三層邏輯:服務器層、容器層、應用層。
最終計算請求數據的是容器內的應用,但是這個應用的端口是無法在公網上查看的,這就需要使用docker的端口映射功能。
-
端口映射
docker默認是不對外開放端口的。
默認情況下,容器可以主動訪問到外部網絡的連接,但是外部網絡無法訪問到容器。
所以如果在容器內運行網絡應用和服務是無法提供給外界使用的,端口映射功能可以實現公網上訪問容器內部的網絡應用。
-p 可以指定要映射的端口,並且在一個指定端口上只可以綁定一個容器 -P 隨機映射一個主機端口(這個是隨機的)到容器內部開放的網絡端口(這個端口是程序設定的)
“映射”這個概念,是從外向內;是指將外網中訪問的port映射到容器內部的port上。
支持格式:
# 綁定宿主機IP及端口,服務器主機上可能有多快網卡 ip:hostPort:containerPort # 綁定宿主機IP ip::containerPort # 綁定宿主機端口 hostPort:containerPort
-
案例
在
阿里雲ubuntu16.04
系統上運行菜鳥教程中給出的training/webapp
案例。 -
docker run -P
docker run -d -P training/webapp python app.py
通過
docker -ps
查看,PORTS
爲0.0.0.0:32769->5000/tcp。這個端口信息的意思是:
- 外界所有ip地址(0.0.0.0)
- 都可以訪問本服務器的32769端口(本服務器公網47.240.xx.xx),即訪問47.240.xx.xx:32769
- 就相當於訪問training/webapp容器中的app.py程序所開放的5000端口
-
docker run -p
runoob@runoob:~$ docker run -d -p 80:5000 training/webapp python app.py
但是阿里雲服務器有防火牆,默認只開放了22、80、443三個端口。
因此
-P
默認映射的32769端口是無效的,用-p
將容器內5000端口映射爲主機服務器上的80端口方可有效。當然,開放服務器的32769也是一個道理。
此時訪問
47.240.xx.xx:80
就可以得到 Hello world!。
-p 可以多次使用指定多個端口映射docker run -p 80:5000 -p 443:5100 training/webapp python app.py
Docker進行端口綁定時,默認會綁定TCP端口。還可以使用udp標記來綁定udp端口:
sudo docker run -d --name experss-app -p 3000:3000/udp itbilu/express-app
-
docker port id/name
>>> docker port container_id # or >>> docker port container_name 5000/tcp -> 0.0.0.0:80
查看指定容器的端口映射。
-
References
以阿里雲服務器爲例理解docker端口映射
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.