摘要:其實我們可以更優(yōu)雅的使用容器的和參數(shù)來將系統(tǒng)必有命令作為前置命令開啟常駐運行,如此容器便不會自動退出了。
本文主要簡單介紹 docker 容器與前置進程的關(guān)系,以及如何編寫 Dockerfile/docker-compose.yml 優(yōu)雅的讓容器可以常駐運行。
docker 容器的生命周期是同容器中的前置進程相關(guān)在一起的,這也是我們平時可能會遇到一些容器只是運行幾秒便自動退出的原因:因為容器中沒有一個常駐的前置進程,前置進程運行結(jié)束后,容器便自動退出了。
比如 docker hello-world
# 一閃而過 輸出一堆東西 docker run --name hello-world hello-world # 可以看到 hello-world 容器已經(jīng)退出了 docker ps -a
那怎樣可以讓容器不自動退出呢?比如我們想登入一個純凈的 OS容器 alpine/centos/ubuntu 之類的,在其基礎(chǔ)上安裝一些服務組件,然后在 commit 成自己的鏡像。
看網(wǎng)上有不少方法是創(chuàng)建容器時執(zhí)行一個 while(true) 的死循環(huán)(當然,sleep 一下)或者用 tail -f /dev/null 一類的,反正就是以開啟一個可以常駐的前置進程為目的。
其實我們可以更優(yōu)雅的使用 docker 容器的 interactive 和 tty 參數(shù)來將 sh/bash (*nix 系統(tǒng)必有)命令作為前置命令開啟常駐運行,如此容器便不會自動退出了。
例如使用 alpine 鏡像做為基礎(chǔ)鏡像,創(chuàng)建一個 alpine 系統(tǒng)小容器,讓其可以常駐運行,以便我們登錄交互執(zhí)行某些命令。
部分鏡像可能有自己的 entrypoint 命令作為容器的前置進程,會無效化我們 run 時傳入的執(zhí)行 sh 的命令,需使用 --entrypoint="" 進行覆蓋。如需涉及相關(guān)的訪問權(quán)限,也請加上 --privileges=true 選項。
# 使用 alpine 系統(tǒng)鏡像創(chuàng)建容器 # -i interactive=true 開啟 stdin # -t tty=true 分配會話終端 # -d 守護模式 不加也可以 不加就直接進入容器中了 需要 ctrl+p+q 切出,不能 exit,exit 相當于結(jié)束前置的 sh 會話了 容器會退出的 docker run -it -d --name my_alpine alpine sh # my_alpine 容器處于運行狀態(tài) docker ps # 登入容器 docker exec -it my_alpine sh # 查看 sh 會話數(shù)量 你會發(fā)現(xiàn)我們 run 時開啟的 sh 正在其中 ps # apline 使用的 apk 作為包管理 # 安裝個小火車 # 后續(xù)可以使用 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 # 有賬號的話發(fā)布到 docker hub 上去 docker push big_cat/alpine_sl
# 后續(xù)停止/啟動容器日常操作即可 docker stop alpine docker start alpine
提交容器變更生成新的鏡像
docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl docker images # 有賬號的話發(fā)布到 docker hub 上去 docker push big_cat/alpine_sl
以上命令其實是借助 sh/bash 會話終端作為前置進程,使得容器不會自動退出。
如果你覺得在創(chuàng)建容器時如此書寫會很粗陋,沒關(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
通過 docker-compose 將那兩個參數(shù)傳入進去,編排后啟動服務容器。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28079.html
摘要:為什么要用對開發(fā)者來說啟動速度快傳統(tǒng)虛擬機需要數(shù)分鐘的啟動時間秒秒鐘啟動。開發(fā)者只需要代碼到版本管理即可,接下來的自動測試,自動構(gòu)建,自動部署都交給吧更輕松的擴展。 1. 前言 相見恨晚用來形容我對docker的熱愛再合適不過了,自從用了docker,開發(fā)環(huán)境也不安裝了,系統(tǒng)想換就換了,部署更是一鍵部署,再也不用擔心在這臺機器上跑的好好的,其它機器有問題了... 寫這篇文章,也是為do...
摘要:了解開源的容器平臺用于分享管理容器的平臺使用客戶端服務器架構(gòu)模式。守護進程會處理復雜繁重的任務,例如建立運行發(fā)布你的容器??蛻舳撕褪刈o進程之間通過或者進行通信。 Step1:了解Docker 開源的容器平臺:Golang https://github.com/docker/dockerDocker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平臺 -- D...
摘要:在之前公眾號的數(shù)人云工程師手記基于的集群管理開發(fā)實踐對的服務發(fā)現(xiàn)及負載均衡有詳細的介紹。服務名稱為服務命名,必須為英文或數(shù)字。 本文是數(shù)人云9月22日線上微信群分享的文章實錄。數(shù)人云容器管理面板Crane開源以來,很多小伙伴對它還不是非常了解,數(shù)人云工程師金鑫從Crane技術(shù)背景、環(huán)境準備和使用步驟等方面為大家做了詳細的介紹,并整理大家常見的問題逐一進行了解答。 引言 Docker1....
摘要:前言是一個在之上構(gòu)建的一個高性能協(xié)程全??蚣埽诶锩媸且粋€高級技能,所以在相關(guān)的環(huán)境安裝上也給許多人造成了很大的困擾,更是如此,本文將通過以一種極其簡單的方式解決運行環(huán)境和開發(fā)環(huán)境的部署。 showImg(https://segmentfault.com/img/bVbeknK?w=512&h=197); 本系列文章將從使用層面介紹 Swoft 框架的使用及業(yè)務開發(fā),面向初中級的 P...
閱讀 1358·2021-09-22 15:09
閱讀 2678·2021-08-20 09:38
閱讀 2419·2021-08-03 14:03
閱讀 878·2019-08-30 15:55
閱讀 3384·2019-08-30 12:59
閱讀 3561·2019-08-26 13:48
閱讀 1899·2019-08-26 11:40
閱讀 681·2019-08-26 10:30