Process Management with CFEngine

创建Docker容器来管理进程

docker监控容器的进程从开始到结束的整个过程,通过在Docker容器内引入CFEngine,我们可以解决以下几个问题:

  • 可以轻松的在一个容器内启动多个进程,并且所有进程将呗自动管理,与标准的docker run 命令。

  • 如果管理进程终止或者崩溃,CFEngine会在一分钟内重新启动它。

  • 容器本身的生存是入住在CFEgine的后台进程中生存的,CFEgine中,我们能够分离正常运行的服务的容器

如何工作

CFEngine,和cfe-docker融合使用,将会作为Dockerfile中安装的一部分。来用作创建我们的Docker的CFEngine镜像。

Dockerfile的ENTRYPOINT需要任意数量的命令(与任何需要的参数)作为参数,当我们运行docker容器,这些会被写如到CFEngine策略中并且由CFEngine接管,以确保容器运行在一个理想的过程中

如果没有找到basename ,CFEngine会扫描进程表通过ENTRYPOINT给的基本命令来生成basename ,并在进程启动时运行命令。举例,如果我们启动容器使用 docker run "/path/to/my/application parameters",CFEngine将会查找一个进程命名的应用并运行命令,如果在进程表的任何时间内没有找到这个进程,CFEngine将会再次执行/path/to/my/application parameters来启动应用,它会检查进程表在每一分钟内发生的变化。

请注意,因此重要的是启动你的应用程序来离开相对文件的命令,如果你需要你可以做一些小CFEngine策略调整,使其更加灵活

使用

这个例子假设你已经安装好了docker并且正常运行,我们将会在一个容器中安装和管理apache2和sshd。

这里有三个步骤:

  • 在容器内安装CFEngine。

  • 复制CFEngine进程管理策略到已经安装的CFEngine容器内。

  • 启动你的应用进程作为docker运行的一部分

创建一个镜像容器

前两个步骤可以作为Dockerfile的一部分,如下

FROM ubuntu
MAINTAINER Eystein Måløy Stenberg <eytein.stenberg@gmail.com>

RUN apt-get -y install wget lsb-release unzip

# install latest CFEngine
RUN wget -qO- http://cfengine.com/pub/gpg.key | apt-key add -
RUN echo "deb http://cfengine.com/pub/apt $(lsb_release -cs) main" > /etc/apt/sources.list.d/cfengine-community.list
RUN apt-get update
RUN apt-get install cfengine-community

# install cfe-docker process management policy
RUN wget --no-check-certificate https://github.com/estenberg/cfe-docker/archive/master.zip -P /tmp/ && unzip /tmp/master.zip -d /tmp/
RUN cp /tmp/cfe-docker-master/cfengine/bin/* /var/cfengine/bin/
RUN cp /tmp/cfe-docker-master/cfengine/inputs/* /var/cfengine/inputs/
RUN rm -rf /tmp/cfe-docker-master /tmp/master.zip

# apache2 and openssh are just for testing purposes, install your own apps here
RUN apt-get -y install openssh-server apache2
RUN mkdir -p /var/run/sshd
RUN echo "root:password" | chpasswd  # need a password for ssh

ENTRYPOINT ["/var/cfengine/bin/docker_processes_run.sh"]

通过在你的工作目录保存Dockerfile,你可以通过docker build命令来创建你的容器,docker build -t managed_image.

测试容器

启动容器apache2和sshd运行和管理,转发端口SSH实例:

docker run -p 127.0.0.1:222:22 -d managed_image "/usr/sbin/sshd" "/etc/init.d/apache2 start"

现在我们可以看到cfe-docker集成的好处,它允许我们使用docker run命令启动多个进程。

我们现在可以登录我们新创建容器并且发现apache2和sshd正在运行,我们需要在上边的Dockerfile文件设置root密码来登录ssh:

ssh -p222 root@127.0.0.1

ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 07:48 ?        00:00:00 /bin/bash /var/cfengine/bin/docker_processes_run.sh /usr/sbin/sshd /etc/init.d/apache2 start
root        18     1  0 07:48 ?        00:00:00 /var/cfengine/bin/cf-execd -F
root        20     1  0 07:48 ?        00:00:00 /usr/sbin/sshd
root        32     1  0 07:48 ?        00:00:00 /usr/sbin/apache2 -k start
www-data    34    32  0 07:48 ?        00:00:00 /usr/sbin/apache2 -k start
www-data    35    32  0 07:48 ?        00:00:00 /usr/sbin/apache2 -k start
www-data    36    32  0 07:48 ?        00:00:00 /usr/sbin/apache2 -k start
root        93    20  0 07:48 ?        00:00:00 sshd: root@pts/0
root       105    93  0 07:48 pts/0    00:00:00 -bash
root       112   105  0 07:49 pts/0    00:00:00 ps -ef

如果我们停止apache2,CFEngine会在一分钟内重启它。

service apache2 status
 Apache2 is running (pid 32).
service apache2 stop
         * Stopping web server apache2 ... waiting    [ OK ]
service apache2 status
 Apache2 is NOT running.
# ... wait up to 1 minute...
service apache2 status
 Apache2 is running (pid 173).

选配你的应用程序

为了确保你的应用程序以相同的方式得到管理,目前你可以在上边的例子中做两处调整:

  • 在上边的Dockerfile安装你的应用来代替apache2和sshd。

  • 当你docker run启动容器, 则在你的应用程序内指定命令参数,而不是apache2和sshd

powered by Gitbook 该教程制作时间: 2015-02-11 09:38:24