当前位置: 首页 > 面试题库 >

使用主管管理Docker容器的最佳方法

孟意致
2023-03-14
问题内容

我必须在 同一台 服务器上(客户端要求)设置“ dockerized”环境(集成,质量保证和生产)。每种环境的组成如下:

  • Rabbitmq
  • 芹菜
  • 基于python 3的应用程序,称为“ A”(每个环境的特定分支)

在它们之上,jenkins将处理基于CI的部署。

在每个环境中使用一组容器听起来是最好的方法。

但是现在我需要流程经理来运行和监督所有这些:

  • 3个兔子容器,
  • 3个芹菜/花卉容器,
  • 3个“ A”容器,
  • 1个詹金斯容器。

Supervisord似乎是最好的选择,但是在我的测试过程中,我无法“正确”重启容器。这是supervisord.conf的一个片段

[program:docker-rabbit]
command=/usr/bin/docker run -p 5672:5672 -p 15672:15672 tutum/rabbitmq
startsecs=20
autorestart=unexpected
exitcodes=0,1
stopsignal=KILL

因此,我想知道分离每个环境并能够管理和监督每个服务(容器)的最佳方法是什么。

[编辑我的解决方案受到托马斯回应的启发]

每个容器都由一个看起来像

兔子整合

#!/bin/bash

#set -x
SERVICE="rabbitmq"
SH_S = "/path/to_shs"
export MY_ENV="integration"
. $SH_S/env_.sh
. $SH_S/utils.sh

SERVICE_ENV=$SERVICE-$MY_ENV
ID_FILE=/tmp/$SERVICE_ENV.name # pid file

trap stop SIGHUP SIGINT SIGTERM  # trap signal for calling the stop function
run_rabbitmq

$ SH_S / env.sh_ 看起来像:

# set env variable 
...
case $MONARCH_ENV in
    $INTEGRATION)
       AMQP_PORT="5672"
       AMQP_IP="172.17.42.1"
     ...
    ;;
    $PREPRODUCTION)
       AMQP_PORT="5673"
       AMQP_IP="172.17.42.1"
       ...
        ;;
    $PRODUCTION)
        AMQP_PORT="5674"
        REDIS_IP="172.17.42.1"
        ...
esac

$ SH_S / utils.sh 看起来像:

#!/bin/bash

function random_name(){
        echo "$SERVICE_ENV-$(cat /proc/sys/kernel/random/uuid)"
}
function stop (){
        echo "stopping docker container..."
        /usr/bin/docker stop `cat $ID_FILE`
}
function run_rabbitmq (){
        # do no daemonize and use stdout
        NAME="$(random_name)"
        echo $NAME > $ID_FILE
        /usr/bin/docker run -i --name "$NAME" -p $AMQP_IP:$AMQP_PORT:5672 -p $AMQP_ADMIN_PORT:15672 -e RABBITMQ_PASS="$AMQP_PASSWORD" myimage-rabbitmq &
        PID=$!
        wait $PID
}

至少 myconfig.intergration.conf 看起来像:

[program:rabbit-integration]
command=/path/sh_s/rabbit-integration.sh
startsecs=20
priority=90
autorestart=unexpected
exitcodes=0,1
stopsignal=TERM

在我要使用相同容器的情况下,启动功能如下所示:

function _run_my_container () {
    NAME="my_container"
    /usr/bin/docker start -i $NAME &
    PID=$!
    wait $PID
    rc=$?
    if [[ $rc != 0 ]]; then
       _run_my_container 
    fi
}

哪里

function _run_my_container (){
    /usr/bin/docker run -p{} -v{} --name "$NAME" myimage &
    PID=$!
    wait $PID
}

问题答案:

根据其文档,Supervisor要求其管理的进程不得守护进程:

打算在主管下运行的程序不应守护自己。相反,它们应该在前台运行。它们不应与启动它们的终端分离。

这在很大程度上与Docker不兼容,后者的容器是 Docker进程 本身的子 进程 (即,因此不是Supervisor的子 进程 )。

为了能够将Docker与Supervisor一起使用,您可以编写与Docker一起使用的pidproxy程序的等效项。

但是实际上,这两个工具并不是真正设计为可以协同工作,因此您应该考虑更改其中一个:

  • 考虑使用Docker Compose(旨在与Docker配合使用)替换Supervisor
  • 考虑用Rocket替换Docker (它没有“主”进程)


 类似资料:
  • 问题内容: 我已经和Docker玩了一段时间,在处理持久性数据时继续寻找相同的问题。 我创建我的文件并公开一个卷,或使用它[在容器中安装主机文件夹]。 我应该对主机上的共享卷应用什么权限? 我可以想到两种选择: 到目前为止,我已经授予所有人读取/写入访问权限,因此我可以从Docker容器写入该文件夹。 将用户从主机映射到容器,以便我可以分配更多的细化权限。不确定这是否可能,但尚未找到很多相关信息。

  • 我使用Docker已经有一段时间了,并且在处理持久数据时不断发现相同的问题。 我创建并公开卷,或者使用在容器中装入主机文件夹。 我应该对主机上的共享卷应用什么权限? 我能想到两个选择: > 到目前为止,我已经为每个人提供了读/写访问权限,因此我可以从Docker容器写入文件夹。 将用户从主机映射到容器中,这样我就可以分配更多的粒度权限。不确定这是可能的,但还没有找到很多关于它。到目前为止,我所能做

  • 创建容器docker run 创建容器 # docker run --name rhel7.4 registry.access.redhat.com/rhel7-atomic:7.4-119docker run 创建容器并进入命令行 # docker run --name rhel7.4 -it registry.access.redhat.com/rhel7-atomic:7.4-119 /b

  • 问题内容: 管理数据库更改的最佳方法是什么?无论数据库客户端的语言如何,我都需要一个解决方案。我还希望能够在那些更改中使用特定的数据库功能,例如存储过程,触发器等。 问题答案: 首先,请确保您已编写了完整的数据库构建脚本,以便可以根据需要重建数据库。 然后,应将每个更改写为更新脚本。这样,您可以针对数据库分别运行每个更改。 将更改提交到代码库后,将更改脚本与构建过程合并,使其自动发生…然后将更改脚

  • 我有什么可用的选择来使用GWT来实现这一点?

  • 在本地主机的LXC容器中是否有用于管理节点的傀儡模块?例如:我有一个带有50个LXC容器的主机,我想直接从主机管理所有这些容器,而不是从另一个带有的LXC容器。