目錄
第一節:容器通信技術
一:Docker 容器的網絡模式
1:Bridge模式
2:Host模式
3:Container模式
4:None模式
5:Overlay 模式
6:Macvlan 模式
7:自定義網絡模式
二:端口映射
關鍵對比
三:容器互聯
關鍵對比
四:容器間通信實現案例
1. 網絡創建選項
2. 容器通信實現步驟
3. 通信方式對比
第二節:數據持久化技術
一:Docker的數據管理
1. 數據卷核心概念
2. 數據卷核心作用
3. 數據卷操作命令
4. 數據卷類型對比
二:Docker數據管理注意事項
關鍵對比:數據卷類型選擇
第一節:容器通信技術
一:Docker 容器的網絡模式
? ? ? ? 當項目大規模使用 Docker 時,容器通信的問題也就產生了。要解決容器通信問題,必須先了解很多關于網絡的知識。Docker 的網絡模式非常豐富,可以滿足不同容器的通信要求,下表列出了這些網絡模式的主要信息。
網絡模式 | 創建方式 | 特點說明 |
---|---|---|
host 模式 | --network host | 容器直接使用宿主機網絡棧,無獨立網絡命名空間,性能高但易端口沖突 |
container 模式 | --network container:<已有容器名或ID> | 新容器共享指定容器的網絡命名空間,適用于需要緊密耦合通信的容器組合 |
none 模式 | --network none | 容器僅有lo回環接口,無外部網絡連接,適合高安全性需求或手動配置網絡場景 |
bridge 模式 | 默認模式,可通過-d bridge 手動指定(通常省略) | Docker默認模式,通過docker0虛擬網橋連接容器,有獨立IP,通過NAT訪問外網 |
Overlay 模式 | -d overlay | 用于Docker Swarm集群,基于VXLAN技術實現跨主機容器通信 |
macvlan 模式 | -d macvlan ,需指定--subnet 、--gateway 和--o parent=<物理網卡> | 為容器分配唯一MAC地址,直接連接物理網絡接口,繞過docker0網橋,性能高 |
自定義網絡 | docker network create 配合--subnet 、--gateway 等參數 | 用戶可靈活配置子網、網關、IP范圍等參數,創建符合特定需求的網絡 |
1:Bridge模式
特性 | 說明 |
---|---|
默認網絡模式 | Docker 安裝后自動創建?docker0 ?虛擬網橋,新容器默認連接到此網橋。 |
IP 分配 | Docker 從預定義的子網中為每個容器分配唯一 IP 地址。 |
容器間通信 | 通過?docker0 ?網橋實現同一宿主機上的容器間通信。 |
外部網絡訪問 | 宿主機通過?NAT(網絡地址轉換)?將容器私有 IP 轉換為宿主機公網 IP 進行通信。 |
適用場景 | 適用于大多數單機容器場景,提供網絡隔離,同時支持外部訪問。 |
優點 | - 默認配置,簡單易用 - 提供網絡隔離,避免端口沖突 - 支持 NAT 訪問外網 |
缺點 | - 相比?host ?或?macvlan ?模式,網絡性能稍低- 跨主機通信需要額外配置 |
bridge 模式是 docker 的默認網絡模式,不寫 --net 參數,就是 bridge 模式。使用 docker run -p 時,docker 實際是在 iptables 做了 DNAT 規則,實現端口轉發功能。可以使用 iptables -t nat -vnL 查看。bridge 模式如下圖所示:
如果你之前有 Docker 使用經驗,你可能已經習慣了使用 --link 參數來使容器互聯。
隨著 Docker 網絡的完善,強烈建議大家將容器加入自定義的 Docker 網絡來連接多個容器,而不是使用 --link 參數。
創建一個叫 my-net 的 bridge 類型的網絡
?
[root@bogon ~]# docker network create -d bridge my-net
查看都有哪些網絡
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8cd27b16846c bridge bridge local
8095f54e4dee host host local
2171fab71098 my-net bridge local
be41d33662a5 none null local
?運行一個容器并連接到新建的?my-net
?網絡
[root@bogon ~]# docker run -itd --rm --name busybox1 --network my-net busybox sh -c 'while true;do echo hello;done'
f7614de88f1eabf174de8c4679e4f5407bf1c5fbb4c2932a5f8327ecaea4978
?運行一個容器并加入到?my-net
?網絡
/ # ping busybox1
這樣,busybox1
?容器和?busybox2
?容器建立了互聯關系,如果你有多個容器之間需要互相連接,推薦使用?Docker Compose
。
2:Host模式
特性 | 說明 |
---|---|
網絡模式 | 容器直接使用宿主機的網絡棧,無獨立網絡命名空間。 |
IP 地址 | 容器與宿主機共享 IP 地址,無獨立 IP。 |
端口管理 | 容器直接使用宿主機端口,可能導致端口沖突。 |
網絡性能 | 高性能(無 NAT 或網橋轉發開銷)。 |
隔離性 | 低隔離性(容器與宿主機網絡環境完全共享)。 |
適用場景 | 適用于需要極致網絡性能且不擔心端口沖突的場景(如性能測試、本地開發)。 |
優點 | - 網絡延遲低,吞吐量高 - 無需額外配置端口映射 |
缺點 | - 無網絡隔離,安全性較低 - 多個容器可能因端口沖突無法共存 |
如果啟動容器的時候使用 host 模式,那么這個容器將不會獲得一個獨立的 Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬出自己的網卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。Host
模式如下圖所示:
[root@bogon ~]# docker run -tid --net=host --name docker_host1 busybox
由于使用了?Host
?模式,容器會直接使用宿主機的網絡端口,因此可以直接在宿主機上通過?localhost
?訪問容器內的服務,使用?ifconfig
?命令可以看到容器的網絡和宿主機的是一致的。
[root@bogon ~]# docker exec -it docker_host1 sh
/ # ifconfig
3:Container模式
特性 | 說明 |
---|---|
網絡模式 | 新容器共享指定容器的網絡命名空間(IP、端口、網絡接口等完全一致)。 |
IP 地址 | 與目標容器使用相同 IP 和端口,無法獨立分配。 |
通信方式 | 容器間直接通過?localhost ?或共享網絡棧通信,無需經過 NAT 或網橋。 |
網絡性能 | 高性能(無額外網絡開銷,類似?host ?模式但限定共享范圍)。 |
隔離性 | 低隔離性(共享網絡棧的容器間無網絡隔離)。 |
適用場景 | 適用于緊密耦合的容器組(如主應用 + Sidecar 日志/監控容器)。 |
優點 | - 容器間通信零延遲 - 無需配置端口映射或服務發現 - 資源占用少 |
缺點 | - 共享網絡的容器不能綁定相同端口 - 調試復雜(網絡行為相互影響) |
這個模式指定新創建的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。Container 模式示意圖:
[root@bogon ~]# docker run -tid --name host1 busybox
# 創建 host2 容器共享 host1 容器的網絡
[root@bogon ~]# docker run -itd --net=container:host1 --name host2 busybox
# 查詢 host1 容器的網絡
[root@bogon ~]# docker exec -it host1 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
# 查看 host2 容器的網絡,確認和 host1 容器的網絡一致
[root@bogon ~]# docker exec -it host2 ifconfig
4:None模式
特性 | 說明 |
---|---|
網絡模式 | 容器僅擁有?lo ?回環接口,無任何外部網絡連接。 |
IP 地址 | 無外部 IP,完全隔離。 |
網絡功能 | 默認無法與宿主機、其他容器或外網通信,需手動配置網絡(如添加?veth ?設備)。 |
安全性 | 最高隔離性,適用于對網絡安全要求極高的場景。 |
適用場景 | - 安全敏感型應用(如審計、加密服務) - 需完全自定義網絡的特殊場景 |
優點 | - 絕對網絡隔離,避免攻擊面 - 完全自主控制網絡配置 |
缺點 | - 無默認網絡功能,需手動配置 - 不適合需要常規通信的容器 |
使用 none 模式,Docker 容器擁有自己的 Network Namespace,但是,并不為 Docker 容器進行任何網絡配置。也就是說,這個 Docker 容器沒有網卡、IP、路由等信息。需要我們自己為 Docker 容器添加網卡、配置 IP 等。None 模式示意圖:
[root@bogon ~]# docker run -itd --net=none --name none01 busybox sh
c7805a0df84bdfb370c106b24eaba173abd4fcee6ee689eade46191015548a
[root@bogon ~]# docker exec -it none01 sh
/ # ifconfig
lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
5:Overlay 模式
Overlay 模式主要用于 Docker Swarm 集群,它允許容器在不同的 Docker 宿主機之間進行通信。它基于 VXLAN(Virtual eXtensible Local Area Network)技術,在物理網絡之上創建一個虛擬的覆蓋網絡。
當容器之間進行通信時,數據包會被封裝在 VXLAN 報頭中,通過物理網絡進行傳輸。在接收端,VXLAN 報頭會被解封裝,還原出原始的數據包。
Overlay 網絡是分布式的,每個 Docker 宿主機上都有一個網絡代理(如 Docker 的 docker_gwbridge)負責管理和轉發數據包。
# 在 Docker Swarm 集群中創建一個 Overlay 網絡
docker network create -d overlay my_overlay_network
# 在不同的宿主機上創建服務并連接到 Overlay 網絡
docker service create --name my_service --network my_overlay_network nginx
6:Macvlan 模式
在 Macvlan 模式下,Docker 為每個容器分配一個唯一的 MAC 地址,使得容器在網絡中看起來像一個獨立的物理設備。
容器直接連接到宿主機的物理網絡接口,繞過了 docker0 網橋,從而提高了網絡性能。容器可以直接與外部網絡進行通信,就像一個獨立的主機一樣。
每個容器都有自己獨立的網絡配置,與宿主機和其他容器之間相互隔離。
# 創建一個 Macvlan 網絡
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my_macvlan_network
# 創建一個使用 Macvlan 網絡的容器
docker run -d --name my_macvlan_container --network my_macvlan_network nginx
7:自定義網絡模式
除了上述內置的網絡模式,你還可以使用 docker network create 命令創建自定義的 bridge 網絡,以滿足特定的網絡需求,例如指定子網、網關、IP 范圍等。
使用如下命令創建一個自定義網絡
docker network create \
--subnet=172.21.0.0/16 \
--gateway=172.21.0.1 \
my_custom_network
此命令的主要目的是創建一個新的 Docker 網絡,這個網絡可以用于容器之間的通信。默認情況下,創建的是一個基于 bridge 驅動的網絡。
參數/選項 | 說明 | 示例值 | 作用 |
---|---|---|---|
docker network create | Docker 創建網絡的基礎命令 | - | 用于創建自定義 Docker 網絡 |
--subnet | 指定網絡的子網范圍(CIDR 格式) | 172.21.0.0/16 | 定義容器的 IP 分配范圍(示例中可用 IP:172.21.0.1 ~ 172.21.255.254) |
--gateway | 設置網絡的網關地址(必須是子網內的有效 IP) | 172.21.0.1 | 容器通過該網關訪問外部網絡(類似路由器的功能) |
<network_name> | 自定義網絡的名稱 | my_custom_network | 創建容器時通過名稱連接到此網絡(如?--network=my_custom_network ) |
創建一個新的容器并加入這個自定義網絡
docker run -d --name my_container --network my_custom_network nginx
二:端口映射
特性 | 說明 | 命令示例 | 適用場景 |
---|---|---|---|
隨機映射(-P 大寫) | 自動將容器內?EXPOSE ?聲明的所有端口隨機映射到宿主機的高端口(32768-61000) | docker run -d -P nginx | 快速測試,避免手動指定端口沖突 |
指定映射(-p 小寫) | 手動指定宿主機端口與容器端口的映射關系 | docker run -d -p 8080:80 nginx (宿主機8080 → 容器80) | 生產環境標準化部署,需固定端口 |
宿主機隨機端口 | 僅指定容器端口,宿主機端口由 Docker 自動分配 | docker run -d -p 80 nginx (容器80 → 宿主機隨機端口如32769) | 需要暴露容器端口但不關心宿主機具體端口 |
多端口映射 | 同時映射多個端口 | docker run -d -p 8080:80 -p 443:443 nginx | 需暴露多個服務的場景(如HTTP+HTTPS) |
綁定特定IP | 限制端口映射僅對指定宿主機IP生效 | docker run -d -p 192.168.1.100:8080:80 nginx | 增強安全性,僅允許特定網絡接口訪問 |
協議指定 | 顯式聲明端口協議(TCP/UDP) | docker run -d -p 8080:80/tcp -p 53:53/udp nginx | 需區分協議的場景(如DNS服務用UDP) |
--rm 選項 | 容器停止后自動刪除 | docker run --rm -d -p 8080:80 nginx | 臨時測試,避免殘留容器 |
關鍵對比
對比項 | -P(大寫) | -p(小寫) |
---|---|---|
端口分配 | Docker 自動隨機選擇(32768-61000) | 用戶手動指定或部分隨機 |
映射范圍 | 容器內所有?EXPOSE ?端口 | 僅映射命令行中指定的端口 |
使用場景 | 快速測試、臨時環境 | 生產環境、需精確控制端口的場景 |
注意事項
-
端口沖突:宿主機端口若被占用,容器會啟動失敗(錯誤提示?
Bind for 0.0.0.0:8080 failed
)。 -
防火墻:確保宿主機防火墻(如?
firewalld
/iptables
)放行映射的端口。 -
安全建議:
-
生產環境避免使用隨機端口(
-P
)。 -
限制IP綁定(如?
-p 127.0.0.1:8080:80
)以減少暴露面。
-
三:容器互聯
特性 | 說明 | 命令示例 | 適用場景 |
---|---|---|---|
--link ?方式 | 通過別名連接容器(已逐漸被棄用) | docker run -dit --name web02 --link web01:myweb01 centos:7 | 舊版本 Docker 兼容場景 |
自定義網絡方式 | 創建自定義網絡,容器加入同一網絡即可互聯(推薦方式) | docker network create mynet docker run -dit --network=mynet --name web01 centos:7 docker run -dit --network=mynet --name web02 centos:7 | 生產環境,需靈活管理容器通信 |
DNS 自動解析 | 同一自定義網絡內的容器可通過容器名直接通信 | 在?web02 ?中直接執行?ping web01 | 替代?--link ,無需手動配置別名 |
/etc/hosts ?注入 | --link ?會在目標容器的?/etc/hosts ?中寫入源容器 IP 和別名 | cat /etc/hosts ?顯示?172.17.0.2 myweb01 | 調試或兼容舊應用 |
隔離性 | 默認?bridge ?網絡隔離容器;自定義網絡提供可控的互聯 | - | 需平衡隔離與通信需求的場景 |
安全性 | --link ?僅單向通信;自定義網絡支持雙向通信 | - | 需細粒度控制通信權限的場景 |
關鍵對比
對比項 | --link (舊方式) | 自定義網絡(推薦方式) |
---|---|---|
通信方向 | 單向(源→目標) | 雙向 |
配置復雜度 | 需手動指定別名 | 自動通過容器名解析 |
維護性 | 難擴展(容器增多后混亂) | 易管理(天然支持多容器互聯) |
版本兼容性 | 舊版本支持,新版本逐漸棄用 | 所有現代 Docker 版本均支持 |
創建自定義網絡并互聯容器
# 創建網絡
docker network create mynet# 啟動容器并加入同一網絡
docker run -dit --network=mynet --name web01 centos:7
docker run -dit --network=mynet --name web02 centos:7# 測試通信(在 web02 中)
docker exec -it web02 ping web01
--link
?方式(僅作了解)
docker run -dit --name web01 centos:7
docker run -dit --name web02 --link web01:myweb01 centos:7
docker exec -it web02 ping myweb01
注意事項
-
棄用警告:
--link
?可能導致依賴問題,建議遷移到自定義網絡。 -
DNS 優勢:自定義網絡自動提供容器名解析,無需維護?
/etc/hosts
。 -
多網絡支持:一個容器可加入多個網絡,實現復雜拓撲(如隔離后端數據庫與前端服務)。
四:容器間通信實現案例
1. 網絡創建選項
選項 | 說明 | 示例命令 |
---|---|---|
--driver ?/?-d | 指定網絡驅動類型(默認?bridge ) | docker network create -d bridge my_network |
--subnet | 定義網絡的子網范圍(CIDR 格式) | docker network create --subnet=172.18.0.0/16 my_network |
--gateway | 設置網絡的網關 IP(需在子網范圍內) | docker network create --subnet=172.19.0.0/16 --gateway=172.19.0.1 my_network |
--ip-range | 指定容器 IP 的分配范圍(子網的子集) | docker network create --subnet=172.20.0.0/16 --ip-range=172.20.1.0/24 my_network |
--internal | 創建僅限內部通信的網絡(禁止訪問外網) | docker network create --internal my_internal_network |
--attachable | 允許非 Swarm 服務的容器加入網絡 | docker network create --attachable my_attachable_network |
2. 容器通信實現步驟
步驟 | 操作 | 關鍵命令 |
---|---|---|
1. 創建自定義網絡 | 使用?docker network create ?創建網絡 | docker network create my_net |
2. 啟動容器并加入網絡 | 通過?--net ?將容器連接到同一網絡 | docker run -dit --name pc01 --net=my_net centos:7 |
3. 測試通信 | 在同一網絡內的容器可通過容器名直接通信 | docker exec -it pc01 ping pc02 (成功) |
4. 隔離驗證 | 未加入同一網絡的容器無法通信 | docker exec -it pc01 ping web03 (失敗) |
3. 通信方式對比
特性 | --link (舊方式) | 自定義網絡(推薦方式) |
---|---|---|
通信方向 | 單向 | 雙向 |
配置復雜度 | 需手動指定別名 | 自動通過容器名解析 |
擴展性 | 難維護(容器增多后混亂) | 天然支持多容器互聯 |
跨主機支持 | 僅單機 | 支持(結合?overlay ?驅動) |
安全性 | 低(依賴?/etc/hosts ?注入) | 高(隔離網絡 + DNS 解析) |
第二節:數據持久化技術
一:Docker的數據管理
1. 數據卷核心概念
特性 | 說明 |
---|---|
定義 | 繞過容器文件系統,直接掛載宿主機目錄到容器內部的特殊目錄 |
生命周期 | 獨立于容器,刪除容器后數據卷仍保留 |
存儲位置 | 默認位于宿主機?/var/lib/docker/volumes/ ?下,也可綁定到自定義宿主目錄 |
共享性 | 支持多個容器同時掛載同一數據卷 |
2. 數據卷核心作用
作用 | 說明 | 應用場景示例 |
---|---|---|
數據持久化 | 容器刪除后數據仍保留在宿主機 | 數據庫容器(如 MySQL、PostgreSQL) |
數據共享 | 多個容器讀寫同一數據卷 | 共享配置文件、日志文件或靜態資源(如 Nginx 配置) |
備份與恢復 | 直接操作宿主機上的數據卷文件進行備份 | 定期備份數據庫文件到外部存儲 |
分離數據與應用 | 容器鏡像僅包含應用,數據獨立存儲 | 開發環境與生產環境使用相同鏡像,通過不同數據卷加載數據 |
3. 數據卷操作命令
操作 | 命令示例 | 說明 |
---|---|---|
創建數據卷 | docker volume create my_volume | 創建名為?my_volume ?的匿名卷 |
綁定掛載目錄 | docker run -v /宿主機路徑:/容器路徑 nginx | 將宿主機目錄直接掛載到容器(需絕對路徑) |
使用命名卷 | docker run -v my_volume:/容器路徑 nginx | 使用已創建的命名卷 |
查看數據卷列表 | docker volume ls | 列出所有數據卷 |
刪除數據卷 | docker volume rm my_volume | 刪除指定數據卷(需先解除容器掛載) |
4. 數據卷類型對比
類型 | 匿名卷 | 命名卷 | 綁定掛載 |
---|---|---|---|
創建方式 | -v /容器路徑 | docker volume create ?+?-v 卷名:/容器路徑 | -v /宿主機路徑:/容器路徑 |
存儲位置 | Docker 管理(隨機哈希命名) | Docker 管理(用戶自定義名稱) | 用戶指定宿主機目錄 |
可維護性 | 低(依賴容器生命周期) | 高(顯式管理) | 高(直接操作宿主機文件) |
適用場景 | 臨時數據 | 生產環境持久化數據 | 開發調試或需直接修改宿主機文件的場景 |
二:Docker數據管理注意事項
注意事項 | 說明 | 示例/建議 |
---|---|---|
1. 選擇合適的數據卷類型 | 根據場景選擇匿名卷、具名卷或綁定掛載 | -?匿名卷:臨時數據(如編譯緩存) -?具名卷:數據庫持久化(如 MySQL) -?綁定掛載:開發時共享配置文件 |
2. 使用絕對路徑 | 綁定掛載宿主機目錄時必須使用絕對路徑 | -v /home/user/app:/app (正確)-v ./app:/app (錯誤,需絕對路徑) |
3. 定期清理數據卷 | 匿名卷和未使用的具名卷會占用磁盤空間 | docker volume ls (查看)docker volume rm <卷名> (刪除) |
4. 容器內數據持久化 | 關鍵數據必須掛載到數據卷,避免容器刪除后丟失 | MySQL 數據目錄:-v mysql_data:/var/lib/mysql |
5. 數據共享與并發控制 | 多容器掛載同一數據卷時需處理并發問題 | 數據庫容器:應用層加鎖或使用事務 日志文件:使用日志收集工具(如 Fluentd) |
6. 備份與恢復 | 通過操作宿主機上的數據卷文件實現備份 | 備份 MySQL 數據卷:docker run --rm -v mysql_data:/volume -v /backup:/backup alpine tar czf /backup/mysql_backup.tar.gz /volume |
7. 權限管理 | 確保容器內用戶有權限訪問掛載的目錄 | Nginx 容器: 宿主機目錄權限設為? 755 ,用戶組與容器內?www-data ?匹配 |
8. 安全性 | 敏感數據避免直接掛載,使用 Docker Secret 或加密卷 | 配置文件含密碼:docker secret create db_password ./password.txt |
關鍵對比:數據卷類型選擇
類型 | 匿名卷 | 具名卷 | 綁定掛載 |
---|---|---|---|
管理難度 | 難(隨機名稱,易遺留) | 易(自定義名稱,可追溯) | 易(直接操作宿主機文件) |
持久性 | 是(需手動清理) | 是(顯式刪除) | 是(依賴宿主機目錄) |
適用場景 | 臨時數據、測試環境 | 生產環境數據庫、持久化存儲 | 開發調試、配置文件共享 |