docker - 如何使用 Docker 中的 DNS 来引用相同 DN 的所有复制容器?
问题描述
我有一堆在单个主机上运行的微服务。该堆栈基本上由 2 个无状态 php Web 服务器和一个有状态 mysql 数据库组成。执行命令时,我使用.env文件将预定义的容器名称导入 php 配置文件docker-compose up
。容器使用预定义的 DNS 名称而不是 IP 地址相互通信。这适用于堆栈仅运行每个微服务的单个实例时。
但是,我想迁移到 docker swarm。每个容器都会有多个动态启动的实例,并且每个实例都将获得一个唯一的 DNS 名称;这会破坏我的 DNS 解析,因此会破坏我的服务,因为容器无法再相互通信(它们无法通过 DNS 名称解析彼此的 IP 地址)。
处理这个问题的实际方法是什么?
解决方案
- 当您迁移到 Docker swarm 时,您将处理 docker swarm 服务。
- 服务可能有多个副本。每个副本都有唯一的虚拟 IP。但这不是问题,因为每个服务都可以通过其服务名称与其他服务通信。
- 服务名称在 docker ingress network的 DNS 中注册。
例如,java 服务可以通过其名称[stack_name]_app
连接到服务。[stack_name]_db
Docker swarm 负载均衡器将以循环策略将查询发送到 db 服务的副本。
并且存在多少个数据库服务副本并不重要。服务可以动态地放大/缩小。
推荐阅读
- python - 在 Linux Python/pip 上构建 cyrus-sasl 后看不到 sasl.h 文件
- android - 我的键盘不允许我创建一个新段落。
- python - csv python上关闭文件的I/O操作
- php - 可以使用 simplexml_load_string 来处理
标签吗? - php - 导入常量 PHP
- python-3.x - 如何在另一个类中使用 tkinter entry .get() 函数
- visual-studio - 使用 Nuget 和 SVN 在内部分发 Visual Studio 模板
- google-apps-script - OCR 购买收据中的字符串替换
- python - 如何在 if 语句中收集元组值?
- rest - JAX-RS 如何读取 Kotlin 中列表的实体响应