? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??🎬慕斯主頁:修仙—別有洞天
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???今日夜電波:秒針を噛む—ずっと真夜中でいいのに。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 0:34━━━━━━?💟──────── 4:20
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 🔄 ? ?? ? ? ? ?? ? ????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?💗關注👍點贊🙌收藏您的每一次鼓勵都是對我莫大的支持😍
目錄
首先理解幾個概念
Docker容器(Container )是什么?
為什么需要容器?
容器的生命周期
容器的命令詳解
1. docker create
2. docker logs
3. docker attach
4. docker exec
5. docker start
6. docker stop
7. docker restart
8. docker kill
9. docker top
10. docker stats
11. docker container inspect
12. docker port
13. docker cp
14. docker diff
15. docker commit
16. docker pause
17. docker unpause
18. docker rm
19. docker export
20. docker wait
21. docker rename
22. docker container prune
23. docker update
容器批量處理技巧
容器自動重啟
一些常見的問題
docker create、 docker start 和 docker run 有什么區別?
docker import 和 docker load 有什么區別?
docker rm & docker rmi & docker prune 的差異?
首先理解幾個概念
Docker容器(Container )是什么?
????????通俗地講,容器是鏡像的運行實體。鏡像是靜態的只讀文件,而容器帶有運行時需要的可寫文件層,并且容器中的進程屬于運行狀態。即容器運行著真正的應用進程。容器有初建、運行、停止、暫停和刪除五種狀態。
????????雖然容器的本質是主機上運行的一個進程,但是容器有自己獨立的命名空間隔離和資源限制。也就是說,在容器內部,無法看到主機上的進程、環境變量、網絡等信息,這是容器與直接運行在主機上進程的本質區別。
????????容器是基于鏡像創建的可運行實例,并且單獨存在,一個鏡像可以創建出多個容器。運行容器化環境時,實際上是在容器內部創建該文件系統的讀寫副本。 這將添加一個容器層,該層允許修改鏡像的整個副本。
????????我們可以理解鏡像為Java 或者 C++的基礎類,容器是實例化出來的一個個對象,沒有用戶需要的不一樣,里面的內容也就不一樣了。
?
下面看看官方給出的Docker 架構,可以結合此圖來理解容器的概念:
?
為什么需要容器?
????????鏡像是靜態的文件,并不能提供服務,就像我拿了個 Linux 或者 Windows 的光盤一樣,只有安裝到主機里面運行起來才能對外提供服務,我們才能使用。容器帶來哪些收益呢,參考我們之前講解的為什么要虛擬化、容器化。
容器的生命周期
容器的生命周期是容器可能處于的狀態。
- created:初建狀態
- running:運行狀態
- stopped:停止狀態
- paused: 暫停狀態
- deleted:刪除狀態
各生命周期之間的轉換關系如圖所示:
?
一些特別說明:
????????killed by out-of-memory(因內存不足被終止):宿主機內存被耗盡,也被稱為 OOM:非計劃終止 這時需要殺死最吃內存的容器
container process exitde(異常終止):出現容器被終止后,將進入 Should restart?
選擇操作:
? yes 需要重啟,容器執行 start 命令,轉為運行狀態。
? no 不需要重啟,容器轉為停止狀態。
????????容器 OOM :Docker 在處理 OOM 事件時分為三種情況(1)如果容器中的應用耗盡了主機系統分配給容器的內存限額,就會觸發 OOM 事件。例如,在容器當中,部署了一個 web 服務。假設主機分配給此容器的內存上限為 1G,當腳本申請的內存大于 1G 時,此容器就會觸發 OOM 事件。而在這種情況下,此容器將會被強制關閉。但需要注意的是,此時關閉容器的并非是 Docker Daemon,而是宿主機操作系統。因為一個容器其實就是一組運行在宿主機操作系統當中的進程,宿主機操作系統通過cgroups 對這組進程設定資源上限,當這些進程申請的資源到達上限時,觸發的是宿主機操作系統的內核 OOM 事件,因此最終是由宿主機內核來關閉這些進程.(2) 如果用戶不想關閉這個容器,那么可以選擇--oom-kill-disable 來禁用 OOM-Killer。使用此參數時,仍需要注意,如果使用-m 設置了此容器內存上限,那么當容器到達內存資源上限時,主機不會關閉容器,但也不會繼續向此容器繼續分配資源,此時容器將處于 hung 狀態。只需要將最壞的情況封閉在一定范圍之內,而不至于蔓延出去。(3)如果用戶使用了--oom-kill-disable,但也沒有使用-m 來設定上限,因而此時此容器將會盡可能多地使用主機內存資源。換言之,主機內存有多大,它就將用多大。
????????容器異常退出 :每個容器內部都存在一個 Init 進程,容器中其他所有進程都是此進程的子進程。運行的容器是因為 Init 進程在運行,如果一個子進程因為某種原因造成了退出,那么其父進程也會同步退出,直至 Init 進程也退出。當 Init 進程退出時,也就代表著此容器被關閉。 ocker 目前沒有辦法知道此時的進程退出屬于正常退出還是異常退出。當出現容器關閉情況時, Docker Daemon 會嘗試再次重新將此容器由 Stopped 狀態轉為 Running狀態。只有設置了--restart 參數的容器, Docker Daemon 才會去嘗試啟動,否則容器會保持停止狀態。
容器暫停 :Docker“剝奪”了此容器的 CPU 資源。而其他資源,如 Memory 資源、 Network 資源等還保留未動。如此一來,失去了 CPU 資源的進程,是不會被主機內核系統所調度的,所以此容器就處于“冰封”狀態。
?
容器的命令詳解
前面的文章已近對run、ps講述過了,這里不多介紹。
Docker 的一系列命令提供了對容器生命周期的全面控制,下面是對這些命令的詳細解析:
1. docker create
用途:創建一個容器但不立即啟動它。
語法:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
關鍵參數:
○ -i: 以交互模式運行容器,通常與 -t 同時使用;
○ -P: 隨機端口映射,容器內部端口隨機映射到主機的端口
○ -p: 指定端口映射,格式為: 主機(宿主)端口:容器端口
○ -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
○ --name="nginx-lb": 為容器指定一個名稱;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 設置環境變量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 綁定容器到指定 CPU 運行;
○ -m :設置容器使用內存最大值;
○ --network="bridge": 指定容器的網絡連接類型;
○ --link=[]: 添加鏈接到另一個容器;
○ --volume , -v: 綁定一個卷
○ --rm :shell 退出的時候自動刪除容器
?
2. docker logs
用途:獲取容器的日志輸出。
語法:
docker logs [OPTIONS] CONTAINER
關鍵參數:
-f
或--follow
:跟隨日志輸出。--since
:顯示自從某個時間點后的日志。--until
:顯示直到某個時間點的日志。--tail -n
:顯示最近 N 行日志。-t,--timestamps
:顯示時間戳 。
?
3. docker attach
用途:將標準輸入、輸出和錯誤流連接到一個正在運行的容器。
語法:
docker attach [OPTIONS] CONTAINER
關鍵參數:
--sig-proxy=true|false
:是否代理信號。
?
如若不使用上述選項,attach后ctrl+c會導致容器退出,如下:
?
?
4. docker exec
用途:在運行中的容器中執行命令。
語法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
關鍵參數:
- -i :即使沒有附加也保持 STDIN 打開
-u
或--user
:設置用戶 ID 或用戶名。- -w,--workdir:指定工作目錄
- -e :設置環境變量
- -t :分配一個偽終端
- -d :分離模式: 在后臺運行
?
5. docker start
用途:啟動一個已創建但未運行的容器。
語法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
關鍵參數:
--attach
:連接到容器的標準輸入/輸出/錯誤
?
6. docker stop
用途:停止一個正在運行的容器。
語法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
關鍵參數:
--time
或-t
:等待容器停止的秒數。
?
7. docker restart
用途:重啟容器。
語法:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
關鍵參數:
--time
或-t
:等待容器停止的秒數。
?
8. docker kill
用途:強制停止一個正在運行的容器。
語法:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
關鍵參數:
SIGNAL
:發送的信號,默認為 SIGKILL。
?
9. docker top
用途:顯示容器內運行的進程。
語法:
docker top CONTAINER
無需參數。
?
10. docker stats
用途:顯示容器的資源使用情況。
語法:
docker stats [OPTIONS] [CONTAINER...]
關鍵參數:
-a
或--all
:顯示所有容器的統計信息。- --format :指定返回值的模板文件。如 table,json
- --no-stream :展示當前狀態就直接退出了,不再實時更新。
- --no-trunc :不截斷輸出
返回報文
CONTAINER ID 與 NAME: 容器 ID 與名稱。
CPU % 與 MEM %: 容器使用的 CPU 和內存的百分比。
MEM USAGE / LIMIT: 容器正在使用的總內存,以及允許使用的內存總量。
NET I/O: 容器通過其網絡接口發送和接收的數據量。
BLOCK I/O: 容器從主機上的塊設備讀取和寫入的數據量。
PIDs: 容器創建的進程或線程數。
如下為:docker stats --format json
?
?
11. docker container inspect
用途:顯示容器的詳細信息。
語法:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
關鍵參數:
○ -f :指定返回值的模板文件。如 table、 json
○ -s :顯示總的文件大小
?
12. docker port
用途:顯示容器的端口映射。
語法:
docker port CONTAINER PRIVATE_PORT[/PROTO]
無需參數。
?
13. docker cp
用途:在容器和本地文件系統之間復制文件或目錄。
語法:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH | docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
關鍵參數:
-L
:保持符號鏈接。
樣例
#將主機/www/目錄拷貝到容器 mynginx 的/www 目錄下。
docker cp /www/ mynginx:/www/
#將容器/www/目錄拷貝到主機的/wwwbak 目錄下。
docker cp mynginx:/www/ /wwwbak/
14. docker diff
用途:顯示容器文件系統的更改。
語法:
docker diff CONTAINER
無需參數。
?
15. docker commit
用途:將容器的更改提交為新的鏡像。
語法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
關鍵參數:
-m
或--message
:提交的信息。-a
或--author
:作者信息。- -c :使用 Dockerfile 指令來創建鏡像;可以修改啟動指令
- -p :在 commit 時,將容器暫停。
?
?
16. docker pause
用途:暫停容器的所有進程。
語法:
docker pause [OPTIONS] CONTAINER [CONTAINER...]
無需參數。
?
17. docker unpause
用途:恢復已暫停的容器。
語法:
docker unpause [OPTIONS] CONTAINER [CONTAINER...]
無需參數。
?
18. docker rm
用途:刪除一個或多個容器。
語法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
關鍵參數:
-f
或--force
:強制刪除運行中的容器。
?
19. docker export
用途:將容器的內容導出為 tar 歸檔。
語法:
docker export CONTAINER > archive.tar
關鍵參數:
- -o:寫入到文件
?
20. docker wait
用途:阻塞直到容器停止,然后返回退出代碼。
語法:
docker wait [OPTIONS] CONTAINER
無需參數。
?
21. docker rename
用途:重命名一個容器。
語法:
docker rename CONTAINER NEW_NAME
無需參數。
?
22. docker container prune
用途:刪除所有已停止的容器。
語法:
docker container prune [OPTIONS]
關鍵參數:
- -f, --force:不提示是否進行確認
?
23. docker update
用途:更新容器的資源限制。
語法:
docker update [OPTIONS] CONTAINER [CONTAINER...]
關鍵參數:
--memory
:設置容器的內存限制。--cpus
:設置容器的 CPU 份額。- --cpuset-cpus :使用哪些 cpu。
- --memory-swap:交換內存 。
- --cpu-period :是用來指定容器對 CPU 的使用要在多長時間內做一次重新分配。
- --cpu-quota: 是用來指定在這個周期內,最多可以有多少時間用來跑這個容器。
docker update
命令用于調整一個或多個正在運行的容器的資源配置,如CPU份額、內存限制、重啟策略等。下面是幾個使用docker update
的例子:
例子
更新容器的CPU份額:
假設你有一個容器,其ID是 abcd1234
,你想增加它的CPU份額,可以使用以下命令:
docker update --cpu-shares 512 abcd1234
這會將容器的CPU份額設置為512。CPU份額是用來決定容器在與其他容器競爭CPU時間時的優先級。
更新容器的內存限制:
如果想限制容器使用的內存,可以使用 --memory
或 -m
選項。例如,將容器 abcd1234
的最大可用內存限制為512MB,可以這樣操作:
docker update --memory 512M abcd1234
更新容器的重啟策略:
你可能希望容器在意外停止后自動重啟。為了設置容器 abcd1234
的重啟策略為總是重啟,可以使用以下命令:
docker update --restart always abcd1234
這將確保當容器意外終止時,Docker守護進程會嘗試自動重啟它。
更新多個容器的配置:
你也可以同時更新多個容器的配置。例如,更新兩個容器 abcd1234
和 efgh5678
的CPU份額和內存限制:
docker update --cpu-shares 256 --memory 256M abcd1234 efgh5678
更新容器的Block IO權重:
對于磁盤I/O,你可以設置容器的Block IO權重,權重范圍在10到1000之間,0表示禁用。例如,將容器 abcd1234
的Block IO權重設置為500:
docker update --blkio-weight 500 abcd1234
請注意,不是所有的配置都可以在容器運行時更新。例如,你不能更新已經運行的容器的網絡配置或更改其基礎鏡像。此外,某些選項(如 --kernel-memory
)在較新的Docker版本中可能已經被棄用。
在執行任何 docker update
命令之前,確保了解你正在更改的配置的具體含義,以及這些更改如何影響容器的性能和穩定性。
容器批量處理技巧
docker container ls
命令(通常簡寫為 docker ps
)用于列出系統上當前運行的Docker容器。但是,docker container ls
是更現代且推薦使用的語法,因為它更清晰地表明了你正在操作的是容器。這兩個命令在功能上是相同的,只是語法略有不同,docker container ls
更符合Docker命令的一致性設計。
基本語法
docker container ls [OPTIONS]
選項說明
-a
,--all
: 顯示所有容器,包括未運行的。如果不加這個選項,默認只顯示正在運行的容器。-f
,--filter
: 用于過濾輸出。例如,你可以通過名字、狀態或其他屬性過濾容器。--format
: 設置輸出格式,可以使用Go模板語言來定制輸出的樣式。-l
,--latest
: 顯示最近創建的容器。--no-trunc
: 不截斷輸出,完整顯示所有信息。--quiet
,-q
: 只顯示容器的ID。
輸出列說明
默認情況下,docker container ls
或 docker ps
的輸出包含以下列:
CONTAINER ID
: 容器的唯一標識符。IMAGE
: 創建容器的鏡像名稱。COMMAND
: 啟動容器時運行的命令。CREATED
: 容器創建的時間。STATUS
: 容器的狀態,如運行中(Up)、已退出(Exited)等。PORTS
: 已映射的端口,如果有的話。NAMES
: 分配給容器的名稱。
示例
- 列出所有容器(包括未運行的):
docker container ls -a
- 只顯示容器的ID:
docker container ls -q
- 根據名字過濾容器:
docker container ls --filter name=myapp
- 自定義輸出格式:
docker container ls --format "table {{.Names}}\t{{.Status}}\t{{.RunningFor}}"
?
理解完前面的操作,那么我們再結合前面所提到的命令,可以做到如下的容器批處理:
docker stop `docker ps -q`
docker start `docker ps -aq`
?
容器自動重啟
容器重啟選項如下:
docker run --restart=no [容器名] :默認值不自動重啟
docker run --restart=on-failure:3 [容器名] : on-failure 若容器的退出狀態非 0,則docker 自動重啟容器,還可以指定重啟次數,若超過指定次數未能啟動容器則放棄
docker run --restart=always [容器名] :always 容器退出時總是重啟
docker run --restart=unless-stopped [容器名] unless-stopped 容器退出時總是重啟,但不考慮 Docker 守護進程啟動時就已經停止的容器
如果容器啟動時沒有設置–restart 參數,則通過下面命令進行更新:docker update --restart=always [容器名]
需要注意的是:
當一個Docker容器配置了自動重啟策略為always時,確實意味著容器會在任何情況下自動重啟,包括容器正常或異常退出之后。這意味著,一旦容器停止運行,Docker守護進程會自動檢測并重新啟動它。
然而,盡管always策略會讓容器在停止后立即重啟,你仍然可以通過以下幾種方式真正地阻止容器的自動重啟:
1、使用docker stop命令。
2、使用docker update命令來更改容器的重啟策略,例如:
docker update --restart=no <container-id-or-name>
3、刪除容器: 如果你不打算再使用這個容器,可以使用docker rm命令來刪除容器。這將徹底阻止容器的自動重啟,因為你已經刪除了容器本身。
刪除運行中的容器需要加上-f或--force選項:
docker rm -f <container-id-or-name>
一些常見的問題
docker create、 docker start 和 docker run 有什么區別?
docker create 命令從 Docker 映像創建一個全新的容器。但是,它不會立即運行它。
docker start 命令將啟動任何已停止的容器。如果使用 docker create 命令創建容器,則可以使用此命令啟動它。docker run 命令是創建和啟動的組合,因為它創建了一個新容器并立即啟動它。實際上,如果 docker run 命令在您的系統上找不到上述映像,它可以從 Docker Hub 中提取映像。
docker import 和 docker load 有什么區別?
想要了解 docker load 與 docker import 命令的區別,還必須知道 docker save與 docker export 命令:
? docker save images_name:將一個鏡像導出為文件,再使用 docker load 命令將文件導入為一個鏡像,會保存該鏡像的的所有歷史記錄。比 docker export 命令導出的文件大,很好理解,因為會保存鏡像的所有歷史記錄。
? docker export container_id:將一個容器導出為文件,再使用 dockerimport 命令將容器導入成為一個新的鏡像,但是相比 docker save 命令,容器文件會丟失所有元數據和歷史記錄,僅保存容器當時的狀態,相當于虛擬機快照。
既可以使用 docker load 命令來導入鏡像庫存儲文件到本地鏡像庫,也可以使用docker import 命令來導入一個容器快照到本地鏡像庫。兩者的區別在于容器快照將會丟棄所有的歷史記錄和元數據信息,而鏡像存儲文件將保存完整記錄,體積也會更大。
docker rm & docker rmi & docker prune 的差異?
docker rm : 刪除一個或多個容器
docker rmi : 刪除一個或多個鏡像
docker prune: 用來刪除不再使用的 docker 對象
?
????????????????????? 感謝你耐心的看到這里?( ′・?・` )比心,如有哪里有錯誤請踢一腳作者o(╥﹏╥)o!?
????????????????????????????????? ? ? ??
????????????????????????????????????????????????????????????????????????給個三連再走嘛~??