1.Docker网络模式简介
Docker提供以下几种内置网络模式:
(1)bridge(默认): 每个容器连接到一个虚拟网桥(docker0),容器之间可通过IP通信,但需要通过-p映射端口到宿主机才能被外部访问。自定义bridge网络支持容器名自动DNS解析。
(2)host: 容器直接使用宿主机的网络栈,没有网络隔离,端口直接暴露在宿主机上,性能最高但安全性较低。
(3)none: 容器无网络,适用于完全自定义网络的场景。
(4)overlay: 用于Swarm集群,跨多个宿主机实现容器间通信。
(5)macvlan: 为容器分配MAC地址,使其像物理设备一样接入网络。
这里暂时介绍bridge,host两种network案例,其他模式以后熟悉再介绍。主流三种network流程图如下:

因为上章节,我已经建立一个Harbor私人仓库,现在分别发布两个不同网络类型的net程序镜象(192.168.1.100:8090/test/jayden-test-webapi-bridge:v1,192.168.1.100:8090/test/jayden-test-webapi-host:v1)到仓库上,方便后续操作:

2. Bridge模式(默认)
2.1. run自定义Bridge模式
(1)创建一个自定义bridge网络(例如:docker_myhost,自动分配IP4与网关):
bash
# 创建一个docker_myhost bridge网络
docker network create --driver bridge docker_myhost
(2)run启动.NET应用容器时加入该网络,并指定容器名(jayden-test-webapi-run-bridge-dev,jayden-test-webapi-run- bridge-pro),如果需要登录仓库才能下载镜象,请输入docker login命令登录:
bash
docker run -d \
--name jayden-test-webapi-run-bridge-dev \ # 容器名字
--restart unless-stopped \ # 除非手動停止,不然一直重啟
--network docker-ha_myhost \ # 自定義網路
# 將宿主機的8000和4330端口映射到容器內的80和433端口
-p 8000:80 \
-p 4430:443 \
-e ASPNETCORE_ENVIRONMENT=Development \ # 配置環境變量
--log-opt max-size=50m \ # 單一Log文檔最大限制為50MB
--log-opt max-file=5 \ # 最多保留5個Log文檔
192.168.1.100:8090/test/jayden-test-webapi-bridge:v1 # Harbor倉庫的镜像
这里启动两个容器jayden-test-webapi-run-bridge-dev(开发环境),jayden-test-webapi-run- bridge-pro(生产环境)同时都加入了docker_myhost网络。如下图所示:


以上就是run自定义Bridge network模式的方式,接下来让我们学习下docker-compose编排如何自定义Bridge network模式。
2.2. docker-compose自定义Bridge模式
(1)可以先创建一个自定义bridge网络,也可以让docker自动生成(自动分配IP4与网关)。如果先创建执行如下命令。这里我选择自动生成(docker默认生成network规则是"project path+custom network name"):
bash
# 创建一个docker-ha_myhost bridge网络
docker network create --driver bridge docker-ha_myhost
创建并编辑docker-compose.yml输入如下内容:
bash
services:
jayden-test-webapi-dev: # 服務名稱
image: 192.168.1.100:8090/test/jayden-test-webapi-bridge:v1 # Harbor倉庫的镜像
container_name: jayden-test-webapi-compose-bridge-dev # 容器名字
restart: unless-stopped # 除非手動停止,不然一直重啟
ports:
# 將宿主機的8000和4330端口映射到容器內的80和433端口
- "8000:80"
- "4330:433"
# 容器內監聽端口(外部不能直接訪問)
expose:
- "80"
- "443"
environment:
- ASPNETCORE_ENVIRONMENT=Development # 配置環境變量
#- ASPNETCORE_URLS=http://+:8000 # .NET監聽所有界面
# 其他環境變量,例如連接字符串:
# - ConnectionStrings__DefaultConnection=...
networks: # 配置環境變量
- myhost
jayden-test-webapi-pro: # 服務名稱
image: 192.168.1.100:8090/test/jayden-test-webapi-bridge:v1 # Harbor倉庫的镜像
container_name: jayden-test-webapi-compose-bridge-pro # 容器名字
restart: unless-stopped # 除非手動停止,不然一直重啟
ports:
# 將宿主機的8000和4330端口映射到容器內的80和433端口
- "8001:80"
- "4331:433"
# 容器內監聽端口(外部不能直接訪問)
expose:
- "80"
- "443"
environment:
- ASPNETCORE_ENVIRONMENT=Production # 配置環境變量
#- ASPNETCORE_URLS=http://+:8000 # .NET監聽所有界面
# 其他環境變量,例如連接字符串:
# - ConnectionStrings__DefaultConnection=...
networks: # 配置環境變量
- myhost
networks: # 自定義網路
myhost:
driver: bridge
(2)compose up启动.NET应用容器时加入该网络,并指定容器名(如jayden-test-webapi-compose-bridge-dev,jayden-test-webapi-compose-bridge-pro):
bash
# 启动所有容器
docker compose --file /opt/docker-ha/docker-compose-bridge.yml up -d
# 停止所有容器
docker compose --file /opt/docker-ha/docker-compose-bridge.yml down
这里启动两个容器jayden-test-webapi-compose-bridge-dev,jayden-test-webapi-compose-bridge-pro同时都加入了自动生成的docker-ha_myhost网络。如下图所示:


