1. 程式人生 > >Docker學習筆記-Docker埠對映

Docker學習筆記-Docker埠對映

為什麼要埠對映?

在啟動容器時,如果不配置宿主機器與虛擬機器的埠對映,外部程式是無法訪問虛擬機器的,因為沒有埠。

埠對映的指令是什麼?

docker指令:docker run -p ip:hostPort:containerPort redis

使用-p引數會分配宿主機的埠對映到虛擬機器。
IP表示主機的IP地址。
hostPort表示宿主機的埠。
containerPort表示虛擬機器的埠。

支援的格式有三種:

ip:hostPort:containerPort:對映指定地址的指定埠到虛擬機器的指定埠(不常用)
如:127.0.0.1:3306:3306,對映本機的3306埠到虛擬機器的3306埠。
ip::containerPort:對映指定地址的任意埠到虛擬機器的指定埠。(不常用)
如:127.0.0.1::3306,對映本機的3306埠到虛擬機器的3306埠。
hostPort:containerPort:對映本機的指定埠到虛擬機器的指定埠。(常用)
如:3306:3306,對映本機的3306埠到虛擬機器的3306埠。

如何檢視是否對映成功?

使用docker ps命令檢視


出現6379/tcp的表示宿主機並沒有開啟與虛擬機器的埠對映。
出現0.0.0.0:3306->3306/tcp表示宿主機的3306埠對映到了虛擬機器的3306埠。

也可以使用docker port NAME檢視埠對映情況。


表示虛擬機器的3306埠對映到了主機的3306埠。
如果沒有任何回覆,表示埠對映失敗。

*****************************************************

Docker執行容器之後卻發現沒IP,沒埠,那要如何訪問容器呢?
下面我來介紹下Docker通過埠對映來實現網路訪問

一、從外部訪問容器應用

在啟動容器的時候,如果不指定對應引數,在容器外部是無法通過網路來訪問容器內的網路應用和服務的。
當容器中執行一些網路應用,要讓外部訪問這些應用時,可以通過-P或-p引數指定埠對映。
先來說說p和P吧

  • -p 可以指定要對映的埠,並且,在一個指定埠上只可以繫結一個容器
  • -P 它會隨機對映一個埠至容器內部開放的網路埠(範圍不詳,似乎都上萬)

先申明一下,我這邊
client ip address 為192.168.0.225
registry ip address 為192.168.0.216:5000

docker run -d -it --name nginx -P 192.168.0.216:5000/nginx
docker ps -a
#檢視容器是否在執行 docker logs nginx #檢視nginx容器的log
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

埠對映支援的格式有:

ip:hostport:containerport   #指定ip、指定主機port、指定容器port
ip::containerport           #指定ip、未指定主機port、指定容器port
hostport:container          #未指定ip port、指定主機port、指定容器port     
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

二、對映所有介面ip

下列命令檢視到0.0.0.0監聽5000埠
docker run -d -it -p 5000:5000 --name registry 192.168.0.216:5000/registry
docker ps -a | grep 5000     

多次使用-p標記可以繫結多個埠
docker run -d -it -p 800:80 -p 8088:8080 --name tomcat 192.168.0.216:5000/tomcat
docker ps -a | egrep "(80|8080)"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

三、對映到指定地址的指定埠

將容器的80 port對映到192.168.0.225:800
docker run -d -it -p 192.168.0.225:800:80 --name web_server 192.168.0.216:5000/nginx
curl 192.168.0.225:800     #驗證是否可以訪問預設首頁
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

四、對映到指定地址的udp埠

這裡且不說能不能訪問,只是一種對映方式。大家別見怪
docker run -d -it -p 192.168.0.225:300:3000/udp --name unknown 192.168.0.216:5000/nginx
netstat -anpu |grep udp
udp    0    0    192.168.0.225:300    0.0.0.0:*     24588/docker-proxy
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

五、檢視對映埠配置

通過docker port container_ID 可以檢視到容器映射了哪些埠及協議
[root@docker ~]#docker port tomcat
8080/tcp -> 192.168.0.225:32769
[root@docker ~]#docker port unknown
3000/udp -> 192.168.0.225:300
*******************************************

Docker 埠對映:

最近抽空,把Docker 埠對映的資料整理了一下,以便後續專案應用,大家也可以參考下。

?
1 # Find IP address of container with ID <container_id> 通過容器 id 獲取 ip $ sudo docker inspect <container_id> | grep IPAddress | cut -d '"' -f 4

無論如何,這些 ip 是基於本地系統的並且容器的埠非本地主機是訪問不到的。此外,除了埠只能本地訪問外,對於容器的另外一個問題是這些 ip 在容器每次啟動的時候都會改變。
Docker 解決了容器的這兩個問題,並且給容器內部服務的訪問提供了一個簡單而可靠的方法。Docker 通過埠繫結主機系統的介面,允許非本地客戶端訪問容器內部執行的服務。為了簡便的使得容器間通訊,Docker 提供了這種連線機制。

5.1 自動對映埠大寫的-P (預設情況下expose埠:80, 443)

-P使用時需要指定--expose選項,指定需要對外提供服務的埠

$ sudo docker run -t -P --expose 22 --name server ubuntu:14.04

使用docker run -P自動繫結所有對外提供服務的容器埠,對映的埠將會從沒有使用的埠池中 (49000..49900) 自動選擇,你可以通過docker ps、docker inspect <container_id>或者docker port <container_id> <port>確定具體的繫結資訊。

5.2 繫結埠到指定介面小寫的-p

基本語法

$ sudo docker run -p [([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp] <image> <cmd>

預設不指定繫結 ip 則監聽所有網路介面。