详解docker 容器不自动退出结束运行的方法

作者:big_cat 时间:2022-05-25 21:48:24 

本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行。

docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动结束的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。

比如 docker hello-world


# 一闪而过 输出一堆东西
docker run --name hello-world hello-world
# 可以看到 hello-world 容器已经退出了
docker ps -a

那怎样可以让容器不自动退出呢?如果我们想登入一个纯净的容器 alpine/centos/ubuntu 之类的,在其基础上安装一些服务组件,然后在 commit 成自己的镜像。

看网上有不少方法是创建容器时执行一个 while(true) 的死循环(当然,sleep 一下)或者用 tail -f /dev/null 一类的,反正就是以开启一个可以常驻的前置进程为目的。其实我们可以更优雅的使用 docker 容器的 interactive 和 tty 参数来将 sh/bash (*nix 系统必有)命令作为前置命令开启,这样容器就不会自动退出了。

例如使用 alpine 镜像做为基础镜像,创建一个 alpine 系统小容器,让其可以常驻运行,以便我们登录交互执行某些命令。


# 使用 alpine 系统镜像创建容器
# -i interactive=true 开启 stdin
# -t tty=true 分配会话终端
# -d 守护模式 不加也可以 不加就直接进入容器中了 需要 ctrl+p+q 切出
# 不能 exit 哟, exit 相当于结束 sh 会话了 容器会退出的
docker run -it -d --name alpine alpine sh
# alpine 肯定在运行
docker ps
# 登入容器
docker exec -it alpine sh
# apline 使用的 apk 作为包管理
# 安装个小火车
# 后续可以使用 docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl 生成新的镜像
apk add sl
# 退出容器 注:-d 启动的才可以,如果没有 -d 启动直接进入的 sh终端 则不能退出,否则容器也会退出
exit

提交容器变更生成新的镜像


docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl
docker images
# 有账号的话发布到 docker hub 上去
docker push big_cat/alpine_sl




# 后续停止/启动容器时就不需要在指定 -it 参数了
docker stop alpine
docker start alpine

提交容器变更生成新的镜像


docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl
docker images
# 有账号的话发布到 docker hub 上去
docker push big_cat/alpine_sl

以上命令其实是借助 sh/bash 会话终端作为前置进程,使得容器不会自动退出。

如果你觉得在创建容器时如此书写会很粗陋,没关系,我们可以将这些都推给 docker-compose
docker-compose.yml


version: '3'

services:
 big_cat_alpine:
   container_name: big_cat_alpine
   image: alpine
   stdin_open: true # -i interactive
   tty: true # -t tty
   privileged: true
   entrypoint: ["sh"] # 执行 sh

创建容器 & 登入容器


docker-compose up -d big_cat_alpine ./
docker ps
docker exec -it big_cat_alpine sh

通过 docker-compose 将那两个参数传入进去,编排后启动服务容器。

来源:https://segmentfault.com/a/1190000017967660

标签:docker,容器,不自动退出
0
投稿

猜你喜欢

  • 共享控制台--让远程桌面更人性化(1)

    2007-03-27 10:40:00
  • 15个传统提升流量的方法

    2009-01-21 12:00:00
  • proftp配置全功略 FTP

    2007-09-05 13:44:00
  • WIN2003服务器安全配置终极技巧图

    2009-11-20 15:14:00
  • 对网站改版的一些建议

    2009-02-20 14:26:00
  • 2009年度互联网广告市场七宗最

    2009-10-12 11:01:00
  • Web服务器和应用程序服务器的区别

    2007-03-26 11:30:00
  • 学以致用:高中生站长建站月入2万

    2009-06-16 10:52:00
  • VMWare15 安装 Mac OS系统(图文教程)

    2021-09-11 14:52:32
  • 在VMware+centOS 8上基于http协议搭建Git服务的方法

    2023-12-04 12:51:24
  • 常见FTP登陆Log信息

    2007-08-16 13:48:00
  • DEDE5.35.3软件下载突破12个链接限制的方法

    2009-02-15 09:27:00
  • 利用DDOS攻击 网络安全公司大赚其钱

    2007-08-06 17:08:00
  • 51.com程悦:病毒式营销使用户量增长几百倍

    2009-11-08 18:45:00
  • 中小型企业如何打好综合网络营销持久战

    2009-04-07 10:13:00
  • AWStats简介:Apache/IIS的日志分析工具

    2008-05-02 20:44:00
  • Google发布AdSense for Feeds

    2008-08-18 21:16:00
  • Discuz!+UCHome珠联璧合 搭建专业SNS平台

    2009-04-09 12:01:00
  • 谈谈站内搜索

    2009-09-30 17:10:00
  • Linux系统防CC攻击自动拉黑IP增强版(Shell脚本)

    2023-08-04 22:46:38
  • asp之家 网站运营 m.aspxhome.com