灵活控制Docker容器中启动的进程

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、构建镜像

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

转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Docker容器是一种轻量级、可移植的虚拟化技术。它能够将应用程序及其所有依赖打包成一个独立的、可随时部署的单元,称为容器。与传统的虚拟化技术相比,Docker容器更加灵活、高效,能够快速部署和扩展应用。 容器云(Container Cloud)是建立在云计算基础上的一种基于容器技术的云平台。它能够自动化管理和部署大规模的容器集群,提供资源调度、服务发现、监控等功能,使得应用的开发、测试和部署过程更加简便和高效。 Docker容器容器云之间存在密切的联系和相互依赖。首先,Docker容器作为一种轻量级的容器技术,是容器云平台的基础。容器云平台可以利用Docker容器来实现应用程序的隔离和资源管理,提供统一的管理接口和调度策略。 其次,容器云平台能够进一步增强Docker容器的功能和性能。通过容器云平台,可以实现容器集群的扩容和负载均衡,并提供高可用性和故障恢复的能力。容器云平台还可以提供统一的日志和监控平台,方便运维人员进行容器的管理和故障排查。 最后,Docker容器容器云的结合可以提供更加灵活和高效的应用部署和管理方式。通过Docker容器的打包和发布,可以实现应用在开发、测试和生产环境的无缝迁移,减少了运维的工作量和成本。而容器云平台的自动化管理和扩展能力,则使得应用的部署和升级更加便捷和快速。 综上所述,Docker容器容器云是相辅相成的关系。Docker容器作为一种虚拟化技术,为容器云平台提供了基础;而容器云平台则进一步增强了Docker容器的功能和性能,实现了高效的应用部署和管理。这种结合为企业提供了更加灵活、高效的云计算解决方案。 ### 回答2: Docker容器是一种轻量级的虚拟化技术,可以将应用程序及其依赖项打包在一个可移植的容器,使其可以在任何环境运行容器云是基于云计算的平台,用于管理和部署多个Docker容器Docker容器的特点是轻便、快速、可移植和可靠。它们将应用程序打包成一个独立的单元,可以在不同的计算机和操作系统上运行,而不需要额外的配置和设置。容器不会与系统环境发生冲突,因此可以快速启动和停止,以及实现高效的资源利用。 而容器云是一种更高级的容器管理和部署平台。它可以自动化地管理大量的Docker容器,并提供了更多的功能和服务。容器云可以根据应用程序的需求自动扩展容器的数量,确保应用程序始终具有足够的资源来运行。它还可以提供负载均衡、容器间通信和服务发现等功能,简化了应用程序的开发和部署过程。 容器云还可以提供监控、日志记录和故障恢复等功能,帮助开发人员更好地管理和维护应用程序。它还支持多租户和权限管理,确保不同用户之间的容器隔离和安全性。 总而言之,Docker容器容器云是一对密切相关的概念。Docker容器为应用程序提供了轻量级的虚拟化环境,而容器云则在此基础上提供了更高级的管理和部署功能。它们的结合可以极大地简化应用程序的开发和部署过程,并提高应用程序的可靠性和可扩展性。 ### 回答3: Docker容器是一个轻量级、可移植和可扩展的容器化技术。它允许开发人员将应用程序及其依赖项打包为一个标准化的容器,然后可以在任何支持Docker的环境运行Docker容器的主要优点包括: 1. 灵活性:Docker容器提供了一个独立的运行环境,可以将应用程序及其依赖项打包在一起。这使得应用程序的部署和迁移变得简单和可预测。 2. 资源隔离:每个Docker容器都有自己的文件系统、进程空间和网络接口,这意味着容器之间的应用程序资源相互隔离,可以避免相互干扰。 3. 可拓展性:Docker容器可以快速创建和销毁,并可以自动进行扩展和缩减,以适应更改的负载需求。 容器云是建立在Docker容器技术之上的云计算平台。它可以用来管理和编排大规模的容器集群,并提供一套高级特性,使得容器的部署、监控和扩展变得更加便捷。 容器云的主要功能包括: 1. 集管理:容器云提供了一个集化的管理平台,可以轻松地管理和监控大规模容器集群的所有容器实例。 2. 自动化部署:容器云可以根据用户定义的规则和策略,自动部署和扩展容器实例,以适应不同的负载需求。 3. 服务发现和负载均衡:容器云可以自动发现和管理容器集群的服务,并提供负载均衡功能,以确保每个容器实例都能够平衡地处理请求。 4. 安全和可靠性:容器云提供了一系列安全措施,如访问控制容器隔离和自动恢复,以确保容器应用程序的安全和可靠性。 总之,Docker容器容器云是一对密切相关的概念。Docker容器提供了一种轻量级和标准化的打包和部署方式,而容器云则提供了一个管理和编排大规模容器集群的平台,以简化容器的运维工作。通过结合使用这两种技术,开发人员和运维团队可以更高效地部署和管理容器化的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值