一、Docker 容器的網絡模式
????????當項目大規模使用 Docker 時,容器通信的問題也就產生了。要解決容器通信問題,必須先了解很多關于網絡的知識。Docker 的網絡模式非常豐富,可以滿足不同容器的通信要求,下表列出了這些網絡模式的主要信息
網絡模式 | 創建此種網絡模式的關鍵選項 | 簡單說明 |
---|---|---|
host 模式 | --network host | 容器直接使用宿主機的網絡棧,沒有獨立的網絡命名空間,網絡性能高,但容器與宿主機共享網絡資源,易出現端口沖突 |
container 模式 | --network container:<已有容器名或 ID> | 新容器共享指定已有容器的網絡命名空間,兩個容器網絡配置相同,適用于需要緊密耦合通信的容器組合 |
none 模式 | --network none | 容器僅有一個 lo 回環接口,無任何外部網絡連接,適用于對網絡安全性要求極高或需手動配置網絡的場景 |
bridge 模式 | 默認模式,可通過 -d bridge 手動指定(一般省略) | Docker 默認網絡模式,創建 docker0 虛擬網橋,容器通過 veth 設備連到該網橋,容器有獨立 IP,借助主機 NAT 訪問外部網絡 |
Overlay 模式 | -d overlay | 用于 Docker Swarm 集群,基于 VXLAN 技術創建跨主機的虛擬覆蓋網絡,實現不同宿主機上容器間的通信 |
macvlan 模式 | -d macvlan,還需指定 --subnet、--gateway 和 -o parent=<宿主機物理網卡> | 為容器分配唯一 MAC 地址,使其像獨立物理設備,直接連接宿主機物理網絡接口,繞過 docker0 網橋,提高網絡性能 |
自定義網絡模式 | docker network create 結合如 --subnet、--gateway、--ip-range 等參數 | 用戶可根據需求靈活配置網絡參數,如子網、網關、IP 范圍等,創建符合特定要求的網絡 |
1、查看網絡
docker network ls
2、bridge模式
橋接模式(Bridge)
特點:容器通過宿主機的網橋(docker0)與外界通信,默認分配獨立 IP。
優點:隔離性好,適合多數場景。
缺點:需要 NAT 轉發,性能略低;端口需手動管理避免沖突。
特性 | 描述 |
---|---|
網絡隔離 | 每個容器擁有獨立的網絡命名空間(IP、端口、路由表)。 |
核心組件 | - 虛擬網卡對(veth pair):連接容器與宿主機。 - 網橋(docker0):宿主機上的虛擬交換機。 |
通信機制 | - 容器內流量通過 veth pair 到達 docker0。 - 通過 NAT 轉發訪問外部網絡。 |
IP 分配 | Docker 自動分配私有 IP(默認網段 172.17.0.0/16)。 |
端口映射 | 通過?-p ?或?-P ?參數將容器端口映射到宿主機。 |
數據流向 | 容器 → veth pair → docker0 → 宿主機網卡 → 外部網絡。 |
創建
#創建
docker network create -d bridge aaa
刪除
#刪除
docker network rm my-net
運行容器連接到該網絡
docker run -itd --rm --name zhangsan --network aaa busybox sh -c "top"docker run -itd --rm --name lisi --net=aaa busybox sh -c "top"
運行一個容器加入到該網絡
docker run -it --rm --name wangwu --net=aaa busybox sh
3、host模式
主機模式(Host)
特點:容器直接使用宿主機網絡,無獨立 IP 和端口空間。
優點:性能最佳,適合對網絡延遲敏感的應用。
缺點:容器間、容器與宿主機共享端口,需手動避免沖突。
特性 | 描述 |
---|---|
網絡隔離 | 容器直接使用宿主機的網絡命名空間,無隔離。 |
核心組件 | 共享宿主機的網卡、IP、端口、路由表等。 |
通信機制 | 容器內應用直接通過宿主機網絡接口通信,無需 NAT 轉發。 |
端口管理 | 容器暴露的端口直接占用宿主機端口,需手動避免沖突。 |
性能優勢 | 消除網絡虛擬化開銷,性能接近原生應用。 |
數據流向 | 容器 → 宿主機網卡 → 外部網絡。 |
運行容器連接到該網絡
docker run -itd --net=host --name host1 busybox sh
docker exec -it host1 shifconfig
4、container模式
容器模式(Container)
特點:容器共享另一個容器的網絡棧,IP 和端口完全相同。
適用場景:緊密耦合的應用(如 sidecar 模式)
特性 | 描述 |
---|---|
網絡隔離 | 多個容器共享同一個網絡命名空間(IP、端口、路由表)。 |
核心組件 | - 基礎容器(Base Container):提供網絡棧。 - 共享容器:加入基礎容器的網絡命名空間。 |
通信機制 | 容器間通過?localhost?直接通信,無需網絡開銷。 |
典型場景 | - Sidecar 模式(如主應用與日志收集器)。 - 容器間高性能通信。 |
數據流向 | 容器 A → 共享網絡棧 → 容器 B。 |
創建并啟動一個容器
docker run -itd --name AAA busybox
創建容器時指定模式為container并加入AAA這個命名空間中
docker run -itd --net=container:AAA --name aaaaaa busybox
兩個容器的IP一致
5、none模式
無網絡模式(None)
特點:容器僅有 loopback 接口,無外部網絡連接。
適用場景:純離線計算或數據處理任務。
特性 | 描述 |
---|---|
網絡隔離 | 容器僅有 loopback 接口(127.0.0.1),無外部網絡連接。 |
核心組件 | 空網絡命名空間,無虛擬網卡或網橋。 |
適用場景 | - 純離線計算任務。 - 敏感數據處理(需完全隔離)。 |
通信限制 | 無法與外部網絡或其他容器通信,僅支持容器內部進程間通信。 |
docker network lsdocker run -itd --net=none --name libai busybox shdocker exec -it libai sh
6、macvlan模式
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=ens160 -o macvlan_mode=bridge macvlan111docker network lsdocker run -itd --net=macvlan111 --name lihei busybox shdocker exec -it lihei shifconfig# 創建一個名為macvlan111的macvlan網絡
# -d macvlan:指定網絡驅動為macvlan
# --subnet=192.168.1.0/24:設置子網為192.168.1.0,子網掩碼為255.255.255.0
# --gateway=192.168.1.1:設置網關為192.168.1.1
# -o parent=ens160:指定物理網卡為ens160
# -o macvlan_mode=bridge:設置macvlan模式為橋接模式
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=ens160 -o macvlan_mode=bridge macvlan111# 列出所有Docker網絡,驗證macvlan111網絡是否創建成功
docker network ls# 運行一個名為lihei的busybox容器
# -itd:交互式運行并在后臺保持容器運行
# --net=macvlan111:將容器連接到macvlan111網絡
# --name lihei:指定容器名稱為lihei
# busybox sh:使用busybox鏡像并執行sh shell
docker run -itd --net=macvlan111 --name lihei busybox sh# 進入lihei容器的交互式shell
docker exec -it lihei sh# 在容器內部執行ifconfig命令,查看網絡接口配置
ifconfig
7、自定義模式
特點:基于 Bridge 或 Overlay 創建自定義網絡,支持 DNS 自動解析。
優點:靈活配置網絡策略,推薦生產環境使用
特性 | 描述 |
---|---|
網絡隔離 | 基于用戶定義的網橋或 overlay 網絡,支持多子網隔離。 |
核心組件 | - 自定義網橋(如?docker network create my-net )。- DNS 服務:自動解析容器名到 IP。 |
通信機制 | - 同一網絡內容器通過容器名直接通信。 - 跨網絡通信需路由或端口映射。 |
IP 管理 | 通過 IPAM(IP Address Management)自動分配唯一 IP。 |
高級特性 | - 支持網絡策略(如防火墻規則)。 - 跨主機 overlay 網絡(VXLAN/GRE)。 |
數據流向 | 容器 → 自定義網橋 → 宿主機網卡 → 外部網絡。 |
docker network create --subnet=172.100.0.0/16 --gateway=172.100.0.1 dufu
docker network ls
docker run -itd --name songjiang --net=dufu busybox
docker run -itd --name linchong --net=dufu busybox
docker ps -a
docker exec -it songjiang sh
ping linchong
二、端口映射
????????Docker 是一個開源的容器化平臺,用于構建、運行和管理應用程序。它使用容器來打包應用程序及其依賴項,使得應用程序可以在不同的環境中快速、可靠地運行。在 Docker 中,端口映射是一個重要的特性,它允許容器內部的應用程序與宿主機進行通信。
????????Docker 的端口映射使用 -p 或 --publish 選項來實現。通過該選項,可以將容器內部的端口映射到宿主機上的某個端口。這樣,容器內部的應用程序可以通過宿主機的端口來訪問外部的網絡或服務。宿主機上的端口號,表示容器內部的端口號。通過指定這兩個端口號,Docker 會將容器內部的端口映射到宿主機的端口上。
1:端口映射
(1)-P(大寫):指的是容器應用 PORT 隨機映射到宿主機上的 PORT
- 自動綁定所有對外提供服務的容器端口,映射的端口將會從沒有使用的端口池中自動隨機選擇。但是如果連續啟動多個容器的話,則下一個容器的端口默認是當前容器占用端口號 +1。
- 生產場景一般不使用隨機映射,好處是由 docker 分配,宿主機端口不會沖突。
(2)-p(小寫):(宿主機 PORT: 容器 PORT)
- 宿主機 IP 不寫表示 “0.0.0.0”,宿主機 PORT 不寫表示隨機端口,容器 PORT 必須指定,可以同時對多個端口進行映射綁定。
- 指定端口映射,在標準化場景下使用頻率高。
- 端口的取值范圍 32768--61000 之間
2、隨機映射
docker run --rm -d -P nginxdocker ps -acurl 192.168.10.101:32768
宿主機隨機映射
docker run --rm -d -p 80 nginx
docker ps -a
3、指定映射
docker run --rm -d -p 8080:80 nginx
docker ps -a
三、持久化
1:什么是數據卷
數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過了容器的文件系統,直接將宿主機上的目錄或文件掛載到容器內部。這意味著即使容器被刪除,數據卷中的數據也不會丟失,從而實現了數據的持久化存儲。
2:數據卷的作用
?數據持久化
????????容器的生命周期可能是短暫的,當容器被刪除時,其內部文件系統中的數據也會隨之消失。而數據卷可以將數據存儲在宿主機上,確保數據不會因為容器的刪除而丟失。
數據共享
????????多個容器可以同時掛載同一個數據卷,從而實現容器之間的數據共享。這對于需要共享配置文件、日志文件或其他數據的應用場景非常有用。
數據備份和恢復
????????由于數據卷中的數據存儲在宿主機上,因此可以方便地進行備份和恢復操作。
分離數據和應用
????????將數據存儲在數據卷中,可以使容器的鏡像更加輕量級,只包含應用程序本身,而將數據分離出來,提高了容器的可移植性和可維護性。
3、匿名
docker run -itd -v /data1 -v /data2 --name web01 centos:7docker ps -adocker exec -it web01 /bin/bashcd /data1touch aaacd /data2touch bbbexit
cd /var/lib/docker/volumes/
cd 0cb20dc1253c4a323eaad507d1c1d26ab1c365eb053e5002456be259657d5fec/_data
ls
4、具名
docker volume create my_volumedocker run -itd -v my_volume:/data --name web02 centos:7docker exec -it web02 /bin/bashcd datatouch AAAAAAAexit
cd /var/lib/docker/volumes/_data/
ls
5、共享容器數據卷
創建掛載點
mkdir -p /www/html
mkdir -p /www/conf
mkdir -p /www/log
準備數據
配置文件
vim /www/conf/nginx.conf###編輯內容###
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root /www/html;index index.html index.htm index.php;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root /www/html;# fastcgi_pass php01:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi.conf;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}
daemon off;
網頁文件
echo "KGC" > /www/html/index.html
創建容器
docker run -d -p 9999:80 -v /www/conf/nginx.conf:/etc/nginx/nginx.conf -v /www/html:/www/html -v /www/log:/var/log/nginx --name web999 nginx /bin/bash -c "nginx"docker ps -a
訪問測試
curl 192.168.10.101:9999
cat /www/log/access.log