zoukankan      html  css  js  c++  java
  • 镜像中使用 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中,报错

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

  • 相关阅读:
    寻找大富翁
    C++ STL sort()函数用法
    众数
    平方因子
    Hdu 1089 A+B for Input-Output Practice (I)
    Hdu 1090 A+B for Input-Output Practice (II)
    Hdu 1083 Courses
    Hdu 1069 Monkey and Banana
    Hdu 1062 Text Reverse
    Hdu 1068 Girls and Boys
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13279129.html
Copyright © 2011-2022 走看看