當容器中部署了屬於讓用戶存取的服務,一定會需要從外部來做存取,然而容器又是如何與外部進行通訊呢?
下圖就是一個從外部能存取到內部容器的簡易架構
Internet-->enp01(Host網卡端口)
-->docker0(內外溝通的橋接網路)
-->vetheg0a1r0y(docker0 Bridge端口)
-->eth0(容器端口)
-->Nginx容器本身
PS:如果是透過內部容器發起連線需求則是上述流程反向操作。
Linux本身就有路由轉發功能,所以其實linux系統本身可以作為一個路由器。執行命令cat /proc/sys/net/ipv4/ip_forward
,能看到ip_forward=1
,說明系統開啟了路由轉發。
ifconfig
來實際檢視到docker0
的橋接網路以及分配到的IP位址
iptables -t nat -vnL
檢視在防火牆上內部容器轉發服務的IP網路的對應
接下來來個簡單的實例牛刀小試一下>>>
容器本身是可以透過執行一些網路應用如最典型就是網站,讓外部使用者可以來存取這些應用,我們可以通過-P或-p的參數來指定連接埠的映射。
我們當單純只使用-P
參數不指定連接埠時,Docker就會隨機的一組連接埠映射到內部網中容器開放的網路連接埠來做綁定。
docker run -d -P mygynginx1
補充:-d 在背景執行容器並把容器ID印出螢幕上,必要參數。
使用docker ps可以看到,本地主機隨機指定一組32768Port映射到容器預設網頁連接埠80。
此時URL只要帶本機上32768連接埠就可以連線到容器內的網站。
http://localhost:32768
或是查看目前hosts IP並把URL改成內部IP。
ifconfig
http://10.200.2.7:32768
如果想要看看跑Nginx容器本身被分配的IP做法。
docker exec -it 013a7b4a9241 /bin/bash
awk 'END{print $1}' /etc/hosts
可以透過指定查看此網站容器的歷史紀錄並看到此服務是UP狀態並且對於前端的需求均回應200 OK的狀態。
docker logs -f` 013a7b4a9241
使用docker port
來查看當前映射的連接埠配置外也可查看到綁定位址
前面如果沒有特別指定是用-P而反之-p
則可指定要映射的連接埠,並且在一個指定連接埠上只可綁定一個容器。
支援寫法如下:
映射到指定位址的指定連接埠
映射到指定位址的任意連接埠