资讯专栏INFORMATION COLUMN

docker 新手向 - 防止容器自动退出的解决方案

Miyang / 5640人阅读

摘要:其实我们可以更优雅的使用容器的和参数来将系统必有命令作为前置命令开启常驻运行,如此容器便不会自动退出了。

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

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

比如 docker hello-world

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

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

看网上有不少方法是创建容器时执行一个 while(true) 的死循环(当然,sleep 一下)或者用 tail -f /dev/null 一类的,反正就是以开启一个可以常驻的前置进程为目的。

其实我们可以更优雅的使用 docker 容器的 interactive 和 tty 参数来将 sh/bash (*nix 系统必有)命令作为前置命令开启常驻运行,如此容器便不会自动退出了。

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

部分镜像可能有自己的 entrypoint 命令作为容器的前置进程,会无效化我们 run 时传入的执行 sh 的命令,需使用 --entrypoint="" 进行覆盖。如需涉及相关的访问权限,也请加上 --privileges=true 选项。
# 使用 alpine 系统镜像创建容器
# -i interactive=true 开启 stdin
# -t tty=true 分配会话终端
# -d 守护模式 不加也可以 不加就直接进入容器中了 需要 ctrl+p+q 切出,不能 exit,exit 相当于结束前置的 sh 会话了 容器会退出的
docker run -it -d --name my_alpine alpine sh
# my_alpine 容器处于运行状态 
docker ps
# 登入容器
docker exec -it my_alpine sh
# 查看 sh 会话数量 你会发现我们 run 时开启的 sh 正在其中
ps
# apline 使用的 apk 作为包管理
# 安装个小火车
# 后续可以使用 docker commit -m "alpine with sl cmd" -a "big_cat" my_alpine big_cat/alpine_sl 生成新的镜像
apk add sl
# 退出当前sh会话 run 时开启的 sh 依然会作为前置进程保证容器的运行
exit

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

docker commit -m "alpine with sl cmd" -a "big_cat" my_alpine big_cat/alpine_sl
docker images
# 有账号的话发布到 docker hub 上去
docker push big_cat/alpine_sl
# 后续停止/启动容器日常操作即可
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://www.ucloud.cn/yun/28079.html

相关文章

  • 写给docker新手文章

    摘要:为什么要用对开发者来说启动速度快传统虚拟机需要数分钟的启动时间秒秒钟启动。开发者只需要代码到版本管理即可,接下来的自动测试,自动构建,自动部署都交给吧更轻松的扩展。 1. 前言 相见恨晚用来形容我对docker的热爱再合适不过了,自从用了docker,开发环境也不安装了,系统想换就换了,部署更是一键部署,再也不用担心在这台机器上跑的好好的,其它机器有问题了... 写这篇文章,也是为do...

    svtter 评论0 收藏0
  • 01-Docker新手入门初见篇

    摘要:了解开源的容器平台用于分享管理容器的平台使用客户端服务器架构模式。守护进程会处理复杂繁重的任务,例如建立运行发布你的容器。客户端和守护进程之间通过或者进行通信。 Step1:了解Docker 开源的容器平台:Golang https://github.com/docker/dockerDocker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台 -- D...

    oujie 评论0 收藏0
  • 数人云工程师手记 | 新手快速入门Docker最新版管理工具

    摘要:在之前公众号的数人云工程师手记基于的集群管理开发实践对的服务发现及负载均衡有详细的介绍。服务名称为服务命名,必须为英文或数字。 本文是数人云9月22日线上微信群分享的文章实录。数人云容器管理面板Crane开源以来,很多小伙伴对它还不是非常了解,数人云工程师金鑫从Crane技术背景、环境准备和使用步骤等方面为大家做了详细的介绍,并整理大家常见的问题逐一进行了解答。 引言 Docker1....

    Tangpj 评论0 收藏0
  • Swoft 新手教程 - 通过 Docker 搭建一个开发环境

    摘要:前言是一个在之上构建的一个高性能协程全栈框架,而在里面是一个高级技能,所以在相关的环境安装上也给许多人造成了很大的困扰,更是如此,本文将通过以一种极其简单的方式解决运行环境和开发环境的部署。 showImg(https://segmentfault.com/img/bVbeknK?w=512&h=197); 本系列文章将从使用层面介绍 Swoft 框架的使用及业务开发,面向初中级的 P...

    tinysun1234 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<