
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
本项目是http://www.consul.io/%E7%9A%84Docker%E5%AE%B9%E5%99%A8%E5%8C%96%E5%AE%9E%E7%8E%B0%E3%80%82%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E7%BB%8F%E8%BF%87%E8%BD%BB%E5%BE%AE%E5%AE%9A%E5%88%B6%E3%80%81%E9%A2%84%E9%85%8D%E7%BD%AE%E7%9A%84Consul Agent,专门为Docker生态系统设计。
该容器体积非常小(虚拟大小50MB,基于https://github.com/progrium/busybox%EF%BC%89%EF%BC%8C%E5%8F%AF%E4%BB%8EDocker Index获取:
bash$ docker pull docker.xuanyuan.run/progrium/consul
如果只想运行单个Consul Agent实例以试用其功能:
bash$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul -server -bootstrap
可通过添加-ui-dir标志启用http://www.consul.io/intro/getting-started/ui.html%EF%BC%9A
bash$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul -server -bootstrap -ui-dir /ui
上述命令发布了8400(RPC)、8500(HTTP)和8600(DNS)端口,以便试用所有三个接口。同时设置了主机名node1,这是为Consul Agent节点命名的推荐方式。
推荐通过HTTP接口使用curl交互:
bash$ curl localhost:8500/v1/catalog/nodes
也可使用dig与DNS接口交互:
bash$ dig @0.0.0.0 -p 8600 node1.node.consul
若在主机上安装了Consul,可使用CLI与容器化的Consul Agent交互:
bash$ consul members
若要在单主机上启动Consul集群以实验集群动态(复制、 leader选举),推荐以下方式启动3节点集群。
首先启动第一个节点时不使用-bootstrap,而使用-bootstrap-expect 3,这将等待3个对等节点连接后自动引导并成为可用集群:
bash$ docker run -d --name node1 -h node1 progrium/consul -server -bootstrap-expect 3
通过检查容器获取其内部IP,并保存到环境变量JOIN_IP:
bash$ JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"
然后启动node2并通过$JOIN_IP加入node1:
bash$ docker run -d --name node2 -h node2 progrium/consul -server -join $JOIN_IP
以相同方式启动node3:
bash$ docker run -d --name node3 -h node3 progrium/consul -server -join $JOIN_IP
现在已在单主机上运行了真正的三节点集群。注意容器名称与其内部主机名/节点名一致。
此时未发布任何端口以访问集群,可运行第四个"客户端"模式的Agent节点(不使用-server)来解决此问题。客户端节点不参与共识仲裁,但可与集群交互,且无需磁盘持久化:
bash$ docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp --name node4 -h node4 progrium/consul -join $JOIN_IP
现在可通过已发布的端口与集群交互,也可尝试终止、添加和重启节点以观察集群处理能力。
在独立主机上设置真实集群的过程与单主机集群类似,但有以下差异:
-advertise标志将私有IP传递给Consul/data卷用于持久化,示例中绑定挂载主机的/mnt目录假设主机私有IP为10.0.1.1,docker桥接docker0的IP为172.17.42.1,启动第一个主机Agent:
bash$ docker run -d -h node1 -v /mnt:/data \ -p 10.0.1.1:8300:8300 \ -p 10.0.1.1:8301:8301 \ -p 10.0.1.1:8301:8301/udp \ -p 10.0.1.1:8302:8302 \ -p 10.0.1.1:8302:8302/udp \ -p 10.0.1.1:8400:8400 \ -p 10.0.1.1:8500:8500 \ -p 172.17.42.1:53:53/udp \ progrium/consul -server -advertise 10.0.1.1 -bootstrap-expect 3
在第二台主机(私有IP 10.0.1.2)上运行相同命令,但添加-join指向第一台节点的IP:
bash$ docker run -d -h node2 -v /mnt:/data \ -p 10.0.1.2:8300:8300 \ -p 10.0.1.2:8301:8301 \ -p 10.0.1.2:8301:8301/udp \ -p 10.0.1.2:8302:8302 \ -p 10.0.1.2:8302:8302/udp \ -p 10.0.1.2:8400:8400 \ -p 10.0.1.2:8500:8500 \ -p 172.17.42.1:53:53/udp \ progrium/consul -server -advertise 10.0.1.2 -join 10.0.1.1
第三台主机(IP 10.0.1.3):
bash$ docker run -d -h node3 -v /mnt:/data \ -p 10.0.1.3:8300:8300 \ -p 10.0.1.3:8301:8301 \ -p 10.0.1.3:8301:8301/udp \ -p 10.0.1.3:8302:8302 \ -p 10.0.1.3:8302:8302/udp \ -p 10.0.1.3:8400:8400 \ -p 10.0.1.3:8500:8500 \ -p 172.17.42.1:53:53/udp \ progrium/consul -server -advertise 10.0.1.3 -join 10.0.1.1
完成!最后一个节点连接后,集群将自动引导。现在已在私有网络上运行生产环境集群。
由于生产环境的docker run命令较长,提供了生成命令的工具。运行cmd:run <advertise-ip>[::<join-ip>[::client]] [docker-run-args...]将输出一个可定制的docker run命令,可在子shell中执行。例如:
bash$ docker run --rm progrium/consul cmd:run 10.0.1.1 -d
输出:
basheval docker run --name consul -h $HOSTNAME \ -p 10.0.1.1:8300:8300 \ -p 10.0.1.1:8301:8301 \ -p 10.0.1.1:8301:8301/udp \ -p 10.0.1.1:8302:8302 \ -p 10.0.1.1:8302:8302/udp \ -p 10.0.1.1:8400:8400 \ -p 10.0.1.1:8500:8500 \ -p 172.17.42.1:53:53/udp \ -d \ progrium/consul -server -advertise 10.0.1.1 -bootstrap-expect 3
默认行为:容器主机名设为宿主机主机名,容器命名为consul(可覆盖),53端口绑定到Docker桥接,其他端口绑定到advertise IP。若未提供join IP,将以-bootstrap-expect模式运行,默认预期3个对等节点。另一个示例:指定join IP并添加更多docker参数:
bash$ docker run --rm progrium/consul cmd:run 10.0.1.1::10.0.1.2 -d -v /mnt:/data
输出:
basheval docker run --name consul -h $HOSTNAME \ -p 10.0.1.1:8300:8300 \ -p 10.0.1.1:8301:8301 \ -p 10.0.1.1:8301:8301/udp \ -p 10.0.1.1:8302:8302 \ -p 10.0.1.1:8302:8302/udp \ -p 10.0.1.1:8400:8400 \ -p 10.0.1.1:8500:8500 \ -p 172.17.42.1:53:53/udp \ -d -v /mnt:/data \ progrium/consul -server -advertise 10.0.1.1 -join 10.0.1.2
注意:该命令仅允许同时使用bootstrap-expect或join,不能同时使用。cmd:run默认假设使用第一个节点引导并预期3个节点。可通过设置EXPECT环境变量修改引导前的预期节点数。
使用方法:将cmd:run输出包装在子shell中执行:
bash$ $(docker run --rm progrium/consul cmd:run 127.0.0.1 -it)
客户端标志
客户端节点允许扩展集群而不影响gossip协议性能(它们将请求代理到服务器节点,因此是无状态的)。
使用runner命令启动客户端节点,在<advertise-ip>::<join-ip>参数后追加::client。例如:
bash$ docker run --rm progrium/consul cmd:run 10.0.1.4::10.0.1.2::client -d
输出将与上述相同,但Consul参数中不含-server。
Consul允许指定shell脚本进行健康检查,类似Nagios。作为容器,这些脚本在Busybox环境(含bash和curl)中运行。为解决环境限制,提供了内置工具以在Docker系统中执行健康检查。
使用这些工具需在运行Consul容器时挂载宿主机的Docker socket到/var/run/docker.sock。
使用check-http
bashcheck-http <container-id> <port> <path> [curl-args...]
该工具基于curl执行HTTP健康检查,需提供容器ID或名称、内部端口(容器内服务监听端口)和路径。可选择提供额外curl参数。
HTTP请求在附加到目标容器网络命名空间的临时容器中执行。工具自动确定内部Docker IP。成功请求会将响应头输出到Consul,失败请求会输出原因并将检查状态设为critical。默认curl使用--retry 2以应对本地临时错误。
使用check-cmd
bashcheck-cmd <container-id> <port> <command...>
该工具在基于目标容器镜像的临时容器中执行指定命令,附加到目标容器的网络命名空间。通常用于健康检查脚本,但可执行任何容器镜像支持的命令。环境变量SERVICE_ADDR会设为指定的内部Docker IP和端口。
使用docker
上述健康检查工具需要Docker二进制文件,已内置在容器中。若上述工具不满足需求且容器环境受限,可直接执行Docker操作进行任何容器化健康检查。
该容器设计用于为其他容器提供DNS服务,因此在容器内监听53端口以提高兼容性和链接可访问性。启用了DNS递归查询,使用Google 8.8.8.8名称服务器。
使用cmd:run时,DNS端口发布到Docker桥接。可在docker run中使用--dns标志,或更好地配置Docker守护进程选项。在Ubuntu系统上,可运行以下命令配置Docker使用桥接IP作为DNS,备用Google DNS,并将service.consul作为搜索域:
bash$ echo "DOCKER_OPTS='--dns 172.17.42.1 --dns 8.8.8.8 --dns-search service.consul'" >> /etc/default/docker
若在OS X上使用boot2docker,需在Tiny Core Linux VM中设置Docker守护进程选项(boot2docker v1.3.1及以上),使用OS X的第一个DNS服务器进行外部解析:
bash$ boot2docker ssh sudo "ash -c \"echo EXTRA_ARGS=\'--dns 172.17.42.1 --dns $(scutil --dns | awk -F ': ' '/nameserver/{print $2}' | head -1) --dns-search service.consul\' > /var/lib/boot2docker/profile\""
配置后,Docker容器内的/etc/resolv.conf会自动包含相应条目。可使用含dig工具的容器测试(示例使用https://registry.hub.docker.com/u/aanand/docker-dnsutils/%EF%BC%8C%E5%8D%B3%E5%AE%89%E8%A3%85%E4%BA%86dnsutils%E7%9A%84Ubuntu%E9%95%9C%E5%83%8F%EF%BC%89%EF%BC%9A
bash$ docker run --rm aanand/docker-dnsutils dig -t SRV consul +search
尽管可扩展此镜像添加配置文件定义服务和检查,但该容器设计用于通过HTTP API在运行时配置服务和检查的环境。
建议保持检查逻辑简单,如使用内联curl或ping命令。默认shell为Bash,但运行在Busybox环境中。
若需自定义启动配置,可扩展此镜像:创建基于此镜像的新Dockerfile,添加含配置JSON文件的config目录,ONBUILD钩子会将其添加到构建的镜像中。也可使用opkg添加包。详见https://github.com/progrium/busybox%E3%80%82
测试集群场景时,终止容器并在同一主机上重启可能导致节点难以重新加入集群。
以新容器重启节点并使用相同发布端口时,可能导致心跳失败和节点波动,这是ARP表缓存问题。等待约3分钟后重启通常可解决,也可手动重置缓存。
本项目由[***]
BSD
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务
以下是 sequenceiq/consul 相关的常用 Docker 镜像,适用于 不同场景 等不同场景: