灵活控制Docker容器中启动的进程
2015-06-08 13:45
771 查看
Docker容器在创建时就会设定好CMD或者ENTRYPOINT,这会固定每次容器启动时所运行的命令或者脚本。
容器启动的时候,如果设定好的命令或者脚本运行发生错误,容器是无法正常启动的。
如何能避免这种情况呢?解决的思路有很多种。
一种是CMD或ENTRYPOINT设定为绝对不会运行失败的程序,例如/bin/bash。如果bash都无法启动,那到底是对这个容器做了什么丧尽天良的操作!运行绝对不会出错的程序后,进入容器,再手动启动应用,退出的话直接关闭远程的窗口。这种方式不方便。
另一种思路也类似,也是运行一个绝对不会失败的程序或脚本,然后通过这个程序或者脚本,来启动我们的应用。这种方式如果应用灵活,就可以很灵活的控制每次我们运行的容器要启动那些应用。
下面我们介绍一下需要用到的工具:
1、ENTRYPOINT,在进行DockerBuild的时候可以设定ENTRYPOINT,这个参数不会被CMD所覆盖,每次启动容器的时候都会运行。
2、bootstrap.sh,脚本详细内容见下文。这个脚本就放在ENTRYPOINT中,负责启动我们的应用。
3、docker run -v ,映射本机目录到容器中,这里是最重要的一环。根据容器启动的过程,是会先进行映射,再运行ENTRYPOINT中制定的脚本或命令。
在这个方式中,bootstrap.sh脚本会扫描容器中的/config/init/目录,执行其中的shell脚本,启动应用。我们将本机的一个目录映射为容器内部的/config/init/目录。只要每次修改本机目录中的shell脚本,即可以做到每次容器启动的时候都指定要运行的应用,是可以动态调整的。
假如我们进行了什么操作,导致一个应用无法启动,那我们直接把这个应用对应的启动脚本删了就行了。进入容器后再手动启动这个应用,排查下问题。不至于整个容器直接起不来了,想排查都没机会了。
具体的构建方式如下:
1、构建镜像
此处指定了ENTRYPOINT、CMD命令。CMD命令为bash,我们构建的镜像一定是有bash进程的,有问题可以直接进行排查。
2、准备bootstrap.sh
在容器内部,编写脚本,脚本内容直接复制
3、在容器内安装supervisord
这个进程可以设定监控哪些进程是否在运行,可以作为守护进程来使用。
4、其他修改
顺便说下,最好把容器内的时区也改了。
5、别忘了docker commit
这样一个可以随时控制容器内启动哪些应用的镜像就构建好了。
/config/bootstrap.sh
转载请注明出处。
容器启动的时候,如果设定好的命令或者脚本运行发生错误,容器是无法正常启动的。
如何能避免这种情况呢?解决的思路有很多种。
一种是CMD或ENTRYPOINT设定为绝对不会运行失败的程序,例如/bin/bash。如果bash都无法启动,那到底是对这个容器做了什么丧尽天良的操作!运行绝对不会出错的程序后,进入容器,再手动启动应用,退出的话直接关闭远程的窗口。这种方式不方便。
另一种思路也类似,也是运行一个绝对不会失败的程序或脚本,然后通过这个程序或者脚本,来启动我们的应用。这种方式如果应用灵活,就可以很灵活的控制每次我们运行的容器要启动那些应用。
下面我们介绍一下需要用到的工具:
1、ENTRYPOINT,在进行DockerBuild的时候可以设定ENTRYPOINT,这个参数不会被CMD所覆盖,每次启动容器的时候都会运行。
2、bootstrap.sh,脚本详细内容见下文。这个脚本就放在ENTRYPOINT中,负责启动我们的应用。
3、docker run -v ,映射本机目录到容器中,这里是最重要的一环。根据容器启动的过程,是会先进行映射,再运行ENTRYPOINT中制定的脚本或命令。
在这个方式中,bootstrap.sh脚本会扫描容器中的/config/init/目录,执行其中的shell脚本,启动应用。我们将本机的一个目录映射为容器内部的/config/init/目录。只要每次修改本机目录中的shell脚本,即可以做到每次容器启动的时候都指定要运行的应用,是可以动态调整的。
假如我们进行了什么操作,导致一个应用无法启动,那我们直接把这个应用对应的启动脚本删了就行了。进入容器后再手动启动这个应用,排查下问题。不至于整个容器直接起不来了,想排查都没机会了。
具体的构建方式如下:
1、构建镜像
FROM centos-base:latest MAINTAINER artemus717@gmail.com ENTRYPOINT ["/config/bootstrap.sh"] CMD ["/bin/bash"]
此处指定了ENTRYPOINT、CMD命令。CMD命令为bash,我们构建的镜像一定是有bash进程的,有问题可以直接进行排查。
2、准备bootstrap.sh
在容器内部,编写脚本,脚本内容直接复制
mkdir /config mkdir /config/init vi /config/bootstrap.sh chmod 755 /config/bootstrap.sh
3、在容器内安装supervisord
这个进程可以设定监控哪些进程是否在运行,可以作为守护进程来使用。
yum install epel-release -y yum install supervisor -y cp /etc/supervisor.conf /etc/supervisor.conf.bak
4、其他修改
顺便说下,最好把容器内的时区也改了。
rm -rf /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
5、别忘了docker commit
这样一个可以随时控制容器内启动哪些应用的镜像就构建好了。
#!/bin/bash set -e set -u # Supervisord default params SUPERVISOR_PARAMS='-c /etc/supervisord.conf' # Create directories for supervisor's UNIX socket and logs (which might be missing # as container might start with /data mounted from another data-container). mkdir -p /data/conf /data/run /data/logs chmod 711 /data/conf /data/run /data/logs if [ "$(ls /config/init/)" ]; then for init in /config/init/*.sh; do . $init done fi # We have TTY, so probably an interactive container... if test -t 0; then # Run supervisord detached... supervisord $SUPERVISOR_PARAMS # Some command(s) has been passed to container? Execute them and exit. # No commands provided? Run bash. if [[ $@ ]]; then eval $@ else export PS1='[\u@\h : \w]\$ ' /bin/bash fi # Detached mode? Run supervisord in foreground, which will stay until container is stopped. else # If some extra params were passed, execute them before. # @TODO It is a bit confusing that the passed command runs *before* supervisord, # while in interactive mode they run *after* supervisor. # Not sure about that, but maybe when any command is passed to container, # it should be executed *always* after supervisord? And when the command ends, # container exits as well. if [[ $@ ]]; then eval $@ fi supervisord -n $SUPERVISOR_PARAMS fi
/config/bootstrap.sh
转载请注明出处。
相关文章推荐
- 8个你可能不知道的Docker知识
- 在Docker中自动化部署Ruby on Rails的教程
- 利用OpenVSwitch在多台主机上部署Docker的教程
- ubuntu14.04+docker的安装及使用
- Docker 清理命令集锦
- 基于 Docker 开发 NodeJS 应用
- 在Docker上部署Python的Flask框架的教程
- 在Docker上开始部署Python应用的教程
- 详解在Python和IPython中使用Docker
- 使用IPython来操作Docker容器的入门指引
- OSX下brew安装docker(boot2docker)
- Docker使用supervisor启动Mysql
- Docker使用supervisor构建solr
- docker入门指南
- CentOS6.X下Docker安装笔记
- Docker私有Registry在CentOS6.X下安装指南
- 使用 Docker 搭建 Java Web 运行环境
- 桥接模式构建 docker 网络
- Redis docker 镜像制作
- 使用golang和docker守护进程交互