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的一部分,如下

  1. FROM ubuntu
  2. MAINTAINER Eystein Måløy Stenberg <eytein.stenberg@gmail.com>
  3. RUN apt-get -y install wget lsb-release unzip
  4. # install latest CFEngine
  5. RUN wget -qO- http://cfengine.com/pub/gpg.key | apt-key add -
  6. RUN echo "deb http://cfengine.com/pub/apt $(lsb_release -cs) main" > /etc/apt/sources.list.d/cfengine-community.list
  7. RUN apt-get update
  8. RUN apt-get install cfengine-community
  9. # install cfe-docker process management policy
  10. RUN wget --no-check-certificate https://github.com/estenberg/cfe-docker/archive/master.zip -P /tmp/ && unzip /tmp/master.zip -d /tmp/
  11. RUN cp /tmp/cfe-docker-master/cfengine/bin/* /var/cfengine/bin/
  12. RUN cp /tmp/cfe-docker-master/cfengine/inputs/* /var/cfengine/inputs/
  13. RUN rm -rf /tmp/cfe-docker-master /tmp/master.zip
  14. # apache2 and openssh are just for testing purposes, install your own apps here
  15. RUN apt-get -y install openssh-server apache2
  16. RUN mkdir -p /var/run/sshd
  17. RUN echo "root:password" | chpasswd # need a password for ssh
  18. ENTRYPOINT ["/var/cfengine/bin/docker_processes_run.sh"]

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

测试容器

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

  1. 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:

  1. ssh -p222 root@127.0.0.1
  2. ps -ef
  3. UID PID PPID C STIME TTY TIME CMD
  4. 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
  5. root 18 1 0 07:48 ? 00:00:00 /var/cfengine/bin/cf-execd -F
  6. root 20 1 0 07:48 ? 00:00:00 /usr/sbin/sshd
  7. root 32 1 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
  8. www-data 34 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
  9. www-data 35 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
  10. www-data 36 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
  11. root 93 20 0 07:48 ? 00:00:00 sshd: root@pts/0
  12. root 105 93 0 07:48 pts/0 00:00:00 -bash
  13. root 112 105 0 07:49 pts/0 00:00:00 ps -ef

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

  1. service apache2 status
  2. Apache2 is running (pid 32).
  3. service apache2 stop
  4. * Stopping web server apache2 ... waiting [ OK ]
  5. service apache2 status
  6. Apache2 is NOT running.
  7. # ... wait up to 1 minute...
  8. service apache2 status
  9. Apache2 is running (pid 173).

选配你的应用程序

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

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

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