欢迎来到3C源码网
3C源码网

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

日期: 2020-02-15 19:52:21

时间:2019-03-26 来源/作者:big_cat 编辑:源码库 文章热度:

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

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

比如 docker hello-world

docker run --name hello-world hello-worlddocker ps -a

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

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

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

docker run -it -d --name alpine alpine shdocker psdocker exec -it alpine shapk add slexit

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

docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sldocker imagesdocker push big_cat/alpine_sl
docker stop alpinedocker start alpine

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

docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sldocker imagesdocker 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 psdocker exec -it big_cat_alpine sh

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU源码库。


注:相关教程知识阅读请移步到服务器教程频道。

上一篇:docker容器内网络请求缓慢问题解决

下一篇:Linux centos下设置定时备份任务的方法步骤