docker怎么使容器不自动退出

发布时间 - 2022-03-08 00:00:00    点击率:
在docker中,可以给容器添加一个常驻的前置进程,使容器不自动退出,可以使用docker容器的interactive和tty参数来将“sh/bash”命令作为潜质命令开启,这样容器就不会自动退出了。

本教程操作环境:linux7.3系统、docker-1.13.1版、Dell G3电脑。

docker怎么使容器不自动退出

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 将那两个参数传入进去,编排后启动服务容器。

推荐学习:《docker视频教程》


# docker  # bash  # NULL  # while  # 循环  # ubuntu  # centos  # 镜像  # 出了  # 登入  # 我们可以  # 可以使用  # 不加  # 成新  # 直接进入  # 自己的  # 便自 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  如何快速搭建二级域名独立网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  网站建设要注意的标准 促进网站用户好感度!  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel Fortify是什么,和Jetstream有什么关系  免费视频制作网站,更新又快又好的免费电影网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  制作电商网页,电商供应链怎么做?  如何实现建站之星域名转发设置?  中国移动官方网站首页入口 中国移动官网网页登录  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何在景安云服务器上绑定域名并配置虚拟主机?  简历在线制作网站免费版,如何创建个人简历?  如何快速生成高效建站系统源代码?  移动端脚本框架Hammer.js  大型企业网站制作流程,做网站需要注册公司吗?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何彻底删除建站之星生成的Banner?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在宝塔面板中创建新站点?  高防服务器租用如何选择配置与防御等级?  如何用IIS7快速搭建并优化网站站点?  企业网站制作这些问题要关注  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  焦点电影公司作品,电影焦点结局是什么?  如何为不同团队 ID 动态生成多个“认领值班”按钮  专业商城网站制作公司有哪些,pi商城官网是哪个?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何在阿里云域名上完成建站全流程?  Linux网络带宽限制_tc配置实践解析【教程】  如何用搬瓦工VPS快速搭建个人网站?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何构建满足综合性能需求的优质建站方案?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  再谈Python中的字符串与字符编码(推荐)  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何在阿里云ECS服务器部署织梦CMS网站?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南