【问题标题】:Consul and Tomcat in the same docker containerConsul 和 Tomcat 在同一个 docker 容器中
【发布时间】:2016-04-01 23:31:06
【问题描述】:

这是一个由两部分组成的问题。

第一部分: 在同一个 docker 容器中运行 Consul 和 Tomcat 的最佳方法是什么?

我已经构建了自己的映像,正确安装了 Tomcat 和 Consul,但我不确定如何启动它们。我尝试将两个调用都作为 CMD 放在 Dockerfile 中,但没有成功。我试图将 Consul 作为 ENTRYPOINT (Dockerfile) 和 Tomcat,以便在“docker run”命令中调用。反之亦然,但我觉得这也不是什么好办法。

docker 将在一个 AWS 实例中运行。每个 docker 容器都将 Consul 作为服务器运行,以在另一个 AWS 实例中注册自己。 Consul 和 Consul-template 将被集成到适当的负载平衡中。这样,当我插入或拔出容器时,我的 HAproxy 实例将能够正确转发请求。

第二部分: 在我所做的个别测试中,docker 容器能够访问我的主 Consul 服务器(领导者),但它未能将自己注册为“活动”节点。

阅读 Consul 服务器上的日志,我认为是我公开和发布哪些端口的问题。在 AWS 中,我已经允许在这个特定安全组中的实例之间通过 TCP 和 UDP 的所有端口进行通信。

您知道我应该公开和发布哪些端口以允许独立 consul(aws 实例)和 consul 服务器(在 aws 容器内的 docker 容器内运行)之间进行正确通信吗?运行 docker 容器的命令是什么: docker run -p 8300:8300 .........

谢谢。

【问题讨论】:

  • 我的 AWS 实例的 IP 为 172.30.0.165。当 docker 运行时,它有第二个 IP 地址。 172.17.0.2。此外,我构建的 docker 映像暴露了以下端口:8080 53/udp 8300 8301 8301/udp 8302 8302/udp 8400 8500 8600 8600/udp。我运行容器,将以下端口发布为“docker run -p 8300:8300 -p 8301:8301 -p 8301:8301/udp -p 8302:8302 -p 8302:8302/udp -p 8400:8400 -p 8500: 8500 -p 53:53/udp -p 8600:8600/udp 容器标签”。从另一个 AWS 实例,我无法使用 telnet 访问端口 8301、8302。我做错了什么?
  • 不回答,但 Docker 最佳实践是 Caas:容器即服务。这实际上意味着您不应该在单个容器中运行两个服务。 Just yesterday a video has been released on blog.docker.com: Docker Containers-as-a-Service Walkthrough。建议你使用 [Docker Compose ](docs.docker.com/compose) 同时启动这两个服务并管理多容器应用程序。
  • 我完全理解 Caas 的想法,但我觉得它有点自相矛盾。我看不到在没有服务本身可用的情况下运行服务发现系统的优势。我的意思是,让容器运行领事服务器但“什么都不做”的目的是什么?
  • 它什么都不做,它与它所宣传的服务耦合(感谢 compose)。
  • 好的。谢谢你。任何想法为什么领事领导无法联系到 docker 容器内的领事?

标签: docker load-balancing


【解决方案1】:

我会使用 ENTRYPOINT 在 docker run 上启动脚本。

类似

ENTRYPOINT myamazingbashscript.sh

语法可能是关闭的,但你明白了

脚本应该启动这两个服务,最后应该尾 -f tomcat 日志(或任何日志)。

tail -f 将阻止容器退出,因为 tail -f 命令永远不会退出,它还可以帮助你查看 tomcat 正在做什么

Do ... docker logs -f 在 docker run 后查看日志

注意,因为容器没有退出,你可以用 ... docker exec -it containerName bash 执行到它

这让您可以在容器内闻一闻

通常不是在一个容器中拥有两个服务的最佳方法,因为它破坏了关注点的分离和可重用性,但你可能有正当的理由

使用 docker build 进行构建,然后按照您的说明使用 docker run 运行。

如果您决定采用 2 容器解决方案,那么您将需要公开容器之间的端口以允许它们相互通信。您可以使用 volumes_from 在容器之间共享文件

【讨论】:

  • 谢谢。它帮助很大!上帝也祝福你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2019-06-26
相关资源
最近更新 更多