文章目錄
- 1. Docker 基礎網絡介紹
-
- 1.1 外部通路容器
-
- 1.1.1 映射所有端口位址
- 1.1.2 映射到指定位址的指定端口
- 1.1.3 映射到指定位址的任意端口
- 1.1.4 檢視映射端口配置
- 1.2 容器互聯
-
- 1.2.1 建立網絡
- 1.2.2 連接配接容器
- 1.2.3 配置 DNS
- 2. 進階網絡配置
-
- 2.1 快速配置指南
- 2.2 容器通路控制
-
- 2.2.1 容器通路外部網絡
- 2.2.2 容器之間通路
- 2.2.3 通路所有端口
- 2.2.4 通路指定端口
- 2.3 映射容器端口到宿主主機的實作
-
- 2.3.1 容器通路外部實作
- 2.3.2 外部通路容器實作
- 2.3.3 通路所有端口
- 2.3.4 通路指定端口
- 2.4 自定義網橋
-
- 2.4.1 容器通路外部實作
- 2.4.2 外部通路容器實作
- 2.4.3 通路所有端口
- 2.4.4 通路指定端口
- 2.5 工具和示例
-
- 2.4.1 容器通路外部實作
- 2.4.2 外部通路容器實作
- 2.4.3 通路所有端口
- 2.4.4 通路指定端口
- 2.6 編輯網絡配置檔案
- 2.7 執行個體:建立一個點到點連接配接
Docker
允許通過外部通路容器或容器互聯的方式來提供網絡服務。
1. Docker 基礎網絡介紹
1.1 外部通路容器
當使用
-P
标記時,
Docker
會
随機映射
一個端口到内部容器開放的網絡端口。
使用
docker container ls
可以看到,本地主機的
49154
被映射到了容器的
80
端口。此時通路本機的
49154
端口(本機通路
http://localhost:49154
)即可通路容器内
nginx
預設頁面。

