• 技术文章 >运维 >Docker

    docker怎么使容器不自动退出

    长期闲置长期闲置2022-03-08 10:40:21原创241

    在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怎么使容器不自动退出的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:docker
    上一篇:docker挂载有什么用 下一篇:docker镜像导入和导出是什么意思
    Web大前端开发直播班

    相关文章推荐

    • docker中挂载是什么意思• 重启docker服务,容器会有影响吗• 停止docker容器数据是否会丢失• 最详细的整理docker数据卷教程• 创建Docker镜像有几种方式

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网