使用 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中,报错
临时处理办法使用/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