详解docker 容器不自动退出结束运行的方法
本文主要简单介绍docker容器与前置进程的关系,以及如何编写Dockerfile/docker-compose.yml优雅的让容器可以常驻运行。
docker容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动结束的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。
比如dockerhello-world
#一闪而过输出一堆东西 dockerrun--namehello-worldhello-world #可以看到hello-world容器已经退出了 dockerps-a
那怎样可以让容器不自动退出呢?如果我们想登入一个纯净的容器alpine/centos/ubuntu之类的,在其基础上安装一些服务组件,然后在commit成自己的镜像。
看网上有不少方法是创建容器时执行一个while(true)的死循环(当然,sleep一下)或者用tail-f/dev/null一类的,反正就是以开启一个可以常驻的前置进程为目的。其实我们可以更优雅的使用docker容器的interactive和tty参数来将sh/bash(*nix系统必有)命令作为前置命令开启,这样容器就不会自动退出了。
例如使用alpine镜像做为基础镜像,创建一个alpine系统小容器,让其可以常驻运行,以便我们登录交互执行某些命令。
#使用alpine系统镜像创建容器 #-iinteractive=true开启stdin #-ttty=true分配会话终端 #-d守护模式不加也可以不加就直接进入容器中了需要ctrl+p+q切出 #不能exit哟,exit相当于结束sh会话了容器会退出的 dockerrun-it-d--namealpinealpinesh #alpine肯定在运行 dockerps #登入容器 dockerexec-italpinesh #apline使用的apk作为包管理 #安装个小火车 #后续可以使用dockercommit-m"alpinewithslcmd"-a"big_cat"alpinebig_cat/alpine_sl生成新的镜像 apkaddsl #退出容器注:-d启动的才可以,如果没有-d启动直接进入的sh终端则不能退出,否则容器也会退出 exit
提交容器变更生成新的镜像
dockercommit-m"alpinewithslcmd"-a"big_cat"alpinebig_cat/alpine_sl dockerimages #有账号的话发布到dockerhub上去 dockerpushbig_cat/alpine_sl
#后续停止/启动容器时就不需要在指定-it参数了 dockerstopalpine dockerstartalpine
提交容器变更生成新的镜像
dockercommit-m"alpinewithslcmd"-a"big_cat"alpinebig_cat/alpine_sl dockerimages #有账号的话发布到dockerhub上去 dockerpushbig_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#-iinteractive tty:true#-ttty privileged:true entrypoint:["sh"]#执行sh
创建容器&登入容器
docker-composeup-dbig_cat_alpine./ dockerps dockerexec-itbig_cat_alpinesh
通过docker-compose将那两个参数传入进去,编排后启动服务容器。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。