首页 > 解决方案 > 如何使用 Docker 中的 DNS 来引用相同 DN 的所有复制容器?

问题描述

我有一堆在单个主机上运行的微服务。该堆栈基本上由 2 个无状态 php Web 服务器和一个有状态 mysql 数据库组成。执行命令时,我使用.env文件将预定义的容器名称导入 php 配置文件docker-compose up。容器使用预定义的 DNS 名称而不是 IP 地址相互通信。这适用于堆栈仅运行每个微服务的单个实例时。

但是,我想迁移到 docker swarm。每个容器都会有多个动态启动的实例,并且每个实例都将获得一个唯一的 DNS 名称;这会破坏我的 DNS 解析,因此会破坏我的服务,因为容器无法再相互通信(它们无法通过 DNS 名称解析彼此的 IP 地址)。

处理这个问题的实际方法是什么?

标签: dockerdnsdocker-composedocker-swarmdocker-swarm-mode

解决方案


  • 当您迁移到 Docker swarm 时,您将处理 docker swarm 服务。
  • 服务可能有多个副本。每个副本都有唯一的虚拟 IP。但这不是问题,因为每个服务都可以通过其服务名称与其他服务通信。
  • 服务名称在 docker ingress network的 DNS 中注册。

例如,java 服务可以通过其名称[stack_name]_app连接到服务。[stack_name]_db

Docker swarm 负载均衡器将以循环策略将查询发送到 db 服务的副本。

并且存在多少个数据库服务副本并不重要。服务可以动态地放大/缩小。


推荐阅读