在 Docker Compose 上部署¶
docker-compose
是一个用于定义和运行多容器 Docker 应用程序的强大工具。虽然你可以直接使用 docker run
来启动 Load Ants,但当你需要将它与其它服务(例如,一个需要通过 Load Ants 解析域名来访问外部 API 的 Web 应用)一起部署时,docker-compose
能极大地简化网络配置和管理。
本指南将演示一个常见的场景:部署一个 Load Ants
容器和一个 curl
工具容器,并配置后者使用前者作为其 DNS 服务器。
先决条件¶
- Docker 和 Docker Compose: 确保你的系统上已经安装了这两个工具。
- 配置文件: 准备好你的
config.yaml
文件。
场景描述¶
- 服务 A (
load-ants
): 我们的 DNS 代理,它将监听 UDP 端口 5353。 - 服务 B (
my-app
): 一个模拟应用(我们用curl
容器代替),它需要解析域名。我们将配置它把所有 DNS 查询发送给load-ants
服务。
步骤一:创建项目目录结构¶
在一个你选择的目录下,创建以下文件和目录:
load-ants-compose/
├── docker-compose.yml
└── config/
└── config.yaml
docker-compose.yml
:docker-compose
的核心定义文件。config/config.yaml
: 你的 Load Ants 配置文件。
步骤二:配置 config.yaml
¶
为了在 Docker 环境中工作,请确保你的 config.yaml
中 server
的监听地址是 0.0.0.0
,这样它才能接受来自其他容器的连接。
server:
listen_udp: "0.0.0.0:5353" # 使用一个非特权端口,如 5353
# ... 其他配置
# ...
注意: 我们在这里使用 5353 端口而不是标准的 53 端口,因为在某些系统上,53 端口可能已被本地的 DNS resolver(如
systemd-resolved
)占用。在容器化环境中,使用非特权端口是更简单和推荐的做法。
步骤三:编写 docker-compose.yml
¶
这是此设置的核心。将以下内容粘贴到 docker-compose.yml
文件中:
version: "3.8"
services:
# 服务A: Load Ants
load-ants:
image: ghcr.io/shengyanli1982/load-ants-<arch>:latest
container_name: load-ants-server
volumes:
- ./config/config.yaml:/app/config.yaml
# 不映射端口到主机,因为它只被内部服务使用
# ports:
# - "5353:5353/udp"
networks:
- ants-network
# 服务B: 模拟的应用
my-app:
image: alpine/curl
container_name: my-app-client
# 使用 depends_on 确保 load-ants 容器先于 my-app 启动
depends_on:
- load-ants
# 关键配置:将此容器的 DNS 服务器指向 load-ants 服务
dns:
- 127.0.0.1 # 作为备用
- load-ants # Docker 会自动将服务名 'load-ants' 解析为其容器的 IP 地址
# 保持容器运行以便我们进入
command: ["sleep", "infinity"]
networks:
- ants-network
networks:
ants-network:
driver: bridge
配置解释:
services
: 定义了两个服务,load-ants
和my-app
。volumes
: 我们将本地的config.yaml
文件挂载到load-ants
容器的/app/config.yaml
路径,这样容器就能读取到我们的配置。dns
: 这是最关键的部分。我们为my-app
服务设置了 DNS 服务器。Docker 的内置 DNS 服务会将服务名load-ants
解析为load-ants
容器在ants-network
网络中的内部 IP 地址。这意味着my-app
容器内的任何 DNS 查询都会被发送到load-ants
容器。networks
: 我们创建了一个自定义的桥接网络ants-network
,并让两个服务都连接到这个网络。这能确保它们之间可以相互通信,并且拥有可预测的 DNS 名称。如果需要将服务暴露给主机或其他外部网络,请务必参考安全最佳实践中的建议。depends_on
: 确保了容器的启动顺序,my-app
会在load-ants
成功启动后才启动。
步骤四:启动和验证¶
-
启动服务: 在
load-ants-compose
目录下,运行以下命令。-d
参数表示在后台(detached mode)运行。docker-compose up -d
-
验证: 我们可以进入
my-app
容器,并使用curl
来测试 DNS 解析是否通过load-ants
。进入容器后,执行一个docker exec -it my-app-client sh
curl
命令:同时,你可以查看# -v 参数会显示详细的连接信息,包括 DNS 解析过程 curl -v https://www.google.com
load-ants
容器的日志,你应该能看到来自my-app
容器的 DNS 查询记录。docker logs -f load-ants-server
这个例子展示了 docker-compose
的强大之处:只需几行声明式的 YAML,我们就构建了一个包含自定义 DNS 解析逻辑的多服务应用环境。