Docker#
该模块基于 Docker 容器标签,在 HTTP 和 stream 上下文中提供代理服务器组的动态配置。
要使该功能正常工作,必须在组中配置共享内存区域(参见 http 和 stream 的 zone 说明)。
备注
该模块支持与 Docker 及其替代品(如 Podman)配合使用,这些替代品实现了兼容的 API。
该模块通过 API 连接到 Docker 守护进程,与其交互的方法由 docker_endpoint 指令指定。
在获取正在运行的容器列表后,Angie 会分析它们是否存在合适的 标签。
如果容器描述中包含带有端口的标签,则该容器的地址和端口,以及该容器其他标签中的参数,将自动添加到 Angie 配置中相应的 upstream 块。
备注
同一个容器可以添加到多个 upstream 组。
要实现这一点,只需指定多组具有不同组名和端口的标签即可。
这在容器在不同端口上运行多个不同服务时特别有用——每个服务可以关联到自己的组。
然后,该模块订阅容器生命周期事件,并开始在不重新加载 Angie 的情况下更新代理服务器配置:
当启动带有合适标签的容器时,其内部 IP 地址将添加到指定的组;
当停止或删除容器时,它会自动从组中移除;
当使用 docker pause 命令暂停容器时,服务器被标记为
down,使用 docker unpause 时——标记为up。
配置示例#
该模块的指令始终位于 http 上下文中,但代理服务器组可以在 http 上下文和 stream 上下文中定义。
http 的配置示例:
http {
# 连接选项示例:
# docker_endpoint http://127.0.0.1:2375;
# docker_endpoint https://127.0.0.1:2376;
docker_endpoint unix:/var/run/docker.sock;
# Docker 响应缓冲区最大大小(可选)
# docker_max_object_size 128k;
upstream u {
zone z 1m; # 需要共享内存区域
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://u;
}
}
}
stream 上下文中的类似配置:
http {
# 连接选项示例:
# docker_endpoint http://127.0.0.1:2375;
# docker_endpoint https://127.0.0.1:2376;
docker_endpoint unix:/var/run/docker.sock;
# Docker 响应缓冲区最大大小(可选)
# docker_max_object_size 128k;
}
stream {
upstream u {
zone z 1m;
}
server {
listen 12345;
proxy_pass u;
}
}
收到容器事件后,Angie 会查找形式为 angie.http.upstreams.<name>.port=<port> (用于 HTTP 上下文)或 angie.stream.upstreams.<name>.port=<port> (用于 stream 上下文)的标签。
当存在标签时,容器在指定 Docker 网络中的地址(如果未指定 angie.network 标签,则为第一个可用的地址)将添加到相应的代理服务器组。
如果容器停止或被删除,服务器将从组中移除;如果容器被暂停,服务器将被标记为 down。
Angie 识别的带有标签的 docker-compose.yml 文件片段:
services:
myapp:
image: myapp:latest
labels:
- "angie.http.upstreams.u.port=8080"
- "angie.network=my_bridge"
- "angie.http.upstreams.u.weight=2"
- "angie.http.upstreams.u.max_conns=50"
- "angie.http.upstreams.u.max_fails=3"
- "angie.http.upstreams.u.fail_timeout=10s"
- "angie.http.upstreams.u.backup=true"
标签#
标签在代理服务器组中指定服务器参数,类似于 server 指令的参数:
标签 | 用途 |
|---|---|
| Angie 将连接到的容器端口;容器本身被添加到名为 |
| 用于获取容器 IP 地址的 Docker 网络名称。 |
|
|
| 最大并发连接数( |
| 失败尝试阈值( |
| 计算失败尝试的时间间隔( |
| 将服务器标记为 |
| 为代理服务器设置自定义服务器标识符( |
| 启用具有可配置时间段的 |
指令#
docker_endpoint#
指定连接到 Docker 守护进程的方法并启用容器事件跟踪。 支持以下选项:
| 通过 Unix 套接字连接(例如 |
| 通过 HTTP 或 HTTPS 连接到远程 Docker API。 |
可以使用 client 上下文进一步配置连接,该模块在其中添加了两个命名的 location 块:
@docker_events用于接收容器事件;@docker_containers— 用于获取容器信息。
默认情况下,它们包含带有连接地址的 proxy_pass 指令以及其他几个最佳默认设置,可以向其中添加 代理 模块的其他设置。
如果指定了该指令,Angie 将使用指定的方法打开到 Docker 的连接,请求正在运行的容器列表,分析它们的标签并处理所有后续容器事件,根据标签在代理服务器组中添加或删除服务器。
小技巧
要通过 Unix 套接字(/var/run/docker.sock 或其他)访问 Docker 守护进程,Angie 运行所使用的 用户 必须对此套接字具有读写权限。
docker_max_object_size#
设置用于 Docker 请求的 JSON 响应和容器事件流的最大缓冲区大小。
对于常规请求(API 版本、容器列表、容器信息):整个响应必须适合缓冲区,否则会发生错误。
对于容器事件,使用流式处理并重用缓冲区,这允许处理无限的事件流。
典型值 64k 足以容纳大约 25 个容器。
当发生 Docker API 连接错误或响应处理错误时,该模块会在特定时间间隔自动重试。 获取特定容器信息的最大重试次数限制为两次 额外 尝试;之后,该模块将停止对该容器的尝试。