【问题标题】:Docker - run two processes in single containerDocker - 在单个容器中运行两个进程
【发布时间】:2017-03-26 15:57:22
【问题描述】:

我已经使用 Nginx 创建了 Ruby on Rails 项目。 Rails 应用程序和 Nginx 在单独和链接的容器中运行。此配置工作正常。不过……

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

2) Dockerfile 中的 CMD 命令应该是怎样的?

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

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

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

【问题讨论】:

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


    【解决方案1】:

    默认情况下,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 下为每个服务创建一个文件夹,并且其中有一个名为“run”的文件。这将是您的服务的入口点,Dockerfile 的一个示例(来自文档):

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

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

    【讨论】:

    • 谢谢!这就是我需要的。
    猜你喜欢
    • 2018-09-14
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多