以上就是docker- compose编排自定义Bridge network模式的方式。至于docker- compose方法,后续抽时间再单独来讲解。
3.Host模式
3.1.run Host模式
启动容器时添加 --network host,容器内的进程直接绑定宿主机端口,无需端口映射。因为我提前发布一个http指定端口为8000的镜象到Harbor私人仓库去了(具体net操作:launchSettings配置把Container (Dockerfile)环境变量选项environmentVariables. ASPNETCORE_URLS修改为http://+:8000;Dockerfile配置把EXPOSE修改为8000端口,加入环境变量指向ENV ASPNETCORE_URLS=http://+:8000),所以需要提前pull该镜象到对应服务器去:
bash
docker run -d \
--name jayden-test-webapi-run-host-dev \ # 容器名字
--restart unless-stopped \ # 除非手動停止,不然一直重啟
--network host \ # 自定義網路
-e APP_PORT=8000 \ # 指定端口
-e ASPNETCORE_ENVIRONMENT=Development \ # 配置環境變量
--log-opt max-size=50m \ # 單一Log文檔最大限制為50MB
--log-opt max-file=5 \ # 最多保留5個Log文檔
192.168.1.100:8090/test/jayden-test-webapi-host:v1 # Harbor倉庫的镜像
这里启动一个容器jayden-test-webapi-run- host-dev加入了host网络。如下图所示:

3.2.docker-compose Host模式
创建并编辑docker-compose.yml输入如下内容:
bash
version: '3.8'
services:
jayden-test-webapi-dev: # 服務名稱
image: 192.168.1.100:8090/test/jayden-test-webapi-host:v1 # Harbor倉庫的镜像
container_name: jayden-test-webapi-compose-host-dev # 容器名字
restart: unless-stopped # 除非手動停止,不然一直重啟
environment:
- ASPNETCORE_ENVIRONMENT=Development # 配置環境變量
network_mode: host # 配置特定网络
compose up启动.NET应用容器时加入该网络,并指定容器名(如jayden-test-webapi-compose-host-dev),如下图所示:

4.总结
4.1 .Bridge
(1)适合应用场景:
单机开发、测试,以及需要隔离容器网络的环境。
(2)优点:
容器间通过DNS自动解析,解耦了IP变化。
与默认bridge相比,自定义bridge提供更好的隔离和自动服务发现。
可通过docker-compose轻松管理,网络自动创建。
(3)缺点:
多了一层NAT转换,性能略低于Host模式。
跨主机通信困难,需要额外配置端口映射或使用代理。
4.2.Host
(1)适合应用场景:
对网络性能要求极高(如视频流、高频交易),或容器需要大量端口映射的场景(如监控agent、负载均衡器nginx)。
(2)优点:
网络性能接近原生,无额外开销。
无需端口映射,自动暴露所有端口,方便调试。
(3)缺点:
缺乏隔离性,容器与主机共用网络栈,易产生端口冲突。
安全风险大,容器内程序可监听主机所有网络接口。
参考资料: