博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker 新手向 - 防止容器自动退出的解决方案
阅读量:7226 次
发布时间:2019-06-29

本文共 1989 字,大约阅读时间需要 6 分钟。

hot3.png

本文主要简单介绍 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 系统小容器,让其可以常驻运行,以便我们登录交互执行某些命令。

# 使用 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_sldocker images# 有账号的话发布到 docker hub 上去docker 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 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 psdocker exec -it big_cat_alpine sh

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

转载于:https://my.oschina.net/sallency/blog/3004316

你可能感兴趣的文章
开涛spring3(3.4) - DI 之 3.4 Bean的作用域
查看>>
Flume Channel
查看>>
JS学习(二)
查看>>
Android 获取SDCard中某个目录下图片
查看>>
【Eclipse提高开发速度-插件篇】Eclipse插件安装慢得几个原因
查看>>
Jenkins学习五:更改Jenkins的主目录
查看>>
[JS] 页面回车键提交表单-常用于登录页面
查看>>
奇怪吸引子---Hadley
查看>>
数字三角形问题
查看>>
linux线程的实现
查看>>
美的程序不可能从修修补补中来。它必须完美的把握住事物的本质,否则就会有许许多多无法修补的特例(转)...
查看>>
OpenCV 2.4.11 VS2012 Configuration
查看>>
使用像素生成图象
查看>>
SimpleDateFormat使用具体解释
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]4.3.25
查看>>
用css3实现各种图标效果(2)
查看>>
hadoop: hbase1.0.1.1 伪分布安装
查看>>
2015第23周一SVN插件安装
查看>>
MATLAB新手教程
查看>>
使用FIR.im发布自己的移动端APP
查看>>