docker自定义网络
Docker 网络模式决定了容器之间、容器与宿主机之间的通信方式。掌握网络机制是理解容器互联互通的关键。
一、Docker 网络的核心模式
Docker 有三种核心网络模式,决定了容器的通信方式:
桥接模式(默认 docker0 网络)
Docker 安装后会自动创建 docker0 网桥,每个容器启动时会被分配一个 docker0 网段内的 IP(如 172.17.0.x)。 容器间可通过容器 IP + 端口通信,但存在缺陷:容器重启后 IP 可能变化,且 docker0 不支持容器名直接解析为域名,导致依赖 IP 通信的方式不够稳定。
自定义网络
用户可通过 docker network create 命令创建自定义网络(如示例中的 mynet)。 自定义网络支持 “容器名 → 域名” 的稳定解析,且容器 IP 分配更可控,是生产环境中容器通信的推荐方式。
宿主模式 / 其他模式(此处暂不展开,重点关注容器间通信的核心场景)
实验
目的
我们需要启动两个 Nginx 容器(app1 和 app2),让它们通过容器名互相访问(而不是依赖 IP)
流程
1、创建自定义网络
创建自定义网络(默认是 bridge 类型,适合容器间通信)
docker network create mynet
可以通过以下命令查看网络是否创建成功
docker network ls
若输出中包含 mynet,说明创建成功。
2、启动两个 Nginx 容器并加入 mynet 网络
docker run -d \-p 80:80 \--name app1 \--network mynet \nginx
docker run -d \-p 99:80 \--name app2 \--network mynet \nginx
-p 80:80:宿主机访问 http://localhost:80 会转发到 app1 的 80 端口(Nginx 默认端口)。
-p 99:80:宿主机访问 http://localhost:99 会转发到 app2 的 80 端口。
--network mynet:关键参数,让两个容器加入同一个自定义网络,实现互通。
3、验证容器间通过 “容器名” 通信
1、进入 app1 容器内部:docker exec -it app1 bash
在容器内用 curl 访问 app2(Nginx 默认返回欢迎页):curl http://app2:80
会看到 Nginx 的默认 HTML 页面内容(说明访问成功)。
2、同理,进入 app2 容器内部:docker exec -it app2 bash
访问 app1:curl http://app1:80
同样会返回 Nginx 欢迎页,证明通信双向有效。
补充
为什么自定义网络能实现 “容器名访问”?
对比 Docker 默认的 bridge 网络(docker0):默认网络中,容器间只能通过 IP 访问,容器名无法被解析(需要手动配置 --link,但该参数已被淘汰)。
自定义网络内置了 DNS 解析服务:Docker 会在自定义网络中维护一个 “容器名 → IP” 的映射表,当容器启动、重启或 IP 变化时,这个表会自动更新,因此无论容器 IP 如何变化,都能通过容器名稳定访问。
查看网络详情
如果想确认两个容器的 IP 和网络配置,可以通过 docker network inspect mynet 查看: docker network inspect mynet 在输出的 Containers 部分,会看到 app1 和 app2 的 IP 地址(例如 172.18.0.2 和 172.18.0.3)
"Containers": {"app1": {"Name": "app1","IPv4Address": "172.18.0.2/16"},"app2": {"Name": "app2","IPv4Address": "172.18.0.3/16"}
}
但在日常开发中,我们无需关心这些 IP,因为 容器名即可作为固定域名使用。
环境清理(实验结束)
docker rm -f $(docker ps -aq)
若还想删除自定义网络:
docker network rm mynet
总结
| 网络类型 | 是否支持容器名访问 | IP 是否固定 | 典型用途 |
|---|---|---|---|
| 默认桥接网络(docker0) | ❌ | ❌ | 临时测试 |
| 自定义网络(bridge 类型) | ✅ | ✅(动态可解析) | 推荐用于服务间通信 |
| host / none | 特殊用途 | 特殊用途 | 性能优化或隔离 |
在实际项目中,无论是 MySQL + WordPress、Nginx + Redis 还是 前端 + 后端,
都推荐使用 自定义网络 来实现容器间稳定通信。
通过容器名互联,系统的可维护性与可移植性都显著提升。
一句话总结:
“自定义网络让容器之间的通信像微服务一样灵活稳定——名字不变,连接不断。”
