在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視頻教程》