• 1
  • 2
  • 3
  • 4
  • 5
阿里云应用开发 首 页  »  帮助中心  »  云服务器  »  阿里云应用开发
运行多进程Docker容器的方法介绍
发布日期:2016-3-2 13:3:53
 

  运行多进程Docker容器的方法介绍

  一般来说,Docker容器比较适合运行单个进程。比如说,项目"使用多个Docker容器运行Kubernetes",Kubernetes的各个组件分别运行在各个容器之中,每个容器只运行单个的进程。

  然而,很多时候我们需要在Docker容器中运行多个进程。比如说,项目"使用单个Docker容器运行Kubernetes",kubernetes的各个组件均运行在同一个容器中,这个容器中运行了多个进程。那么,怎样运行多进程Docker容器?

  一种方法是使用Shell脚本,另一种方法是使用进程管理工具Supervisor。

  kiwenlau/kubernetes-shell和kiwenlau/kubernetes-supervisor分别采用了这两种方法,用于启动多个进程来运行Kubernetes的各个组件,从而实现"使用单个Docker容器运行Kubernetes"。我将分别介绍两种不同方法,如下所述。

  一、使用Shell脚本运行多进程Docker容器的方法

  这个方法大家应该会比较熟悉,使用Shell脚本依次启动Kubernetes的各个组件就可以了。start-kubernetes.sh如下图所示:

  然后在Dockerfile中,将start-kubernetes.sh指定为Docker容器默认执行的命令就可以了,如下图所示:

  需要注意的一点在于,start-kubernetes.sh脚本将作为Docker容器的1号进程运行,必须始终保持运行。因为Docker容器仅在1号进程运行时保持运行,换句话说,Docker容器将在1号进程退出后Exited。由于Kubernetes的各个组件都以后台进程方式执行,我在脚本末尾添加了死循环,以保持start-kubernetes.sh脚本始终处于运行状态。如下图所示:

  二、使用supervisor运行多进程Docker容器

  Supervisor是进程管理工具。这时,需要编写supervisor的配置文件kubernetes.conf,如下图所示:

  由上图可知,将Kubernetes的各个组件的启动命令设为command就好了。autorestart参数设为true,意味着supervisor将负责重启意外退出的组件。stdout_logfile和stderr_logfile参数则能够用于设置命令的标准输出文件和标准错误输出文件。

  然后在Dockerfile中,将supervisord指定为Docker容器默认执行的命令就可以了,如下图所示:

  这个时候, supervisord是Docker容器中的1号进程,也需要始终保持运行状态。nodaemon设为true时,表示supervisor保持前台运行而非在后台运行。如果supervisor在后台运行,则Docker容器也会在执行supervisord命令后立即Exited。如下图所示:

  总结

  使用Shell脚本运行多进程Docker容器,优势是大家都非常熟悉。由于需要保持Docker容器的1号进程始终运行,这一点比较容易出错。如果要实现进程意外退出后自动重启的话,使用shell脚本比较麻烦。

  使用supervisor运行多进程Docker容器,非常的方便。另外,保持1号进程保持运行,以及进程意外退出后自动重启,实现起来都很简单。

  使用多个Docker容器运行Kubernetes

  GitHub地址,如下图所示:

  我在Ubuntu主机上运行单机版Kubernetes的架构。可知,我一共运行了7个容器,分别运行Kubernetes的各个组件。如下图所示:

  使用单个Docker容器运行Kubernetes

  GitHub地址,如下图所示:

  这个项目中,我将kubernetes的所有组件:etcd, controller manager, apiserver, scheduler, kubelet, proxy以及docker daemon均运行在同一个Docker容器之中。

  容器启动时,各个组件由shell脚本或者supervisor启动。如下图所示:

  参考文献,如下所列:

  1)、 Using Supervisor with Docker

  2)、 How To Install and Manage Supervisor on Ubuntu and Debian VPS

  3)、 基于Docker搭建单机版Kuberntes

  4)、 kiwenlau/single-kubernetes-docker