通路之後,可以通過
docker logs continerID
檢視通路日志:
-p
則可以指定要映射的端口,并且,在一個指定端口上隻可以綁定一個容器。支援的格式有:
-
ip:hostPort:containerPort
-
ip::containerPort
-
hostPort:containerPort
示例如下:
通路:
http://localhost:4172
檢視日志:
1.1.1 映射所有端口位址
使用
hostPort:containerPort
格式本地的
80
端口映射到容器的
80
端口,可以執行:
docker run -d -p 80:80 nginx:alpine
此時預設會綁定本地所有接口上的所有位址。通路:
http://localhost
即可看到
nginx
頁面。
1.1.2 映射到指定位址的指定端口
可以使用
ip:hostPort:containerPort
格式指定映射使用一個特定位址,比如
localhost
位址
127.0.0.1
docker run -d -p 127.0.0.1:80:80 nginx:alpine
1.1.3 映射到指定位址的任意端口
使用
ip::containerPort
綁定
localhost
的任意端口到容器的
80
端口,本地主機會
自動配置設定
一個端口。
docker run -d -p 127.0.0.1::80 nginx:alpine
還可以使用
udp
标記來指定
udp
端口
docker run -d -p 127.0.0.1:80:80/udp nginx:alpine
1.1.4 檢視映射端口配置
使用
docker port containerID portID
來檢視目前映射的端口配置,也可以檢視到綁定的位址
docker port 1aae 80
127.0.0.1:12500
注意:
- 容器有自己的内部網絡和
位址(使用ip
檢視,docker inspect
還可以有一個可變的網絡配置。)Docker
-
标記可以多次使用來綁定多個端口-p
例如
$ docker run -d \
-p 80:80 \
-p 443:443 \
nginx:alpine
1.2 容器互聯
如果你之前有
Docker
使用經驗,你可能已經習慣了使用
--link
參數來進行容器互聯。
然而,随着
Docker
網絡的完善,這種方式已不是最優政策,強烈建議大家将容器加入自定義的
Docker
網絡來連接配接多個容器,而不是使用
--link
參數。
1.2.1 建立網絡
首先,我們來建立一個
Docker
網絡:
docker network create -d bridge dnet
-d
參數用來指定
Docker
網絡類型,有
bridge
和
overlay
兩種,其中
overlay
網絡類型用于 Swarm mode,這裡我們先忽略此概念。
1.2.2 連接配接容器
運作一個容器并連接配接到建立的
dnet
網絡:
docker run -it --rm --name busybox1 --network dnet busybox sh
打開新的終端,再運作一個容器并加入到
dnet
網絡:
docker run -it --rm --name busybox2 --network dnet busybox sh
再打開一個新的終端檢視容器資訊:
下面通過
ping
來證明
busybox1
容器和
busybox2
容器建立了互聯關系。
在
busybox1
容器輸入以下指令:
/ # ping busybox2
截圖如下:
用
ping
來測試連接配接
busybox2
容器,它會解析成
172.18.0.3
。
同理,在
busybox2
容器執行
ping busybox1
容器,也可以成功連接配接。
這就證明,
busybox1
容器和
busybox2
容器建立了互聯關系。可以看到,這種
Docker
網絡建構的方式非常簡單。
ps:
如果你有多個容器之間需要互相連接配接,推薦使用
Docker Compose
。
1.2.3 配置 DNS
如何自定義配置容器的主機名和
DNS
呢?秘訣就是
Docker
利用虛拟檔案來挂載容器的 3 個相關配置檔案。
在 容器 中使用
mount
指令可以看到挂載資訊:
未找到相應檔案和路徑,此處暫時略過
2. 進階網絡配置
當
Docker
啟動時,會自動在主機上建立一個
docker0
虛拟網橋,實際上是
Linux
的一個
bridge
,可以了解為一個軟體交換機。它會在挂載到它的網口之間進行轉發。
同時,
Docker
随機配置設定一個本地未占用的私有網段(在 RFC1918中定義)中的一個位址給
docker0
接口。比如典型的
172.17.42.1
,掩碼為
255.255.0.0
。此後啟動的容器内的網口也會自動配置設定一個同一網段(
172.17.0.0/16
)的位址。
當建立一個
Docker
容器的時候,同時會建立了一對
veth pair
接口(當資料包發送到一個接口時,另外一個接口也可以收到相同的資料包)。這對接口一端在容器内,即
eth0
;另一端在本地并被挂載到
docker0
網橋,名稱以
veth
開頭(例如
vethAQI2QT
)。通過這種方式,主機可以跟容器通信,容器之間也可以互相通信。
Docker
就建立了在主機和所有容器之間一個虛拟共享網絡。
2.1 快速配置指南
Docker
網絡相關指令清單:
部分指令選項隻有在
Docker
服務啟動的時候才能配置,而且不能馬上生效。
- -b BRIDGE 或 --bridge=BRIDGE 指定容器挂載的網橋
- –bip=CIDR 定制 docker0 的掩碼
- -H SOCKET… 或 --host=SOCKET… Docker 服務端接收指令的通道
- –icc=true|false 是否支援容器之間進行通信
- –ip-forward=true|false 請看下文容器之間的通信
- –iptables=true|false 是否允許 Docker 添加 iptables 規則
- –mtu=BYTES 容器網絡中的 MTU
2.2 容器通路控制
容器的通路控制,主要通過
Linux
上的
iptables
防火牆來進行管理和實作。
iptables
是
Linux
上預設的防火牆軟體,在大部分發行版中都自帶。
2.2.1 容器通路外部網絡
容器要想通路外部網絡,需要本地系統的轉發支援。在Linux 系統中,檢查轉發是否打開。
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果為 0,說明沒有開啟轉發,則需要手動打開。
如果在啟動
Docker
服務的時候設定
--ip-forward=true
,
Docker
就會自動設定系統的
ip_forward
參數為 1
2.2.2 容器之間通路
容器之間互相通路,需要兩方面的支援。
- 容器的網絡拓撲是否已經互聯。預設情況下,所有容器都會被連接配接到
網橋上。docker0
- 本地系統的防火牆軟體
是否允許通過-- iptables
2.2.3 通路所有端口
當啟動
Docker
服務(即
dockerd
)的時候,預設會添加一條轉發政策到本地主機
iptables
的
FORWARD
鍊上。政策為通過(
ACCEPT
)還是禁止(
DROP
)取決于配置
--icc=true
(預設值)還是
--icc=false
。當然,如果手動指定
--iptables=false
則不會添加
iptables
規則。
可見,預設情況下,不同容器之間是允許網絡互通的。如果為了安全考慮,可以在
/etc/docker/daemon.json ( WSL2 : ~/.docker/.daemon.json)
檔案中配置
{"icc": false}
來禁止它。
2.2.4 通路指定端口
通過
-icc=false
關閉網絡通路後,還可以通過
--link=CONTAINER_NAME:ALIAS
選項來通路容器的開放端口。
例如,在啟動
Docker
服務時,可以同時使用
icc=false --iptables=true
參數來關閉允許互相的網絡通路,并讓
Docker
可以修改系統中的
iptables
規則。
此時,系統中的
iptables
規則可能是類似
下邊省略的太多了,進行不下去了