Docker 网络是 Docker 容器之间、容器与宿主机之间以及容器与外部网络(如互联网)进行通信的虚拟化网络架构。它通过软件定义的方式,为容器提供隔离、安全且灵活的网络连接,解决了容器化环境中 "如何让不同容器 / 服务互联互通" 的核心问题。
总结
- 默认网络 :
bridge(默认)、host、none、自定义满足基础场景。 - 自定义网络 :推荐用于生产环境,支持容器名解析和隔离。
- 端口映射 :通过
-p或-P让外部访问容器,host模式无需映射但需注意端口冲突。
Docker 网络的核心作用
- 容器间通信:让同一主机或不同主机上的容器能够相互访问(如前端容器调用后端 API 容器)。
- 容器与宿主机通信:容器可以访问宿主机的服务(如宿主机的数据库),反之亦然。
- 容器与外部网络通信:容器可以访问互联网(如下载依赖),或对外提供服务(如 Web 容器暴露 80 端口)。
- 网络隔离:通过不同的网络环境,隔离不同业务的容器(如开发环境和生产环境容器不互通)。
命令
bash
# 列出所有网络
docker network ls
# 创建自定义网络
docker network create [options] <network-name>
# 检查网络详情
docker network inspect <network-name>
# 将容器连接到网络
docker network connect <network-name> <container-name>
# 断开容器与网络的连接
docker network disconnect <network-name> <container-name>
# 删除网络
docker network rm <network-name>
# 删除所有未使用的网络
docker network prune
1 默认 bridge 网络
默认的bridge网络是Docker安装后自动创建的桥接网络 (名称为
bridge),是**容器启动时未指定网络模式(没有--network)**的默认选择,也是最常用的 Docker 网络模式之一。它通过软件虚拟的 "桥接设备"(类似物理交换机)实现同一宿主机内容器之间、容器与宿主机之间的网络通信。
默认的缺点
无法通过容器名称访问容器**(没有DHCP服务)**
例如下面第一条可以访问,第二条无法访问
bash
# 进入容器1,尝试通过 IP 访问容器2
docker exec -it container1 curl http://172.17.0.3
# 通过容器名访问容器2
docker exec -it container1 curl http://container2
例子
宿主机通过 docker run -p 宿主机端口:容器端口 映射端口,让外部访问容器( -p 8080:80 使宿主机 8080 端口映射容器 80 端口)。
bash
# 启动一个 Nginx 容器,使用默认 bridge 网络,映射 8080 端口
docker run -d -p 8080:80 --name web-nginx nginx
2 自定义网络:更灵活的隔离与通信
- 首先用docker network create创建一个网络
- 之后启动run容器加入这个--network网络
例子
# 创建一个自定义桥接网络(支持容器名解析)
docker network create my-network
# 启动两个容器加入该网络
docker run -d --name app1 --network my-network nginx
docker run -d --name app2 --network my-network nginx
# 在 app1 中可直接通过容器名访问 app2(无需记 IP)
docker exec -it app1 curl app2:80 # 成功访问 app2 的 80 端口
优势
- 自动 DNS 解析:容器可通过名称(如
app2)而非 IP 通信。 - 更好的隔离性:不同自定义网络的容器默认不互通,仅同一网络内可通信。
3 Host网络
移除了容器和主机之间的网络隔离,直接使用主机的网络(--netowrk host),不创建独立网络命名空间
特点
- 容器没有独立IP,与宿主机共享IP
- 性能最优 (无网络转发开销),牺牲了隔离性
例子
bash
# 启动一个Nginx容器,使用host网络 (⚠️ 为了避免端口冲突, 容器1 启动alpine/curl即可)
#客户端(不监听端口,使用alpine构建,名叫host1,使用host网络,不缓存)
docker run -itd \
--name host1 \
--network host \
alpine \
sh -c "apk add --no-cache curl && sh"
#服务端(使用nginx构建容器名叫host2,使用host网络-默认监听80)
docker run -d \
--name host2 \
--network host \
nginx
# 查询宿主机端口 eth0 是 HOST_IP
ifconfig
# 登入容器1,通过宿主机ip访问容器2
docker exec -it host1 curl http://${HOST_IP}$:80
# 特别注意:因为容器使用主机的网络端口,而主机的端口一旦使用,就不能再被其他容器使用。否则会提示端口冲突。
docker run -d \
--name host-3 \
--network host \
nginx
docker logs host-3
4 none 模式
容器禁用所有网络-network none ,只有 lo(本地回环)接口,无法与外部通信。
-
特点:完全隔离网络,适合不需要网络的容器(如离线数据处理)。
-
适用场景:纯本地计算任务(如生成日志文件、处理本地数据)。
# 启动一个无网络的容器 docker run -d --network none --name offline-container alpine sleep 3600