詳解docker 容器不自動(dòng)退出結(jié)束運(yùn)行的方法
本文主要簡(jiǎn)單介紹 docker 容器與前置進(jìn)程的關(guān)系,以及如何編寫(xiě) Dockerfile/docker-compose.yml 優(yōu)雅的讓容器可以常駐運(yùn)行。
docker 容器的生命周期是同容器中的前置進(jìn)程相關(guān)在一起的,這也是我們平時(shí)可能會(huì)遇到一些容器只是運(yùn)行幾秒便自動(dòng)結(jié)束的原因:因?yàn)槿萜髦袥](méi)有一個(gè)常駐的前置進(jìn)程,前置進(jìn)程運(yùn)行結(jié)束后,容器便自動(dòng)退出了。
比如 docker hello-world
# 一閃而過(guò) 輸出一堆東西 docker run --name hello-world hello-world # 可以看到 hello-world 容器已經(jīng)退出了 docker ps -a
那怎樣可以讓容器不自動(dòng)退出呢?如果我們想登入一個(gè)純凈的容器 alpine/centos/ubuntu 之類的,在其基礎(chǔ)上安裝一些服務(wù)組件,然后在 commit 成自己的鏡像。
看網(wǎng)上有不少方法是創(chuàng)建容器時(shí)執(zhí)行一個(gè) while(true) 的死循環(huán)(當(dāng)然,sleep 一下)或者用 tail -f /dev/null 一類的,反正就是以開(kāi)啟一個(gè)可以常駐的前置進(jìn)程為目的。其實(shí)我們可以更優(yōu)雅的使用 docker 容器的 interactive 和 tty 參數(shù)來(lái)將 sh/bash (*nix 系統(tǒng)必有)命令作為前置命令開(kāi)啟,這樣容器就不會(huì)自動(dòng)退出了。
例如使用 alpine 鏡像做為基礎(chǔ)鏡像,創(chuàng)建一個(gè) alpine 系統(tǒng)小容器,讓其可以常駐運(yùn)行,以便我們登錄交互執(zhí)行某些命令。
# 使用 alpine 系統(tǒng)鏡像創(chuàng)建容器 # -i interactive=true 開(kāi)啟 stdin # -t tty=true 分配會(huì)話終端 # -d 守護(hù)模式 不加也可以 不加就直接進(jìn)入容器中了 需要 ctrl+p+q 切出 # 不能 exit 喲, exit 相當(dāng)于結(jié)束 sh 會(huì)話了 容器會(huì)退出的 docker run -it -d --name alpine alpine sh # alpine 肯定在運(yùn)行 docker ps # 登入容器 docker exec -it alpine sh # apline 使用的 apk 作為包管理 # 安裝個(gè)小火車 # 后續(xù)可以使用 docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl 生成新的鏡像 apk add sl # 退出容器 注:-d 啟動(dòng)的才可以,如果沒(méi)有 -d 啟動(dòng)直接進(jìn)入的 sh終端 則不能退出,否則容器也會(huì)退出 exit
提交容器變更生成新的鏡像
docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl docker images # 有賬號(hào)的話發(fā)布到 docker hub 上去 docker push big_cat/alpine_sl
# 后續(xù)停止/啟動(dòng)容器時(shí)就不需要在指定 -it 參數(shù)了 docker stop alpine docker start alpine
提交容器變更生成新的鏡像
docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl docker images # 有賬號(hào)的話發(fā)布到 docker hub 上去 docker push big_cat/alpine_sl
以上命令其實(shí)是借助 sh/bash 會(huì)話終端作為前置進(jìn)程,使得容器不會(huì)自動(dòng)退出。
如果你覺(jué)得在創(chuàng)建容器時(shí)如此書(shū)寫(xiě)會(huì)很粗陋,沒(méi)關(guān)系,我們可以將這些都推給 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"] # 執(zhí)行 sh
創(chuàng)建容器 & 登入容器
docker-compose up -d big_cat_alpine ./ docker ps docker exec -it big_cat_alpine sh
通過(guò) docker-compose 將那兩個(gè)參數(shù)傳入進(jìn)去,編排后啟動(dòng)服務(wù)容器。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。