Docker Container(容器)
一、什么是容器?
通俗地講,容器是鏡像的運行實體。鏡像是靜態的只讀文件,而容器帶有運行時需要的可寫文件層,并且容器中的進程屬于運行狀態。即容器運行著真正的應用進程。容器有初建、運行、停止、暫停和刪除五種狀態。
雖然容器的本質是主機上運行的一個進程,但是容器有自己獨立的命名空間隔離和資源限制。也就是說,在容器內部,無法看到主機上的進程、環境變量、網絡等信息,
這是容器與直接運行在主機上進程的本質區別。
容器是基于鏡像創建的可運行實例,并且單獨存在,一個鏡像可以創建出多個容器。運行容器化環境時,實際上是在容器內部創建該文件系統的讀寫副本。 這將添加一個
容器層,該層允許修改鏡像的整個副本。
容器生活案例?
鏡像與容器就相當于同樣是開發商提供的毛坯房,但是兩家人裝修出來的完全不一樣。
或者我們都學習了 Java 或者 C++之類的面向對象的語言,可以理解為鏡像為基礎類,
容器是實例化出來的一個個對象,沒有用戶需要的不一樣,里面的內容也就不一樣了。
為什么需要容器?
鏡像是靜態的文件,并不能提供服務,就像我拿了個 Linux 或者 Windows 的光盤一樣,只有安裝到主機里面運行起來才能對外提供服務,我們才能使用。
容器帶來哪些收益呢,參考我們之前講解的為什么要虛擬化、容器化。
二、容器的生命周期
容器的生命周期是容器可能處于的狀態。
- created:初建狀態
- running:運行狀態
- stopped:停止狀態
- paused: 暫停狀態
- deleted:刪除狀態
各生命周期之間的轉換關系如圖所示:
docker create : 創建容器后,不立即啟動運行,容器進入初建狀態;
docker run : 創建容器,并立即啟動運行,進入運行狀態;
docker start : 容器轉為運行狀態;
docker stop : 容器將轉入停止狀態;
docker kill : 容器在故障(死機)時,執行 kill(斷電),容器轉入停止狀態,這種操作容易丟失數據,除非必要,否則不建議使用;
docker restart : 重啟容器,容器轉入運行狀態;
docker pause : 容器進入暫停狀態;
docker unpause : 取消暫停狀態,容器進入運行狀態;
docker rm : 刪除容器,容器轉入刪除狀態。
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 資源的進程,是不會被主機內核系統所調度的,所以此容器就處于“冰封”狀態。
三、容器命令
1.容器命令清單
2.容器命令詳解
1.docker create
功能:創建一個新的容器但不啟動它
語法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]別名
docker container create關鍵參數
○ -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 退出的時候自動刪除容器
○ --restart:自動重啟
示例
2.docker run
功能:創建一個新的容器并運行一個命令
語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]別名
docker container run關鍵參數
○ -d: 后臺運行容器,并返回容器 ID;比 create 多了這個參數 (**********)
○ -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 退出的時候自動刪除容器
○ --restart:自動重啟
示例
使用 docker 鏡像 nginx:1.23.4 以后臺模式啟動一個容器,將容器的 8051 端口映射到主機的 80 端口,并將容器命名為 mywebsite4root@Nanyiroot:~# docker run -d -p 8051:80 --name mywebsite4 nginx:1.23.4
9c9cbafea7f42491eef80e9238829eecd5db48b292d39f7e0c447c62c93c56d3
root@Nanyiroot:~# docker ps | grep 8051
9c9cbafea7f4 nginx:1.23.4 "/docker-entrypoint.…" 32 seconds ago Up 31 seconds 0.0.0.0:8051->80/tcp, [::]:8051->80/tcp mywebsite4
3.docker ps
功能:列出容器
語法
docker ps [OPTIONS]別名
docker container ls, docker container list, docker container ps關鍵參數
○ -a :顯示所有的容器,包括未運行的。
○ -f :根據條件過濾顯示的內容。
○ --format :指定返回值的模板文件。如 json 或者 table
○ -l :顯示 latest 的容器。
○ -n :列出最近創建的 n 個容器。
○ --no-trunc :不截斷輸出。
○ -q :靜默模式,只顯示容器編號。
○ -s :顯示總的文件大小。
示例:
4.docker logs
功能:查看容器日志
語法:
docker logs [OPTIONS] CONTAINER別名
docker container logs關鍵參數
○ -f ,--follow: 跟蹤日志輸出
○ --since :顯示某個開始時間的所有日志
○ -t,--timestamps : 顯示時間戳
○ -n,-tail :僅列出最新 N 條容器日志
示例1:跟蹤查看容器 mywebsite4 的日志輸出
示例2:查看容器 mynginx 從 2025 年 3 月 17 日后的最新 10 條日志
5.docker attach
功能:連接到正在運行中的容器。
語法
docker attach [OPTIONS] CONTAINER別名
docker container attach關鍵參數
--sig-proxy:是否將所有信號代理,默認是 true,如果設置為 false,退出的話不會影響容器,否則退出會導致容器退出
示例:
此處按了 Ctrl + C 后會把容器殺死。
帶上參數 重新啟動 mywebsite4 并且ctrl + c
此時按了 Ctrl + C 并沒有把容器殺死
顯示報文為:CONTAINER ID:容器 ID。
IMAGE:使用的鏡像。
COMMAND:啟動容器時運行的命令。
CREATED:容器的創建時間。
STATUS:容器狀態。
PORTS:容器的端口信息和使用的連接類型(tcp \ udp)。
NAMES:自動分配的容器名稱。
6.docker exec
功能:在容器中執行命令
語法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]別名:
docker container exec關鍵參數:
○ -d :分離模式: 在后臺運行
○ -i :即使沒有附加也保持 STDIN 打開
○ -t :分配一個偽終端
○ -e :設置環境變量
○ -u,--user :指定用戶 "<name|uid>[:<group|gid>]"
○ -w,--workdir:指定工作目錄
示例1:在容器 mynginx 中以交互模式執行 echo
示例2:在容器 mynginx 中以交互模式打開 shell
示例3:通過 id 進去,docker ps 可以看到容器 id
7.docker start
功能:啟動停止的容器
語法:
docker start [OPTIONS] CONTAINER [CONTAINER...]別名:
docker container start
示例:
8.docker stop
功能:停止運行的容器
語法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]別名:
docker container stop關鍵參數
○ -s :發送的信號
9.docker restart
功能:重啟容器
語法:
docker restart [OPTIONS] CONTAINER [CONTAINER...]別名:
docker container restart關鍵參數
○ -s :發送信號
10.docker kill
功能:強制退出容器
語法:
docker kill [OPTIONS] CONTAINER [CONTAINER...]別名:
docker container kill關鍵參數:
-s :發送的信號注意事項:
○ docker stop 發送的是 SIGTERM 信號,docker kill 發送的是 SIGKILL 信號
11.docker top
功能:查看容器中運行的進程信息,支持 ps 命令參數
語法:
docker top CONTAINER [ps OPTIONS]別名:
docker container top注意事項:
容器運行時不一定有/bin/bash 終端來交互執行 top 命令,而且容器還不一定有top 命令,可以使用 docker top 來實現查看 container 中正在運行的進程。
示例:查看容器進程信息
12.docker stats
功能:顯示容器資源的使用情況,包括: CPU 、內存、網絡 I/O 等
語法:
docker stats [OPTIONS] [CONTAINER...]別名:
docker container stats關鍵參數:
○ --all , -a :顯示所有的容器,包括未運行的。
○ --format :指定返回值的模板文件。如 table,json
○ --no-stream :展示當前狀態就直接退出了,不再實時更新。
○ --no-trunc :不截斷輸出。返回報文
CONTAINER ID 與 NAME: 容器 ID 與名稱。
CPU % 與 MEM %: 容器使用的 CPU 和內存的百分比。
MEM USAGE / LIMIT: 容器正在使用的總內存,以及允許使用的內存總量。
NET I/O: 容器通過其網絡接口發送和接收的數據量。
BLOCK I/O: 容器從主機上的塊設備讀取和寫入的數據量。
PIDs: 容器創建的進程或線程數。
示例1:列出所有在運行的容器信息
示例2: json 格式顯示
示例3:定制化的表格顯示
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
13.docker container inspect
功能:查看容器詳細信息
語法:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]關鍵參數:
○ -f :指定返回值的模板文件。如 table、json
○ -s :顯示總的文件大小。注意事項:
docker inspect 會自動檢查是鏡像還是容器然后顯示相信信息
示例:
14.docker port
功能:用于列出指定的容器的端口映射,或者查找將 PRIVATE_PORT NAT 到面向公眾的端口。
語法:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]別名:
docker container port
示例:
15.docker cp
功能:在容器和宿主機之間拷貝文件。
語法:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH別名:
docker container cp樣例
#將主機/www/目錄拷貝到容器mynginx 的/www目錄下。
docker cp /www/ mynginx:/www/
#將容器/www/目錄拷貝到主機的/wwwbak目錄下。
docker cp mynginx:/www/ /wwwbak/
示例
16.docker diff
功能:檢查容器里文件結構的更改。
語法:
docker diff CONTAINERC表示change
A表示add
示例
17.docker commit
功能:從容器創建一個新的鏡像。
語法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 參數:
○ -a :提交的鏡像作者;
○ -c :使用 Dockerfile 指令來創建鏡像;可以修改啟動指令
○ -m :提交時的說明文字;
○ -p :在 commit 時,將容器暫停。
示例:基于已有的 nginx:1.23.4
容器,創建一個新鏡像 mywebsite4:v1.0
,并驗證是否能保存你在容器中做的改動
關鍵:把正在運行的容器 快照成一個新的鏡像,叫做 mywebsite4:v1.0
。
Docker 鏡像版本迭代和驗證修改是否保留的過程
🔁 場景:在 mywebsite4forcommit
容器中修改了文件,然后通過 docker commit
生成新的鏡像 mywebsite4:v2.0
,并驗證修改是否成功保存。
啟動鏡像 v2.0,進入容器交互式終端,并設置 --rm 表示退出后自動刪除容器(只是為了測試,不留垃圾)
18.docker pause
功能:暫停容器中所有的進程
語法:
docker pause CONTAINER [CONTAINER...] 別名:
docker container pause
示例:
19.docker unpause
功能:恢復容器中所有的進程
語法:docker unpause CONTAINER [CONTAINER...]別名:
docker container unpause
20.docker rm
功能:刪除停止的容器
語法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]別名:
docker container rm關鍵參數:
-f :通過 SIGKILL 信號強制刪除一個運行中的容器。
示例1:刪除 mywebsite5 容器
示例二:刪除所有停止的容器
docker rm $(docker ps -a -q)
21.docker export
功能:導出容器內容為 tar 文件 – 導出的時候會丟失數據
語法:
docker export [OPTIONS] CONTAINER別名:
docker container export關鍵參數:
○ -o:寫入到文件。
示例:導出 mywebsite6 為tar
其中docker export docker import是對應的,之前我們也學過docker import 在鏡像里
22.docker wait
功能:阻塞運行直到容器停止,然后打印出它的退出代碼。
語法:
docker wait CONTAINER [CONTAINER...]別名:
docker container wait
示例:
23.docker rename
功能:重命名容器。
語法:
docker rename CONTAINER NEW_NAME別名:
docker container rename
示例:
24.docker container prune
功能:刪除所有停止的容器
語法:
docker container prune [OPTIONS]關鍵參數:
-f,--force:不提示是否進行確認。
示例:
25.docker update
功能:更新容器配置。
語法:
docker update [OPTIONS] CONTAINER [CONTAINER...]別名:
docker container update 關鍵參數
○ --cpus:cpu 數量
○ --cpuset-cpus :使用哪些 cpu
○ --memory :內存限制
○ --memory-swap:交換內存
○ --cpu-period :是用來指定容器對 CPU 的使用要在多長時間內做一次重新分配
○ --cpu-quota:是用來指定在這個周期內,最多可以有多少時間用來跑這個容器
示例: