Docker 容器连接
本章将介绍 Docker 容器之间的通信方式,包括网络连接、容器链接和服务发现。
容器通信方式概述
Docker 提供了多种容器间通信方式:
| 方式 | 说明 | 推荐程度 |
|---|---|---|
| 用户自定义网络 | 通过 Docker 网络实现通信 | ⭐⭐⭐ 推荐 |
| --link 参数 | 传统链接方式 | ⚠️ 已废弃 |
| 共享网络命名空间 | 容器共享同一网络栈 | 特殊场景 |
| 宿主机网络 | 容器直接使用宿主机网络 | 特殊场景 |
使用自定义网络(推荐)
创建自定义网络
bash
# 创建 bridge 网络
docker network create my-network
# 查看网络列表
docker network ls
# 查看网络详情
docker network inspect my-network容器加入网络
bash
# 启动容器时指定网络
docker run -d --name web --network my-network nginx
docker run -d --name db --network my-network mysql:8.0 -e MYSQL_ROOT_PASSWORD=123456
# 将已运行的容器加入网络
docker network connect my-network existing-container
# 从网络中移除容器
docker network disconnect my-network existing-container通过容器名通信
在同一自定义网络中,容器可以通过名称互相访问:
bash
# 在 web 容器中 ping db 容器
docker exec web ping db
# 在 web 容器中访问 db
docker exec web curl db:3306Docker 内置 DNS 服务器会自动将容器名解析为对应的 IP 地址。
实际示例:Web 应用 + 数据库
bash
# 创建网络
docker network create app-network
# 启动 MySQL
docker run -d \
--name mysql-db \
--network app-network \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
mysql:8.0
# 启动 Web 应用(连接数据库使用容器名 mysql-db)
docker run -d \
--name web-app \
--network app-network \
-p 8080:8080 \
-e DB_HOST=mysql-db \
-e DB_PORT=3306 \
my-web-app--link 方式(已废弃)
⚠️
--link是旧版 Docker 的容器连接方式,已被官方标记为废弃。建议使用自定义网络代替。
bash
# 旧方式(不推荐)
docker run -d --name db mysql:8.0
docker run -d --name web --link db:database nginx--link 的局限性:
- 只能单向连接
- 不支持跨主机通信
- 不支持动态服务发现
共享网络命名空间
多个容器可以共享同一个网络命名空间,它们将拥有相同的 IP 地址和端口空间:
bash
# 先启动一个容器
docker run -d --name pod-main nginx
# 其他容器共享其网络
docker run -d --name pod-sidecar --network container:pod-main busybox sleep 3600这种模式类似于 Kubernetes 中 Pod 的网络模型。
容器与外部网络通信
端口映射
bash
# 映射指定端口
docker run -d -p 8080:80 nginx
# 映射到指定 IP
docker run -d -p 127.0.0.1:8080:80 nginx
# 随机映射端口
docker run -d -P nginx
# 查看端口映射
docker port my-nginx容器访问外部服务
容器默认可以访问外部网络。如果需要访问宿主机上的服务:
bash
# Linux:使用 host.docker.internal(Docker 20.10+)
# 或使用宿主机的 docker0 网桥 IP
docker run -it --add-host=host.docker.internal:host-gateway alpine ping host.docker.internal多容器通信实战
示例:Nginx + PHP-FPM + MySQL
bash
# 创建网络
docker network create lamp-network
# 启动 MySQL
docker run -d \
--name mysql \
--network lamp-network \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
# 启动 PHP-FPM
docker run -d \
--name php-fpm \
--network lamp-network \
-v $(pwd)/src:/var/www/html \
php:8.2-fpm
# 启动 Nginx
docker run -d \
--name nginx \
--network lamp-network \
-p 80:80 \
-v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf \
-v $(pwd)/src:/var/www/html \
nginx网络管理命令
bash
# 创建网络
docker network create my-net
# 列出所有网络
docker network ls
# 查看网络详情
docker network inspect my-net
# 连接容器到网络
docker network connect my-net container-name
# 断开容器与网络的连接
docker network disconnect my-net container-name
# 删除网络
docker network rm my-net
# 清理未使用的网络
docker network prune本章小结
容器连接是构建多容器应用的基础。推荐使用自定义 Docker 网络来实现容器间通信,它提供了自动 DNS 解析、网络隔离和灵活的管理能力。
关键要点:
- 优先使用自定义网络,避免使用已废弃的
--link - 同一网络中的容器可以通过容器名互相访问
- Docker 内置 DNS 自动解析容器名
- 端口映射用于容器与外部网络通信