docker學(xué)習(xí)-docker容器運(yùn)行
docker run是啟動容器的方法,可以用三種指定的方式指定容器啟動時(shí)執(zhí)行的命令。
(1)CMD指令
(2)ENTRYPOINT指令
(3)在docker run中命令行中指定
但是docker run并不能長期保持running狀態(tài),我們經(jīng)常需要進(jìn)入到容器中去做一些工作,比如查看日志、調(diào)試、啟動其他進(jìn)程等。有兩種進(jìn)入容器的方式:attach和exec。
docker attach首先啟動一個(gè)容器,保持后臺長期運(yùn)行
docker run -d ubuntu /bin/bash -c "while true; do sleep 1; echo i_am_a_container;done首先檢查容器的ID
docker ps -a
CONTAINER ID就是容器的編號,其實(shí)就是容器ID前12個(gè)字符,又叫短ID
IMAGE就是base IMAGE
NAMES是容器的名稱,在啟動容器的時(shí)候可以通過 --name參數(shù)顯式的為容器命名。
通過docker attach可以attach到容器啟動命令的終端。
docker attach 1e5cc7e3b22b ?
通過短ID attach到了容器的啟動命令終端,之后看到的是echo每秒輸出一次打印信息
可以通過ctl+p,然后ctl+q退出attach終端
docker exec通過docker exec進(jìn)入相同的容器
docker exec -it 1e5cc7e3b22b bash
說明
1、-it 以交互的形式打開終端,執(zhí)行bash
2、可以像普通linux一樣執(zhí)行命令,顯示了容器啟動的進(jìn)程
3、退出容器
docker exec命令格式如下:
docker exec -it <container> bash |shattach vs exec兩者的主要區(qū)別如下:
1、attch直接進(jìn)入容器啟動命令的終端,不會啟動新的進(jìn)程
2、exec則是在容器中打開新的終端,而且可以啟動新進(jìn)程
3、如果想直接在終端中查看啟動命令的輸出,用attach,其他情況用exec
運(yùn)行容器的最佳實(shí)踐按用途容器大致可以分為兩類:服務(wù)類容器和工具的容器
前者以daemon的形式運(yùn)行,對外提供服務(wù),比如Web Server、數(shù)據(jù)庫等。通過-d 以后臺的方式啟動這類容器是非常合適的,如果要排查問題,可以通過exec -it進(jìn)入容器
后者容器通常能給我們提供一個(gè)臨時(shí)的工作環(huán)境,通常以run -it方式進(jìn)行
工具類容器多使用基礎(chǔ)鏡像,例如busybox,debian,ubuntu等
總結(jié)如下:
(1)當(dāng)CMD,Entypoint和docker run命令行指定的命令運(yùn)行結(jié)束時(shí),容器停止
(2)通過-d參數(shù)在后臺啟動容器
(3)通過exec -it可以進(jìn)入容器并執(zhí)行命令
容器生命周期stop/start/restart容器docker stop:停止運(yùn)行中的容器,容器在docker host中其實(shí)就是一個(gè)進(jìn)程,該命令本質(zhì)上是像該進(jìn)程發(fā)送一個(gè)SIGTERM信號,也可通過docker kill命令快速停止容器
docker start: 對于停止的容器??梢酝ㄟ^該命令進(jìn)行啟動,會保留容器的第一次啟動時(shí)的參數(shù)
docker restart :重啟容器
pause/unpause容器docker pause:讓容器暫停,如需要對容器的文件系統(tǒng)打快照
unpause:處于pause狀態(tài)的容器不會占用CPU資源,直到通過dokcer unpause恢復(fù)運(yùn)行
刪除容器docker rm:使用docker一段時(shí)間后,host上可能會有大量已經(jīng)退出的容器,這些容器依然會占用host的文件系統(tǒng)資源,可以使用docker rm進(jìn)行刪除
如果希望一次刪除多個(gè)容器,則可以使用如下命令
docker rm -v $(docker ps -aq -f status=exited)容器的狀態(tài)機(jī)制整個(gè)容器的生命周期狀態(tài)機(jī)制,如下所示:
資源限制一個(gè)docker host上會運(yùn)行若干容器,每個(gè)容器都需要cpu,內(nèi)存和IO資源。Docker提供了類似的機(jī)制避免某個(gè)容器因占用太多資源而影響到其他容器或者整個(gè)HOST的資源
內(nèi)存限額與操作系統(tǒng)類似,容器可使用的內(nèi)存包括兩個(gè)部分:物理內(nèi)存和swap。Docker通過下面的兩組參數(shù)來控制容器內(nèi)存的使用量
(1)-m或 --memory:設(shè)置內(nèi)存的使用限制
(2)--memory-swap:設(shè)置內(nèi)存+swap的使用限制
例如:
docker run -m 200M --memory-swap=300M ubuntu
含義時(shí)允許該容器最多使用200M的內(nèi)存和300MB的 swap。默認(rèn)情況下,上面兩組參數(shù)為-l,即對容器內(nèi)存和swap的使用沒有限制
測試使用progrium/stress鏡像,該鏡像可以用于對容器執(zhí)行壓力測試
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M說明:
1、--vm1:啟動1個(gè)內(nèi)存工作線程
2、--vm-bytes 280M,每個(gè)線程分配280MB內(nèi)存
過程:
1分配280M內(nèi)存
2釋放280M內(nèi)存
3再分配280M內(nèi)存
4再釋放
5 一致持續(xù)循環(huán)
cpu限制默認(rèn)設(shè)置下,所有的容器可以平等的使用hostCPU資源,而且沒有限制
docker可以通過-c或者--cpu-shares設(shè)置容器使用cpu的權(quán)重,如果不指定,默認(rèn)值1024
與內(nèi)存限額不同,通過-c設(shè)置的cpu ?share并不是cpu資源的絕對數(shù)量,而是一個(gè)相對的權(quán)重值。某個(gè)容器最終能分配的到的CPU資源取決于它的cpu share總和和比例,換句話說通過cpu share可以設(shè)置容器使用CPU的優(yōu)先級
docker run --name "container_A" -c 1024 ubuntu && docker run --name "container_B" -c 512 ubuntucontainer_A的cpu share 1024,是containerB的兩倍,當(dāng)兩個(gè)容器都需要CPU資源時(shí),前者可以得到的cpu是后者的兩倍
需要特別注意的是,這種按權(quán)重分配CPU的只會發(fā)生在CPU資源緊張的情況下。如果containerA處于空閑狀態(tài),這時(shí)為了充分利用CPU資源,containrB也可以分配到全部可用的cpu
Block IO帶寬限制Block IO是另一種可以限制容器資源,它是指磁盤的讀寫,docker可以通過設(shè)置權(quán)重,限制bsp和iops的方式控制容器讀寫磁盤的帶寬。
IO權(quán)重
默認(rèn)情況下,所有的容器能平等的讀寫磁盤,可以通過設(shè)置 --blkio-weight 參數(shù)來改變?nèi)萜鞯腷lock IO的優(yōu)先級
--blkio-weight與--cpu-share類似,設(shè)置的是相對權(quán)重,默認(rèn)為500
docker run -it --name container_A --blkio-weight 600 ubuntu && docker run --it --name container_B --blkio-weight 300 ubuntu通過命令行設(shè)定,containerA的讀寫磁盤帶寬是containerB的兩倍
限制bps和iopsbsp是byte per second ,每秒讀寫的數(shù)據(jù)量
iops是ip per second,每秒IO的次數(shù)
可以通過以下參數(shù)控制容器的bsp和 iops
--device-read-bps,限制讀某個(gè)設(shè)備的 bps。
--device-write-bps,限制寫某個(gè)設(shè)備的 bps。
--device-read-iops,限制讀某個(gè)設(shè)備的 iops。
--device-write-iops,限制寫某個(gè)設(shè)備的 iops。
cgroup和namespacecgropu和namespace是實(shí)現(xiàn)容器底層的最重要的兩種技術(shù)。cgroup實(shí)現(xiàn)資源限制,namespace實(shí)現(xiàn)資源的隔離
cgroupcgroup 全稱 Control Group。Linux 操作系統(tǒng)通過 cgroup 可以設(shè)置進(jìn)程使用 CPU、內(nèi)存 和 IO 資源的限額。前面我們看到的--cpu-shares、-m、--device-write-bps 實(shí)際上就是在配置 cgroup。
可以在/sys/fs/cgroup中找到
docker run -it --cpu-shares 512 progrium/stress -c 1記錄容器ID。在 /sys/fs/cgrouXXXpu/docker 目錄中,Linux 會為每個(gè)容器創(chuàng)建一個(gè) cgroup 目錄,以容器長ID 命名:
目錄中包含所有與 cpu 相關(guān)的 cgroup 配置,文件 cpu.shares 保存的就是 --cpu-shares 的配置,值為 512。
同樣的,/sys/fs/cgroup/memory/docker 和 /sys/fs/cgroup/blkio/docker 中保存的是內(nèi)存以及 Block IO 的 cgroup 配置
namespace在每個(gè)容器中,我們都可以看到文件系統(tǒng),網(wǎng)卡等資源,這些資源看上去是容器自己的。拿網(wǎng)卡來說,每個(gè)容器都會認(rèn)為自己有一塊獨(dú)立的網(wǎng)卡,即使 host 上只有一塊物理網(wǎng)卡。這種方式非常好,它使得容器更像一個(gè)獨(dú)立的計(jì)算機(jī)。
Linux 實(shí)現(xiàn)這種方式的技術(shù)是 namespace。namespace 管理著 host 中全局唯一的資源,并可以讓每個(gè)容器都覺得只有自己在使用它。換句話說,namespace 實(shí)現(xiàn)了容器間資源的隔離。
Linux 使用了六種 namespace,分別對應(yīng)六種資源:Mount、UTS、I*、PID、Network 和 User。
Mount namespace
Mount namespace 讓容器看上去擁有整個(gè)文件系統(tǒng)。
容器有自己的 / 目錄,可以執(zhí)行 mount 和 umount 命令。當(dāng)然我們知道這些操作只在當(dāng)前容器中生效,不會影響到 host 和其他容器。
UTS namespace
簡單的說,UTS namespace 讓容器有自己的 hostname。 默認(rèn)情況下,容器的 hostname 是它的短ID,可以通過 -h 或 --hostname 參數(shù)設(shè)置。
I P C namespace
IPC namespace 讓容器擁有自己的共享內(nèi)存和信號量(semaphore)來實(shí)現(xiàn)進(jìn)程間通信,而不會與 host 和其他容器的 IPC 混在一起。
PID namespace
能夠使容器能夠擁有自己的PID
Network namespace
Network namespace 讓容器擁有自己獨(dú)立的網(wǎng)卡、IP、路由等資源。我們會在后面網(wǎng)絡(luò)章節(jié)詳細(xì)討論。
User namespace
User namespace 讓容器能夠管理自己的用戶,host 不能看到容器中創(chuàng)建的用戶。
常用命令以下是容器的常用操作命令
create ?????創(chuàng)建容器 ?
run ????????運(yùn)行容器 ?
pause ??????暫停容器 ?
unpause ????取消暫停繼續(xù)運(yùn)行容器 ?
stop ???????發(fā)送 SIGTERM 停止容器 ?
kill ???????發(fā)送 SIGKILL 快速停止容器 ?
start ??????啟動容器 ?
restart ????重啟容器 ?
attach ?????attach 到容器啟動進(jìn)程的終端 ?
exec ???????在容器中啟動新進(jìn)程,通常使用 "-it" 參數(shù) ?
logs ???????顯示容器啟動進(jìn)程的控制臺輸出,用 "-f" 持續(xù)打印 ?
rm ?????????從磁盤中刪除容器
了解更多相關(guān)內(nèi)容歡迎關(guān)注http://www.vecloud.com