镜像中使用 Supervisor 来管理进程

使用 Supervisor 来管理进程

Docker容器在启动的时候开启单个进程,比如,一个ssh或者appache的daemon服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,如上小节的run.sh脚本,启动的时候直接启动这个脚本,另外就是安装进程管理工具。

本小节将介绍使用进程管理工具supervisor来管理容器中的多个进程。使用supervisor可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用ssh和apache服务。

① 配置dockerfile

Dockerfile文件内容:

#设置继承镜像
FROM docker.io/centos:7
#提供一些作者的信息
MAINTAINER zhaobw@golaxy.cn
#安装epel源
RUN yum install -y epel-release
RUN yum install -y vim
#安装 ssh 服务
RUN yum install -y openssl
RUN yum install -y openssh-server
RUN /usr/sbin/sshd-keygen -A
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -ri ‘s/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g‘ /etc/pam.d/sshd
#复制配置文件到相应位置
ADD authorized_keys /root/.ssh/authorized_keys
#安装apache和supervisor
RUN yum install -y httpd supervisor
RUN mkdir -p /var/log/supervisor
#复制配置文件到相应位置
COPY supervisord.conf /etc/supervisord.d/
#开放端口
EXPOSE 22 80
#设置自启动命令
CMD ["/usr/bin/supervisord -c /etc/supervisord.conf"]
RUN unlink /run/supervisor/supervisor.sock

supervisord.conf文件内容:

[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"

启动容器常见的错误

Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting

解决方法:

find / -name supervisor.sock

unlink /name/supervisor.sock

能否在启动容器的时候处理

截图是尝试将处理命令写入到dockerfile中,报错

镜像中使用 Supervisor 来管理进程

临时处理办法使用/usr/sbin/init启动容器,再进入到容器手工处理故障,并启动容器。

Supervisor详细教程请参考https://blog.csdn.net/xyang81/article/details/51555473

② 创建镜像并测试

创建镜像

docker build -t test/supervisord .

启动容器

docker run -p 22 -p 80 -t -i test/supervisor

按官方这种启动方式启动会报错,使用下边启动方式,启动一个可以执行systemctl的容器

docker run -d -e "container=docker" --privileged=true -p 22 -p** **80 --name testsupervisor** **test:supervisor /usr/sbin/init &

docker exec -ti 58931d386829 /bin/bash

镜像中使用 Supervisor 来管理进程

上一篇:Shell一句话生成随机mac地址方法


下一篇:简单shellcode学习