Skip to content

Docker - 容器互联

Docker - 容器间通信(用户定义网络)

Section titled “Docker - 容器间通信(用户定义网络)”

在现代 Docker 工作流中,容器之间相互通信的推荐方式是将它们连接到同一个用户定义网络(user-defined network)。这通过使用容器名称提供了自动的服务发现。

较旧的 --link 标志现在被认为是**遗留(legacy)和已弃用(deprecated)**的。用户定义网络提供了更好的隔离性、安全性和灵活性。

我们来演示如何使用用户定义桥接网络连接两个容器(例如,一个 Web 应用和一个 Redis 数据库)。

步骤 1:创建一个用户定义桥接网络。我们将其命名为 app-network。

docker network create app-network

步骤 2:启动数据库容器(例如 Redis)并将其连接到 app-network。我们将此容器命名为 redis-db。

# 在分离模式 (-d) 下启动名为 'redis-db' 的 Redis 容器,连接到 'app-network'
docker run -d --name redis-db --network app-network redis:alpine

步骤 3:启动应用容器(例如一个假设的 Web 应用镜像 my-web-app)并将其连接到同一个 app-network。我们将此容器命名为 web-frontend 并发布其端口。

# 在分离模式下启动名为 'web-frontend' 的 Web 应用容器,连接到 'app-network'
# 将主机端口 80 映射到容器端口 8080(假设应用监听 8080 端口)
docker run -d --name web-frontend --network app-network -p 80:8080 my-web-app

现在,在 web-frontend 容器内部,应用代码可以通过使用主机名 redis-db 来连接 Redis 数据库。Docker 的内嵌 DNS 服务器会自动将 redis-db 解析到 app-network 内 Redis 容器的正确内部 IP 地址。

例如,Web 应用中的连接字符串可能看起来像 redis://redis-db:6379。

步骤 4:您可以通过在同一个网络上运行一个临时容器,并尝试按名称 ping 数据库容器来验证连接性。

# 在 app-network 上运行一个临时 Ubuntu 容器,获取一个 shell
docker run -it --rm --network app-network ubuntu bash
# 在 Ubuntu 容器内部,安装 ping (如果需要) 并 ping 'redis-db'
# apt-get update && apt-get install -y iputils-ping
# ping redis-db

您应该看到 ping 响应成功,这确认了在用户定义网络中的名称解析正在工作。

使用用户定义网络是处理 Docker 中容器间通信的标准、健壮方式,它简化了应用配置并增强了安全性。