当前位置: 首页 > 知识库问答 >
问题:

我可以在Docker容器中运行多个程序吗?

谭飞掣
2023-03-14

我试图从部署一个打算在桌面用户上运行的应用程序的角度来理解Docker。我的应用程序只是一个烧瓶网络应用程序和mongo数据库。通常情况下,我会在虚拟机中安装这两个程序,并将主机端口转发给来宾网络应用程序。我想尝试一下Docker,但我不确定我是如何使用多个程序的。文档说只能有ENTRYPOINT,所以我怎么才能拥有Mongo和我的烧瓶应用程序。或者它们需要在不同的容器中,在这种情况下,它们如何相互通信,这如何使分发应用程序变得容易?

共有3个答案

施兴言
2023-03-14

我有类似的要求运行一个LAMP堆栈,Mongo DB和我自己的服务

Docker是基于操作系统的虚拟化,这就是为什么它将容器隔离在一个正在运行的进程周围,因此它至少需要一个在前台运行的进程。

因此,您提供自己的启动脚本作为切入点,因此,您的启动脚本成为扩展的Docker映像脚本,在其中,您可以堆叠任意数量的服务,直到至少一个前景服务开始,这也接近尾声

因此,我的Docker图像文件最后有两行:

COPY myStartupScript.sh /usr/local/myscripts/myStartupScript.sh
CMD ["/bin/bash", "/usr/local/myscripts/myStartupScript.sh"]

在我的脚本中,我运行所有的MySQL、MongoDB、Tomcat等。最后,我将我的Apache作为前台线程运行。

source /etc/apache2/envvars
/usr/sbin/apache2 -DFOREGROUND

这使我能够启动所有服务,并使html" target="_blank">容器保持活动状态,最后启动的服务位于前台

希望有帮助

更新:自从我上次回答这个问题以来,新的东西出现了,比如Docker撰写,它可以帮助你在自己的容器上运行每个服务,但是将它们作为这些服务之间的依赖关系绑定在一起,尝试了解更多关于docker撰写和使用它,这是更优雅的方式,除非你的需求与它不匹配。

柳英资
2023-03-14

我强烈反对以前的一些建议在同一个容器中运行两个服务的解决方案。留档中明确指出这不是推荐的:

通常建议您通过每个容器使用一种服务来分离关注的区域。该服务可能会进入多个进程(例如,ApacheWeb服务器启动多个工作进程)。有多个进程是可以的,但是为了从Docker中获得最大的好处,避免一个容器负责整个应用程序的多个方面。可以使用用户定义的网络和共享卷连接多个容器。

监管者或类似程序有很好的用例,但是运行网络应用程序数据库不是其中的一部分。

你肯定应该使用docker compose来完成这项工作,并协调多个具有不同职责的容器。

乐正宏深
2023-03-14

只能有一个ENTRYPOINT,但是这个目标通常是一个脚本,它可以启动所需的尽可能多的程序。您还可以使用例如Supervisord或类似的工具来处理在单个容器中启动多个服务的问题。这是一个在单个容器中运行mysql、apache和wordpress的docker容器的例子。

比如说,您有一个数据库供单个web应用程序使用。那么,在一个容器中运行这两个组件可能会更容易。

如果您有一个由多个应用程序使用的共享数据库,那么最好在自己的容器中运行数据库,并在各自的容器中运行应用程序。

当应用程序在不同的容器中运行时,它们如何相互通信至少有两种可能性:

  1. 使用暴露的IP端口并通过它们连接。
  2. 最近的docker版本支持链接。
 类似资料:
  • 我试图从部署一个打算在桌面用户上运行的应用程序的角度来理解Docker。我的应用程序只是一个烧瓶网络应用程序和mongo数据库。通常情况下,我会在虚拟机中安装这两个程序,并将主机端口转发给来宾网络应用程序。我想尝试一下Docker,但我不确定我是如何使用多个程序的。文档说只能有ENTRYPOINT,所以我怎么才能拥有Mongo和我的烧瓶应用程序。或者它们需要在不同的容器中,在这种情况下,它们如何相

  • 问题内容: 我可以在Docker容器中运行Xcode吗?我想码头化一个Xcode CI系统,只是想知道这是否可能。 问题答案: Docker Hackathon 2015的 此回购描述了如何使用Docker 客户端构建和运行iOS应用。那是你追求的吗? 观看视频: 秘诀在于server.js,它实现了REST API以模拟docker服务器。因此,实际上,它实际上并没有在真正的Linux dock

  • 问题内容: 这个问题是我继续研究Docker的一部分,并且在某些方面跟进了我先前的问题之一。我现在已经了解了如何通过将一堆Docker容器链接在一起来获得完整的应用程序堆栈(实际上是微型VPS)。例如,可以创建一个堆栈,为Apache+ PHP5提供一堆扩展名+ Redis + MemCached+MySQL,它们都在Ubuntu上运行,无论是否带有附加数据容器,都可以轻松地序列化用户数据。 一切

  • 问题内容: 如何在Docker容器中运行GUI应用程序? 是否设置了任何图像或其他东西,例如,您可以在Firefox周围添加一个额外的speedbump沙箱? 问题答案: 您可以简单地与Firefox一起安装vncserver :) 我在这里推送了一个图像,vnc / firefox: 该镜像已使用以下Dockerfile生成: 这将创建一个运行VNC的Docker容器,密码为: 对于Docker

  • Docker教程经常说我可以运行更多容器,以提高我的webapp的可用性。然而,这是一个非常宽泛的声明,并没有解释在不同的情况下应该运行多少个容器。我如何知道我是否需要1、5、10、100或1000个容器实例? 示例-我只有一台服务器,正在使用docker运行nginx和php fpm。每个容器一个。有了这个简单的设置,我的webapp就可以正常工作,而且看起来很灵敏。(在同一台服务器上)增加额外

  • 我工作在一个微服务应用程序,有多个服务。我正在使用docker-compose运行不同微服务的实例。我们为每个微服务创建一个映像。如果我改变了一个微服务的代码,我使用'docker-compose down',然后改变更新的微服务的版本,然后使用'docker-compose up'。我认为,应该有一种不使用'docker-compose down'和'docker-compose up'的方法在