我正在使用gliderlabs / registrator容器的领事,向领事展示我的活动容器。 当我快速删除容器时,服务不会从领事中删除,从而导致不再存在的“僵尸”服务。 我听说有gliderlabs /registry容器可以使用额外的选项,以防止这样的 – -cleanup 。 但是,我还没有能够成功地运行任何注册人的这个选项。 这是我目前对我的注册人的docker运行命令: docker run -d -h $(hostname -i) –name registrator1 \ -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator \ consul://$(hostname -i):8500 我需要在这个运行命令中添加什么来让注册者从已经不存在或已经失败的领事手中取出任何容器? 更新:我发现了这个问题 所以我正在使用我的领事集群和注册人一起运行群集。 为了给群集提供故障转移,我在我的consul群集前放置了负载均衡器,并将我的群集和注册器容器连接到负载均衡器的IP地址。 这使得任何领事节点都可以下山,而不会失去群体。 然而,swarm不会将自己注册为服务。 它将每个节点注册为一个密钥值,并且不被绑定到consul集群中的任何节点。 注册到注册人的领事的容器被创build为服务,并绑定到一个领事服务器。 我想现在发生的事情是,当我删除一个容器时,注册人去从领事删除服务,但只有33%的机会击中正确的领事服务器,并删除服务,因为我的LB只是循环。 我所有的swarm master,负载平衡器,领事服务器和swarm worker都在不同的机器上运行。 我的注册人正在我的群工机器上运行。 一切都在容器中运行。 启用粘性负载平衡是解决我的问题的临时修复。 不过,我认为试图在我的群体工作人员身上运行一些types的领事 ,并让注册人自己绑在当地东道主的领事身上。 我相信这可能是在领事github https://github.com/hashicorp/consul/tree/master/bench中描述的“板凳工人”。 我对领事还是比较陌生的,所以我仍然试图把它全部弄清楚。
为了服务发现的目的,build议使用大使模式。 然而,像这个stackoverflow问题的OP一样, 没有看到大使模式如何增强Docker中的模块化/简单化的容器架构 ,我也没有看到大使模式的好处,因为所有的“链接”都是在compose-up期间embedded到容器中的另一方面,我只注意到docker-compose这些network和alias参数,这似乎是服务发现的目的。 也就是说,如果其中一个容器,比如一个数据库容器出现故障,只需要重新启动该容器,其他容器应该能够再次find它,因为它们位于同一个networking中,并且使用相同的别名。 那么问题是,我应该使用大使模式的networking别名模式吗?
我目前有我的docker服务器设置我的Mac。 不幸的是,我不得不重启我的mac,这显然是由docker集群造成的,失去了领导者地位。 是否有可能做一个自我推销,使其中一个节点现在可以成为领导者? ✘ ⚡ root@docker1 ~ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 497ckuujhotoin0a4cqlu3xva * docker1.example.com Ready Active 49fyll1i5v77nyfmy14x7rw5u docker4.example.com Ready Active 4i2m25h3aauv002asadfvdxjh docker6.example.com Ready Active 5050p59139hfa7qs39y4xxxd5 docker5.example.com Ready Active axahq79bu0yutrfv7pzkuzfny docker2.example.com Ready Active d5p49r40rxnzp0htcw8rkophx docker7.example.com Ready Active f57q26vzd4e7u7x1oickxwc5l docker3.example.com Ready Active 我正在使用docker 1.12.3附带的本机docker服务发现
例子: 时刻1:Docker运行容器A监听32781(导出端口) – > 8000(服务端口)通过TCP连接完成领事健康检查(周期10s)。 时刻2:Docker重启集装箱A并在closures时间运行集装箱B(less于10秒)。 现在端口32781是容器B(重用端口),新的容器A有另一个端口。 但下一轮领事健康检查后,港口32781就可以了,领事馆拿A箱就可以了。 如何解决这个问题?
初始化swarm在这个命令之间有什么区别: docker swarm init –advertise-addr <manager-ip> docker -H <worker-ip> swarm join –token <worker-token> 和这个: docker run swarm manage <consul-ip> docker -H <worker-ip> run swarm join –advertise=<worker-ip> <consul-ip> 为什么我们需要swarm图像?
我在理解分离的服务发现服务器的需求时遇到问题,同时我们可以通过任何协议在从节点启动时将从节点注册到主节点。 托pipe另一项服务似乎对我来说是多余的。
目标:从phpapp容器提供的web页面对http:// $ IP:$ PORT / api / container.json进行XHR调用, 而不用为microservice api容器的IP和端口硬编码环境variables 。 http:// CONSULHOST:8500 / v1 / catalog / service / api将为我的API微服务公开configuration。 例: [{"Node":"node", "Address":"123.1.2.3", "ServiceID":"163b5be3-5450-4cac-8416-c1630723bc42-n1:microlith_micro-hipchat_1:443", "ServiceName":"hipchat", "ServiceTags":["primary"], "ServiceAddress":"123.234.234.234", "ServicePort":32772 }] 我正在寻找从该API端点上面列出的ServiceAddress和ServicePort端口,通过在phpapp Docker容器中dynamic调用API而不用硬编码信息。 然后,我可以在前端 Web浏览器中将此信息用作对http:// IP_OF_APP_CONTAINER的PUBLIC调用:PUBLIC_PORT / api / container.json 我已经安装了注册器的 领事 ,都在Docker Swarm中工作。 我不想为我的微服务configuration硬编码。它必须使用Consul或环境dynamic创build。 我不想对Consul IP进行编码。 它可以以某种方式传递,但我必须能够通过bash构build脚本来完成。 phpapp容器被链接到api容器,但是这似乎没有暴露前端端口,只有IP。 我做了一个我的用例图: docker-compose -> swarm -> phpapp container […]
我正在开发Wildfly Swarm应用程序,我想用Consul作为我的服务发现。 所以我添加了拓扑 – @Advertise("service-name")分数,在我的端点中设置了我的Consulpath到project-defaults.yml并添加了@Advertise("service-name") 。 如果我开始使用我的应用程序 java –jar my-swarm-app.jar 一切正常。 我的项目defaults.yml: service: catalog: service-name: "service-name" swarm: port: offset: 501 consul: url: "http://172.30.3.80:8500" 但是,当我用这个Dockerfile将我的胖jar包装到Docker镜像中时: FROM openjdk:8-jre-alpine ADD my-swarm-app.jar /opt/my-swarm-app.jar EXPOSE 8581 ENTRYPOINT ["java", "-jar", "-Djava.net.preferIPv4Stack=true", "/opt/my-swarm-app.jar"] build立它: docker build -f Dockerfile -t my-swarm-app . 像这样运行: docker run -p 8581:8581 my-swarm-app 我得到以下exception: 2017-09-26 15:17:54,240 ERROR [org.jboss.msc.service.fail] […]
我正在为领事做一个容器,而且这个输出一直没有成功,好笑,我真的不认为这是一个错误 Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents) 以下是我正在使用的命令: docker container run –net host –name consul-server -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' -e CONSUL_BIND_INTERFACE='eth0' consul agent -server -client 0.0.0.0 -dns-port 53 -bootstrap-expect 1 -ui -datacenter dc1 -v "/var/lib/consul:/consul/data" -data-dir /var/lib/consul 这是一个单一的节点全新安装与registry的最新版本,所以没有升级或版本不匹配与任何代理/客户端在这里发生。
我希望能够从docker容器中获得在同一个dockernetworking上运行的所有容器的列表。 由于内置的dockerDNS可以给我的IP地址,如果我有主机名,它似乎应该能够给我一个主机名列表(也许DNS不能这样做,我不知道)。 其他方法,我想到的容器列表: 将docker socket安装到容器中并使用docker ps 。 就安全性而言,这不是一个好主意。 使用–link我相信在/etc/hosts放置条目的链接。 然后,我可以从那里读取它们,但是这样做的目的是失败的,因为当我启动容器时,我将不得不知道主机名。 我正在寻求避免使用外部服务发现机制,但我将不胜感激所有关于如何获得容器列表的build议。