• 使用Supervisor管理Docker容器多个进程


    开始之前
    在上一篇文章 <<为什么需要自定义一个基础镜像?>> 介绍如何实现一个php基础镜像,我们在PHP官方镜像之上,添加一些项目必用的php扩展模块,并且安装了 nginx、supervisor 软件,接下来本篇文章中介绍 如何使用 supervisor 在容器中运行与管理 nginx 与 php-fpm 进程(多进程)。

    默认情况下 docker 容器只运行单个进程(docker推崇的理念),但是项目需要两个服务(php-fpm、nginx),所以需要第三方的进程管理软件,在docker中较流行的方案是使用 supervisor 软件管理多个进程。

    环境描述
    构建目录
    tree demo/

    demo/
    ├── conf
    │ ├── default.conf
    │ ├── nginx.conf
    │ ├── php-docker.conf
    │ ├── php.ini
    │ ├── php-www.conf
    │ └── supervisord.conf
    ├── Dockerfile
    └── src
    └── demo.tar.gz

    2 directory, 8 files
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    代码文件
    src 目录存放项目代码压缩包
    demo.tar.gz # 文件由 jenkins CI工具生成。
    1
    2
    配置文件
    conf 目录保存着配置文件
    nginx 配置文件:
    default.conf # 虚拟主机配置文档
    nginx.conf # nginx主配置文档

    php 相关配置文件:
    php.ini # php主配置文档
    php-docker.conf # php-fpm 配置
    php-www.conf # php-fpm 文档

    supervisor 配置文件:
    supervisord.conf # supervisor配置文档
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    nginx 与 php 配置文件可以保持默认或按实际需求配置。
    如需要 php-fpm 配置文件,可以通过命令获得容器内的配置文件,例如 www.conf 文件:

    docker run --rm php:5.6-fpm cat /usr/local/etc/php-fpm.d/www.conf >> ./my.conf
    1
    下面重点说一下 Dockerfile 与 supervisord 。

    操作步骤
    先来看下 Dockerfile
    cat demo/Dockerfile

    # 使用自定义项目基础镜像 demo-base:0.0.1
    FROM demo-base:0.0.1
    MAINTAINER dongnan #<@微信公众号:运维录>

    # php
    COPY conf/php.ini /usr/local/etc/php/php.ini
    COPY conf/php-www.conf /usr/local/etc/php-fpm.d/www.conf
    COPY conf/php-docker.conf /usr/local/etc/php-fpm.d/docker.conf

    # nginx
    COPY conf/nginx.conf /etc/nginx/nginx.conf
    COPY conf/default.conf /etc/nginx/conf.d/default.conf

    # supervisor
    RUN mkdir -p /var/log/supervisor
    && mkdir -p /var/log/php
    COPY conf/supervisord.conf /etc/supervisor/supervisord.conf

    # code 放到 nginx根目录,目录位置应与虚拟主机配置一致
    # ADD 指令自动解压缩包,RUN 指令执行权限设置命令
    WORKDIR /var/www/
    ADD src/demo.tar.gz /var/www/
    RUN chown -R www-data.www-data .

    # statement port
    EXPOSE 80

    # cmd
    CMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    supervisor 配置文件
    cat demo/conf/supervisord.conf

    [supervisord]
    nodaemon=true
    pidfile=/var/run/supervisord.pid
    logfile=/var/log/supervisor/supervisord.log

    [program:nginx]
    command=/usr/sbin/nginx -g "daemon off;"

    [program:php-fpm]
    command=/usr/local/sbin/php-fpm -c /usr/local/etc/php/php.ini -y /usr/local/etc/php-fpm.conf -F
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    supervisor 配置参数

    nodaemon=true # 在前台运行 supervisord 主进程
    pidfile/logfile # 指定文件位置
    [program:xxx] # 定义被 supervisord 管理的应用程序
    command # 程序的启动命令,需要使用绝对路径
    nginx -g "daemon off;" # 在前台运行 nginx
    php-fpm ... -F # 在前台运行 php-fpm
    1
    2
    3
    4
    5
    6
    构建项目镜像
    cd demo/
    docker build -t demo-project:0.0.1 .

    Sending build context to Docker daemon 3.2 mb
    # 省略....
    Successfully built ai43125ed1u0
    1
    2
    3
    4
    5
    6
    验证镜像
    # 创建容器
    docker run -d --name test demo-project:0.0.1
    9a40982510xxxxxxx9d227d3456b2261c6451109020a

    # 容器进程
    docker inspect --format="{{.State.Pid}}" test
    30878

    # 由 supervisor 管理的 nginx 与 php-fpm 进程
    pstree 30878
    supervisord─┬─nginx───2*[nginx]
    └─php-fpm───2*[php-fpm]

    # 也可使用`docker top xxx`命令查看,不过输出内容太多,微信文章折行严重。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    小结
    最后来总结下文章中的知识点

    基础镜像作用是为项目镜像提供支持,并在基础镜像之上添加项目代码,完成项目镜像构建工作。
    使用 supervisor 在容器中运行管理多个进程,supervisord 将作为容器中的第一个进程。
    supervisord 运行后,被管理的进程当作 supervisord的子进程来启动,并监控子进程状态,如果异常退出则自动重启。
    ————————————————
    版权声明:本文为CSDN博主「yunweilu2020」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yunweilu2020/java/article/details/103700109

  • 相关阅读:
    RESTful风格的API
    案例:toDoList
    jQuery中的Ajax
    php 使用kafka
    crontab不执行
    php两种实现守护进程的方式
    crontab不执行脚本,手动调测又没有任何问题
    centos7 安装跳板机(堡垒机)
    Ubuntu修改默认键盘布局的方法
    openresty nginx升级版
  • 原文地址:https://www.cnblogs.com/ExMan/p/12982761.html
Copyright © 2020-2023  润新知