容器技術具備了隔離性,若要與其他容器或是外部網路存取的話,那便需要一個虛擬的網路環境。docker 運用 Network Namespace 的方式,替每一個容器建立獨立的環境,與宿主主機是完全隔離的。
Network Namespace 可以提供獨立的網路設備、IP路由表、連接埠通訊端...等支援。所以執行於 Network Namespace 下的應用程式,就如同有獨立的網路硬體和設定。
預設情況下,docker 啟動時會在伺服器上架設一個名為 docker0 的橋接器,並透過其內的 veth 跟每一個容器內的 eth0 相連接。如此一來便實現了容器和外部網路存取的可能,以及容器間彼此間的通訊。因為容器間會存在於同一個子網路中。
輸入 sudo docker inspect <container id or name>
就可以查詢。結果是位在 NetworkSettings 的欄位中。
{
"NetworkSettings": {
"Bridge": "",
"SandboxID": "ded74f4bfdb7a6fe7f22ff7ccb37835fe7def71b95c087562f69bcfe48a3b071",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"443/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "443"
},
{
"HostIp": "::",
"HostPort": "443"
}
],
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "80"
},
{
"HostIp": "::",
"HostPort": "80"
}
]
}
}
sudo docker run -d -P <container ID or name>
-P 是一種隨機的連結策略,若你不想要如此的話,也可以自行指定sudo docker run -d -p 80:80 -p 116.22.3.106:443:443 <container ID or name>
-p 需要一對對的輸入,結構為 <限制特定IP?>:<宿主port?>:<容器port>-p 116.22.3.106:443:443
代表的意思為:限制由 116.22.3.106 來源的請求,以 443 port 存取 docker 的 443 port
# 建立一個 web 容器,允許其和 mysql 和 nginx 服務相連接
sudo docker run -d -p 80:80 -p 443:443 --name web --link mysql nginx
容器間的通訊僅需要告知容器名稱,並不用告知連接埠和映射。這樣便能確保容器內的連接埠僅應用於容器間,不會對外暴露於外網。
接下來的幾篇,會從作業系統安裝 docker 開始,一步步地加上 nginx 服務、 https 設定,然後進入 matomo, mautic ...等開源軟體安裝。