Docker 网络
理解 Docker 的四种网络模式
掌握自定义桥接网络的使用
实现容器之间的网络通信
核心讲解
Docker 有自己的网络体系,提供多种网络模式,满足不同场景的隔离和通信需求。
(1)四种默认网络模式
表格
网络模式 | 特点 | 适用场景 |
|---|---|---|
bridge(桥接) | 默认模式,每个容器分配独立 IP,通过网桥和 NAT 和外界通信,容器之间可以互通 | 绝大多数场景,默认推荐 |
host(主机) | 共享宿主机的网络栈,容器没有自己的 IP,直接用宿主端口 | 网络性能要求高、端口多的场景 |
none(无网络) | 没有网络,完全和外界隔绝 | 高安全要求、不需要网络的容器 |
container | 共享另一个容器的网络命名空间 | 网络代理、边车模式 |
(2)默认 bridge 的问题
默认的 bridge 网络,容器之间只能用 IP 互相访问,不能用容器名解析,不方便。而且所有容器都在一个网桥,隔离性不好。
(3)自定义 bridge 网络(推荐)
自己创建桥接网络,在同一个自定义网络里的容器:
可以直接用容器名互相访问,自动 DNS 解析
网络隔离,不同网络的容器默认不通
更好的性能和可管理性
生产环境推荐:每个项目一个自定义网络,项目内的容器放同一个网络。
(4)容器互联
同一个自定义网络里,直接用容器名就能通信
不同网络的容器,需要加入同一个网络才能通
一个容器可以加入多个网络
操作示例
# ===== 1. 查看所有网络 =====
docker network ls
# ===== 2. 创建自定义网络 =====
docker network create my-net
# 默认bridge模式
# 查看网络详情
docker network inspect my-net
# ===== 3. 容器加入自定义网络 =====
# 启动容器时指定网络
docker run -d --name web1 --network my-net nginx
docker run -d --name web2 --network my-net nginx
# ===== 4. 容器之间用名字通信 =====
# 进入web1,ping web2的名字
docker exec -it web1 ping web2
# 能ping通,说明可以用名字解析
# ===== 5. 已有容器加入网络 =====
docker run -d --name web3 nginx
# 把web3加入my-net网络
docker network connect my-net web3
# 断开网络
docker network disconnect my-net web3
# ===== 6. 删除网络 =====
docker network rm my-net
常见误区
默认网络能解析容器名:默认 bridge 不支持 DNS 解析,只有自定义 bridge 才可以
容器跨网络默认能通:不同网络是隔离的,默认不通,需要手动 connect
host 模式还需要端口映射:host 模式直接用宿主端口,不需要 - p 映射,映射了反而没用
网络越多越安全:合理规划网络,不是越多越好,增加复杂度
课后练习
创建一个名为 app-net 的自定义网络
在这个网络里启动两个容器:nginx 和 busybox
进入 busybox 容器,用容器名 ping 通 nginx
思考:自定义桥接网络相比默认网络有什么优势?

