是否可以生成一个包含许多应用程序的docker镜像?或至少一个图像,一组很多图像?
我的情况是,在我们公司,我们有许多应用程序,我们知道我们需要将它们全部部署在同一台服务器上,我们需要使部署非常简单,因此按图像部署图像不是什么我们想要,所以,我想知道,我怎么能把它们分组?只有一个命令,一切都应该被执行?
答案 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