gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:04:05 28 4
gpt4 key购买 nike

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

我的情况是,在我们公司,我们有很多应用程序,我们知道实际上我们需要将它们全部部署在同一台服务器中,并且我们需要使部署非常简单,因此逐个镜像部署不是我们想要的,所以,我想知道,我怎样才能将它们分组?只有一个命令,一切都应该被执行?

最佳答案

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 您需要名为 的主 Supervisor 配置文件的文件夹supervisord.conf 其中包含:
[supervisord]                                                                                                                                                                 
nodaemon=true

在同一 conf.d 在文件夹中,您要运行的每个应用程序都有 1 个配置文件,名为 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

关于docker - 如何在单个 docker 容器中运行多个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49658754/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com