如何在单个docker容器中运行多个进程

时间:2018-04-04 19:15:43

标签: docker dockerhub docker-image

是否可以生成一个包含许多应用程序的docker镜像?或至少一个图像,一组很多图像?

我的情况是,在我们公司,我们有许多应用程序,我们知道我们需要将它们全部部署在同一台服务器上,我们需要使部署非常简单,因此按图像部署图像不是什么我们想要,所以,我想知道,我怎么能把它们分组?只有一个命令,一切都应该被执行?

1 个答案:

答案 0 :(得分:2)

Docker的最佳实践是为堆栈上运行的每个进程使用一个单独的容器(即使用单独的Dockerfile创建的单独映像)。

所有这些容器都在同一个docker服务器上创建/部署,因此最终整个堆栈在同一台服务器上以容器化的方式运行。

但是,如果要将多个应用程序添加到同一个容器中,可以通过添加所有命令来安装,配置,将这些应用程序启动到单个Dockerfile中,并使用Supervisor在容器启动时启动应用程序。创建

以下是我通常使用的Dockerfile内容示例:

# Inherit ubuntu base image
FROM ubuntu:latest

# Update linux package repo and install desired dependencies
RUN apt-get update -y
RUN apt-get -y install nginx git supervisor etc... (install multiple apps here)

# Create new linux group and user to own apps
RUN groupadd --system apps
RUN useradd --system --gid apps --shell /bin/bash --home /apps

# Create directory for app logs
RUN mkdir -p /apps/logs

# RUN any other configuration or dependency setup commands for apps
RUN ...

# Copy in any static dependencies
COPY xxx /apps/...

# Copy in supervisor configuration files
COPY ./supervisord/conf.d/* /etc/supervisor/conf.d/

# Open connectivity on container port X to the docker host
EXPOSE X

# Create empty log files
RUN touch /apps/logs/xxxx.log

# Set app directory owners and permissions
RUN chown -R apps:apps /apps
RUN chmod -R u+rwx apps
RUN chmod -R g+rx apps
RUN chmod -R o+rx apps

# Run supervisor configuration file on container startup
CMD ["supervisord", "-n"]

这将启动容器创建时Supervisor配置文件中定义的所有应用程序。请注意上面的脚本,在与Dockerfile相同的目录中,您具有Supervisor配置的静态目录结构,即您具有以下文件夹结构:./supervisord/conf.d/

conf.d 文件夹中,您需要名为 supervisord.conf 的主Supervisor配置文件,其中包含:

[supervisord]                                                                                                                                                                 
nodaemon=true

在同一个 conf.d 文件夹中,您将为每个要运行的应用创建一个配置文件,名为 app_name.conf

[program:appname]                                                                                                                                                               
command = /usr/sbin/command_name -flags "keywords"
autostart = true                                                      ; Start app automatically
stdout_logfile = /apps/logs/xxxx.log     ; Where to write log messages
redirect_stderr = true                                                ; Save stderr in the same log 
username = apps                                                 ; Specify user to run nginx
autorestart = true                                                    ; Restart app automatically