Skip to content

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:3306

Docker 内置 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 是旧版 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 自动解析容器名
  • 端口映射用于容器与外部网络通信

延伸阅读