本文主要簡單介紹 docker 容器與前置程序的關係,以及如何編寫 dockerfile/docker-compose.yml 優雅的讓容器可以常駐執行。
docker 容器的生命週期是同容器中的前置程序相關在一起的,這也是我們平時可能會遇到一些容器只是執行幾秒便自動結束的原因:因為容器中沒有乙個常駐的前置程序,前置程序執行結束後,容器便自動退出了。
比如 docker hello-world
# 一閃而過 輸出一堆東西
dowww.cppcns.comcker 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 映象做為基礎映象,建立乙個 alp程式設計客棧ine 系統小容器,讓其可以常駐執行,以便我們登入互動執行某些命令。
# 使用 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 容器不自動退出結束執行的方法
本文位址: /jiqiao/fuwuqi/250728.html
Docker 退出容器和進入容器
執行容器 docker run it 映象名 bin bash 退出容器 exit 或者ctrl p q 檢視容器 docker ps a 檢視執行的容器 docker ps 重啟容器 docker restart 容器id 重啟容器後進入互動式 docker start i 5c6ce895b97...
docker容器保持執行不退出
nsenter工具進入docker容器 概述對於執行在後台的docker容器,我們經常需要做的事情是進入到容器中,docker為我們提供了docker exec docker attach 命令,並且還提供了nsenter工具,外部工具供我們使用。docker attach存在的問題是 當多個視窗同...
docker容器日誌詳解
通過docker logs命令可以檢視容器的日誌。命令格式 docker logs options container options details 顯示更多的資訊 f,follow 跟蹤實時日誌 since string 顯示自某個timestamp之後的日誌,或相對時間,如42m 即42分鐘 ...