前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker容器中的前台程序和后台程序,为什么一定要前台运行

docker容器中的前台程序和后台程序,为什么一定要前台运行

原创
作者头像
用户10048459
发布2022-10-23 13:37:24
3.2K0
发布2022-10-23 13:37:24
举报
文章被收录于专栏:执笔绘倾城执笔绘倾城

docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。

代码语言:javascript
复制
docker容器之后台运行 
我们 docker run 启动容器的时候,常需要将其在后台运行,通常我们设置参数 -d 即可。

但后台运行,其实是有前提的,如果没有前台进程,那么实际运行完docker run命令后,会处于退出状态,即exited。

例子:
docker run -d --name my-redis redis bash

# 指定命令是bash,但显然bash在容器起来后,很快就会结束,导致没有前台进程,故容器处于退出状态

Docker容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行ping,sleep),就是会自动退出的。 而上面的代码中bash就是需要执行的指定的命令。

命令如果执行完毕了,或者叫指定的应用终结时,容器会自动停止。

解决办法

目前了解的可以使用以下3种方法,具体用哪种方法,依据实际情况,生产情况下,通常用docker-compose结合具体cmd作为容器初起的命令。

1.指定挂起阻塞命令启动容器

代码语言:javascript
复制
docker run -d --name my-redis redis sleep 99999999999999

命令执行后,通过docker ps -a | grep my-redis,可以看到容器处于运行状态,即up

2.使用交互界面后退出容器

代码语言:javascript
复制
docker run -it --name my-redis redis bash

之后会进入容器,如果想保持容器后台运行,我们可以 Ctrl + p + q,再次查看容器运行状态,也可以看到容器处于up状态。

3.-td命令结合使用

代码语言:javascript
复制
docker run -itd --name my-redis2 redis bash
# -i 不是必需,加了,容器起来后终端返回容器ID

刚也提到,就是-d运行容器时,需要有前台进程,-t提供一个伪终端,类似前台进程,查看容器运行状态,也可以看到,容器处于up状态。

补充-进入容器的4种方法

docker提供了多种进入容器的方法,这里补充4种常见的方法:

  • 使用docker attach
  • 使用SSH
  • 使用nsenter
  • 使用exec

docker attach

代码语言:javascript
复制
docker attach 容器ID|容器name 

使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,建议开发时使用。

ssh 在镜像(或容器)中安装SSH Server,这样就能保证多人进入,不建议使用,具体见为什么不需要在 Docker 容器中运行 sshd

nsenter nsenter使用方法

docker exec-推荐使用 通常我们可以通过容器name容器ID进入到容器中:

  • 如果我们在启动容器的时候指定-name选项,我们可以:docker exec -it container_name bash
  • 没指定name,我们可以通过docker ps查看容器的ID,之后再通过docker exec -it containerID bash进入容器

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
  • Docker容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行ping,sleep),就是会自动退出的。 而上面的代码中bash就是需要执行的指定的命令。
  • 命令如果执行完毕了,或者叫指定的应用终结时,容器会自动停止。
  • 解决办法
    • 1.指定挂起阻塞命令启动容器
      • 2.使用交互界面后退出容器
        • 3.-td命令结合使用
          • 补充-进入容器的4种方法
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档