Docker - 在单个容器中运行两个进程

时间:2016-11-12 15:48:29

标签: ruby-on-rails nginx docker docker-compose microservices

我用Nginx创建了Ruby on Rails项目。 Rails应用程序和Nginx在单独的和链接的容器中运行。这种配置工作正常。然而...

1)是否可以在一个容器中同时运行(Rails / Puma服务器+ Nginx)?

2)Dockerfile中的CMD命令应该如何?

3)我应该使用什么命令作为docker-compose.yml中的“command:”属性?

我认为在单独的容器中运行它们的配置是更好的解决方案,但我想了解所有可能性。

我使用Puma作为Rails的app服务器并运行它我使用命令:bundle exec puma -C config / puma.rb

1 个答案:

答案 0 :(得分:3)

默认情况下,docker监视一个进程,当受监视的进程结束时,容器已完成/重新启动(取决于启动标志)。

有一个特定的发行版旨在做你正在追求的东西,即在docker实例中有多个进程存活,同时监视/重新启动所有进程,这个图像是phusion / baseimage,你可以在这里找到它: https://github.com/phusion/baseimage-docker

在此图像上,您所做的是通过在/ etc / service下创建子目录来创建任意数量的服务,并以CMD身份启动将启动并监视所有服务的人员,如下所示:

# Use phusion/baseimage as base image. To make your builds reproducible, make
# sure you lock down to a specific version, not to `latest`!
# See https://github.com/phusion/baseimage-docker/blob/master/Changelog.md for
# a list of version numbers.
FROM phusion/baseimage:<VERSION>

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]

# ...put your own build instructions here...

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

之后,只需确保在/ etc / service下为每个服务创建一个文件夹,并且里面有一个名为&#34; run&#34;的文件。这将是您的服务的入口点,Dockerfile的一个示例(来自doc):

RUN mkdir /etc/service/memcached
ADD memcached.sh /etc/service/memcached/run

因此,对于您的目标,只需创建几个文件夹+运行文件,一个用于NGINX,另一个用于Rails / Puma服务器,并使用此图像作为基础。