【问题标题】:Service seems not be able to break out of docker-container服务似乎无法脱离 docker-container
【发布时间】:2018-08-06 09:58:53
【问题描述】:

我有一个 go-micro 服务,我希望它在容器中运行的 Consul 上注册。仅从命令提示符执行此操作时,它运行良好。我检查了 consul-container 的日志,发现一切正常。注册和注销:

 2018/08/06 08:54:44 [WARN] agent: Service name "myservice.ucum-service" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.
 2018/08/06 08:54:44 [INFO] agent: Synced service "myservice.ucum-service-5d4543b5-9956-11e8-a484-5404a6f49407"
 2018/08/06 08:54:44 [INFO] agent: Synced check "service:myservice.ucum-service-5d4543b5-9956-11e8-a484-5404a6f49407"
 2018/08/06 08:54:53 [INFO] agent: Deregistered service "myservice.ucum-service-5d4543b5-9956-11e8-a484-5404a6f49407"
 2018/08/06 08:54:53 [INFO] agent: Deregistered check "service:myservice.ucum-service-5d4543b5-9956-11e8-a484-5404a6f49407"

如您所见,它抱怨无效字符。我不知道这意味着什么,但它运行良好,我可以毫无问题地从服务客户端运行我的测试。所以我们可以假设 Consul 容器运行良好。

但是现在我的问题。我也想在容器中运行服务,但出现了问题。这是我的服务 Dockerfile:

FROM debian:stretch
MAINTAINER Bert Verhees "xxxxx@xxxxx.xx"
ADD archibold_ucum_service /archibold_ucum_service
ADD data/ucum-essence.xml /data/ucum-essence.xml
ENTRYPOINT ["/archibold_ucum_service", "-ucumfile=/data/ucum-essence.xml"]

如您所见,服务需要以参数启动,这也没有问题。

当我启动这个容器时,它似乎运行良好,但是当我查看 consul-logs 时,它从未见过它。服务容器的日志告诉我原因。我是这样启动容器的:

docker run -d --name=ucum_micro_service ucum_micro_service

容器 ID 非常好。所以看起来不错,但是查看日志,会发生这种情况:

2018/08/06 09:51:42 Listening on [::]:46517
2018/08/06 09:51:42 Broker Listening on [::]:38283
2018/08/06 09:51:42 Registering node: myservice.ucum-service-52a66d2c-995e-11e8-bb3a-0242ac110002
2018/08/06 09:51:42 Put http://127.0.0.1:8500/v1/agent/service/register: dial tcp 127.0.0.1:8500: connect: connection refused

所以我的想法是它无法突破容器。但是我该如何解决这个问题呢?

非常感谢您的帮助,谢谢

【问题讨论】:

  • 当我过去这样做时,我使用 Consul 健康检查来查找机器上正在运行的内容,而不是让服务将自己的状态推送到 Consul,这在很大程度上避免了这个问题。我很确定“无效字符”是“。”并且 Consul 不会在其内部 DNS 中提供子域(您不能拥有 myservice.ucum-service.service.consul DNS 名称)。
  • 我有来自 go-micro 示例的 dot-build 子域。我是这么认为的,它是点,因为错误消息很清楚。现在我确定了。谢谢。我会清理的。
  • 我想知道谁在没有任何评论的情况下否决了这个问题,我想知道为什么。我认为stackoverflow不应该允许这样做。它不鼓励人们在 stackoverflow 上保持活跃。

标签: docker dockerfile consul go-micro


【解决方案1】:

除非您在 docker run 命令中使用 --network=host,否则容器中的 localhost 与您机器上的 localhost 不同。就像 docker 为您的容器创建一个“单独的”文件系统一样,它对网络也是如此。

所以要么你使用docker run --network=host -d --name=ucum_micro_service ucum_micro_service,你也可以在一个容器中运行其他服务并使用docker网络/链接或类似的东西来连接它们,或者你使用你机器的公共IP(你可以作为参数传递) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2018-12-14
    • 2023-03-05
    相关资源
    最近更新 更多