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 則監聽所有網路介面。