Docker核心技術(shù)之容器詳解
一、容器簡介
容器(Container):容器是一種輕量級、可移植、并將應(yīng)用程序進(jìn)行的打包的技術(shù),使應(yīng)用程序可以在幾乎任何地方以相同的方式運(yùn)行 docker將鏡像文件運(yùn)行起來后,產(chǎn)生的對象就是容器。容器相當(dāng)于是鏡像運(yùn)行起來的一個(gè)實(shí)例。 容器具備一定的生命周期。 另外,可以借助docker ps命令查看運(yùn)行的容器,如同在linux上利用ps命令查看運(yùn)行著的進(jìn)程那樣。
二、容器與虛擬機(jī)
Docker容器與虛擬機(jī)相同點(diǎn)
容器和虛擬機(jī)一樣,都會對物理硬件資源進(jìn)行共享使用。
容器和虛擬機(jī)的生命周期比較相似(創(chuàng)建、運(yùn)行、暫停、關(guān)閉等等)。
容器中或虛擬機(jī)中都可以安裝各種應(yīng)用,如redis、mysql、nginx等。也就是說,在容器中的操作,如同在一個(gè)虛擬機(jī)(操作系統(tǒng))中操作一樣。
同虛擬機(jī)一樣,容器創(chuàng)建后,會存儲在宿主機(jī)上:linux上位于/var/lib/docker/containers下
Docker容器與虛擬機(jī)不同點(diǎn)
注意:容器并不是虛擬機(jī),但它們有很多相似的地方
虛擬機(jī)的創(chuàng)建、啟動和關(guān)閉都是基于一個(gè)完整的操作系統(tǒng)。一個(gè)虛擬機(jī)就是一個(gè)完整的操作系統(tǒng)。而容器直接運(yùn)行在宿主機(jī)的內(nèi)核上,其本質(zhì)上以一系列進(jìn)程的結(jié)合。
容器是輕量級的,虛擬機(jī)是重量級的。首先容器不需要額外的資源來管理(不需要Hypervisor、Guest OS),虛擬機(jī)額外更多的性能消耗;其次創(chuàng)建、啟動或關(guān)閉容器,如同創(chuàng)建、啟動或者關(guān)閉進(jìn)程那么輕松,而創(chuàng)建、啟動、關(guān)閉一個(gè)操作系統(tǒng)就沒那么方便了。
也因此,意味著在給定的硬件上能運(yùn)行更多數(shù)量的容器,甚至可以直接把Docker運(yùn)行在虛擬機(jī)上。
三、容器的生命周期
虛擬機(jī)的生命周期
容器的生命周期
四、容器的生命周期管理
容器創(chuàng)建 – docker create
作用: ?? ?利用鏡像創(chuàng)建出一個(gè)Created 狀態(tài)的待啟動容器
命令格式: ?? ?docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
命令參數(shù)(OPTIONS):-t, --tty ? ? ? ? ? ?? ??? ?分配一個(gè)偽TTY,也就是分配虛擬終端
-i, --interactive ? ??? ?即使沒有連接,也要保持STDIN打開
--name ? ? ? ? ??? ??? ?為容器起名,如果沒有指定將會隨機(jī)產(chǎn)生一個(gè)名稱
命令參數(shù)(COMMAND\ARG): ?? ?COMMAND 表示容器啟動后,需要在容器中執(zhí)行的命令,如ps、ls 等命令 ?? ?ARG 表示執(zhí)行 COMMAND 時(shí)需要提供的一些參數(shù),如ps 命令的 aux、ls命令的-a等等
命令演示:
容器啟動 – docker start
作用: ?? ?將一個(gè)或多個(gè)處于創(chuàng)建狀態(tài)或關(guān)閉狀態(tài)的容器啟動起來
命令格式: ?? ?docker start [OPTIONS] CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS): ?? ?-a, --attach?? ??? ?將當(dāng)前shell的 STDOUT/STDERR 連接到容器上
-i, --interactive?? ??? ?將當(dāng)前shell的 STDIN連接到容器上
命令演示:
docker run 與 docker create + docker start
docker run 相當(dāng)于 docker create + docker start –a ? ? ? 前臺模式
docker run -d 相當(dāng)于 docker create + docker start ? ? ? 后臺模式
容器暫停 – docker pause
作用: ?? ?暫停一個(gè)或多個(gè)處于運(yùn)行狀態(tài)的容器
命令格式: ?? ?docker pause CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS): ?? ?無
命令演示:
容器取消暫停 – docker unpause
作用: ?? ?取消一個(gè)或多個(gè)處于暫停狀態(tài)的容器,恢復(fù)運(yùn)行
命令格式: ?? ?docker unpause CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS): ?? ?無
命令演示:
容器關(guān)閉 – docker stop
作用: ?? ?關(guān)閉一個(gè)或多個(gè)處于暫停狀態(tài)或者運(yùn)行狀態(tài)的容器
命令格式: ?? ?docker stop [OPTIONS] CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS): ?? ?-t, --time int ? ?? ??? ?關(guān)閉前,等待的時(shí)間,單位秒(默認(rèn) 10s)
命令演示:
容器終止 – docker kill
作用: ?? ?強(qiáng)制并立即關(guān)閉一個(gè)或多個(gè)處于暫停狀態(tài)或者運(yùn)行狀態(tài)的容器
命令格式: ?? ?docker kill [OPTIONS] CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS): ?? ?-s, --signal string ? ?? ?指定發(fā)送給容器的關(guān)閉信號 (默認(rèn)“KILL”信號)
命令演示:
docker stop和docker kill的區(qū)別
前提知識點(diǎn):
Linux其中兩種終止進(jìn)程的信號是:SIGTERM和SIGKILL
SIGKILL信號:無條件終止進(jìn)程信號。進(jìn)程接收到該信號會立即終止,不進(jìn)行清理和暫存工作。該信號不能被忽略、處理和阻塞,它向系統(tǒng)管理員提供了可以殺死任何進(jìn)程的方法。
SIGTERM信號:程序終結(jié)信號,可以由kill命令產(chǎn)生。與SIGKILL不同的是,SIGTERM信號可以被阻塞和終止,以便程序在退出前可以保存工作或清理臨時(shí)文件等。
docker stop 會先發(fā)出SIGTERM信號給進(jìn)程,告訴進(jìn)程即將會被關(guān)閉。在-t指定的等待時(shí)間過了之后,將會立即發(fā)出SIGKILL信號,直接關(guān)閉容器。
docker kill 直接發(fā)出SIGKILL信號關(guān)閉容器。但也可以通過-s參數(shù)修改發(fā)出的信號。
因此會發(fā)現(xiàn)在docker stop的等過過程中,如果終止docker stop的執(zhí)行,容器最終沒有被關(guān)閉。而docker kill幾乎是立刻發(fā)生,無法撤銷。
此外還有些異常原因也會導(dǎo)致容器被關(guān)閉,比如docker daemon重啟、容器內(nèi)部進(jìn)程運(yùn)行發(fā)生錯(cuò)誤等等“異常原因”。
容器重啟 – docker restart
作用: ?? ?重啟一個(gè)或多個(gè)處于運(yùn)行狀態(tài)、暫停狀態(tài)、關(guān)閉狀態(tài)或者新建狀態(tài)的容器 ?? ?該命令相當(dāng)于stop和start命令的結(jié)合
命令格式: ?? ?docker restart [OPTIONS] CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS): ?? ? -t, --time int ? ?? ??? ?重啟前,等待的時(shí)間,單位秒(默認(rèn) 10s) ?? ??? ??? ??? ?實(shí)則是關(guān)閉前等待的時(shí)間
容器刪除 – docker container rm
作用: ?? ?刪除一個(gè)或多個(gè)容器
命令格式: ?? ?docker container rm [OPTIONS] CONTAINER [CONTAINER...] ? ? ? 或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS): ?? ? -f, --force ? ? ?? ??? ?強(qiáng)行刪除容器(會使用 SIGKILL信號)
-v, --volumes ? ?? ??? ?同時(shí)刪除綁定在容器上的數(shù)據(jù)卷
命令演示:
五、容器信息查看
容器詳細(xì)信息 – docker container inspect
作用: ?? ?查看本地一個(gè)或多個(gè)容器的詳細(xì)信息
命令格式: ?? ?docker container inspect [OPTIONS] CONTAINER [CONTAINER...] ? ? ? 或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]
命令參數(shù)(OPTIONS):?? ? ?? ?-f, --format string?? ?利用特定Go語言的format格式輸出結(jié)果
-s, --size?? ??? ?顯示總大小
命令演示:
容器日志信息 – docker logs
作用: ?? ?查看容器的日志信息
命令格式: ?? ?docker logs [OPTIONS] CONTAINER
命令參數(shù)(OPTIONS):?? ? ?? ? ? ?--details?? ??? ?顯示日志的額外信息
-f, --follow ? ? ? ? ?? ??? ?動態(tài)跟蹤顯示日志信息
--since string ??? ?只顯示某事時(shí)間節(jié)點(diǎn)之后的
--tail string ? ??? ??? ?顯示倒數(shù)的行數(shù)(默認(rèn)全部)
-t, --timestamps ? ? ?? ?顯示timestamps時(shí)間
--until string ? ?? ?只顯示某事時(shí)間節(jié)點(diǎn)之前的
注意: ?? ?容器日志中記錄的是容器主進(jìn)程的輸出STDOUT\STDERR
容器重命名 – docker rename
作用: ?? ?修改容器的名稱
命令格式: ?? ?docker rename CONTAINER NEW_NAME
命令參數(shù)(OPTIONS):?? ? ?? ?無
六、容器運(yùn)行時(shí)操作
容器連接 – docker attach
作用: ?? ?將當(dāng)前終端的STDIN、STDOUT、STDERR綁定到正在運(yùn)行的容器的主進(jìn)程上實(shí)現(xiàn)連接
命令格式: ?? ?docker attach [OPTIONS] CONTAINER
命令參數(shù)(OPTIONS):?? ? ?? ?--no-stdin ? ? ? ? ? ? ?? ?不綁定STDIN
容器中執(zhí)行新命令 – docker exec
作用: ?? ?在容器中運(yùn)行一個(gè)命令
命令格式: ?? ?docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
命令參數(shù)(OPTIONS):?? ? ?? ?-d, --detach ? ? ? ? ? ? ? ?? ?后臺運(yùn)行命令
-i, --interactive?? ??? ?即使沒連接容器,也將當(dāng)前的STDIN綁定上
-t, --tty ? ? ? ? ? ? ? ? ??? ?分配一個(gè)虛擬終端
-w, --workdir string ? ? ? ?? ?指定在容器中的工作目錄
-e, --env list ? ? ? ? ? ? ?? ?設(shè)置容器中運(yùn)行時(shí)的環(huán)境變量
七、容器總結(jié)
容器的詳解到這結(jié)束,后面還有更深入的文章講解!
Docker Linux 容器
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。