Docker 容器台运行前台运行区别
Posted by simapple on Tuesday, 19 August 2014
台运行vs前台运行
启docker 容器候第件事要确认要前台运行台运行:
-d=false:Detached mode:Run container in the background,printnew container id
台运行 (-d)
台运行直接指定 (-d=true or just -d),所操作类似网络连接共享操作等等都再接受命令行命令控制要使用attach命令 进入容器再管理注意attach链接容器候能再使用 rm 删除容器
前台运行
指定-d前台运行 docker run 启进程并且通console 连接进程标准输入 输标准错误甚至伪装TTY发送信号量所切都配置
-a=[]:Attach to `STDIN`,`STDOUT`and/or`STDERR`-t=false:Allocate a pseudo-tty
--sig-proxy=true:Proxify all received signal to the process (even in non-tty mode)-i=false:Keep STDIN open even ifnot attached
想使用 -a 连接容器所输入输指定希望接受流STDIN, STDOUT, STDERR):
$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash
交互式情况希望类似TTYshell 指定 -i -t
taxonomyextra:
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的各个组件即可。
然后在dockerfile中,将start-kubernetes.sh指定为docker容器默认执行的命令即可:
cmd ["start-kubernetes.sh"]
需要注意的一点在于,start-kubernetes.sh脚本将作为docker容器的1号进程运行,必须始终保持运行。因为docker容器仅在1号进程运行时保持运行,换言之,docker容器将在1号进程退出后exited。由于kubernetes的各个组件都以后台进程方式执行,我在脚本末尾添加了死循环,以保持start-kubernetes.sh脚本始终处于运行状态。
just keep this script runningwhile [[ true ]]; do sleep 1 done
使用supervisor运行多进程docker容器
supervisor是进程管理工具。这时,需要编写supervisor的配置文件kubernetes.conf:
可知,将kubernetes的各个组件的启动命令设为command即可。autorestart参数设为true,意味着supervisor将负责重启意外退出的组件。stdout_logfile和stderr_logfile参数则可以用于设置命令的标准输出文件和标准错误输出文件。
然后在dockerfile中,将supervisord指定为docker容器默认执行的命令即可:
cmd ["supervisord", "-c", "/etc/supervisor/conf.d/kubernetes.conf"]
此时, supervisord是docker容器中的1号进程,也需要始终保持运行状态。nodaemon设为true时,表示supervisor保持前台运行而非在后台运行。若supervisor在后台运行,则docker容器也会在执行supervisord命令后立即exited.
[supervisord] nodaemon=true
总结
使用shell脚本运行多进程docker容器,优势是大家比较熟悉。由于需要保持docker容器的1号进程始终运行,这一点比较容易出错。若要实现进程意外退出后自动重启的话,使用shell脚本比较麻烦。
使用supervisor运行多进程docker容器,非常方便。另外,保持1号进程保持运行,以及进程意外退出后自动重启,实现起来都很简单。
使用多个docker容器运行kubernetes
github地址
kiwenlau/single-kubernetes-docker
下图显示了我在ubuntu主机上运行单机版kubernetes的架构。可知,我一共运行了7个容器,分别运行kubernetes的各个组件。
使用单个docker容器运行kubernetes
github地址:
kiwenlau/kubernetes-shell kiwenlau/kubernetes-supervisor
该项目中,我将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
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....