操作Docker容器
容器是Docker的另一個核心概念。簡單來說,容器是鏡像的一個運行實例。不同的是,鏡像是靜態的只讀文件,而容器帶有運行時需要的可寫文件層,同時,容器中的應用進程處於運行狀態。
本章將具體介紹圍繞容器的重要操作,包括創建一個容器 、 啓動容器、終止一個容器、進入容器內執行操作、刪除容器和通過導人導出容器來實現容器遷移等。
創建容器
主要介紹Docker容器的create、start、run、wait和logs子命令
1、新建容器
命令:docker [container] create
作用:新建一個容器
由於容器是整個 Docker 技術攏的核心, create 命令和後續的 run 命令支持的選項都十分複雜,需要讀者在實踐中不斷體會 。選項主要包括如下幾大類 :
- 與容器運行模式相關;
- 與容器環境配置相關;
- 與容器資源限制和安全保護相關;
參見表 4-1~表 4-3
2、啓動容器
命令:docker [container] start
作用:啓動一個已經創建的容器
docker容器的啓動有三種方式:
交互方式:基於鏡像新建容器並啓動
- 使用docker run命令來啓動容器,docker在後臺運行的標準操作包括
- 檢查本地是否存在指定的鏡像,不存在則從公有倉庫下載
- 使用鏡像創建並啓動容器
- 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀可寫層
- 從宿主主機配置的網橋接口中橋接一個虛擬接口道容器中去
- 從地址池分配一個ip地址給容器
- 執行用戶指定的應用程序
- 執行完畢之後容器被終止
短暫方式:直接將一個已經終止的容器啓動運行起來
以上,命令執行完,控制檯會打印"hello world",容器就終止了,不過並沒有消失,可以用"docker ps -n 3 "看一下最新前3個的容器,第一個就是剛剛執行過的容器,可以再次執行一遍:docker start [ container_id ],不過這次控制檯看不到”hello world”了,只能看到容器ID,用logs命令才能看得到:docker logs [ container_id ]。這時可以看到兩個”hello world”了,因爲這個容器運行了兩次。
Daemon方式,守護態運行:即讓軟件作爲長時間服務運行
通過-d參數實現Docker容器在後臺以守護態形式運行
容器啓動後會返回一個唯一的id,也可以通過docker ps或docker container ls命令來查看容器信息:
3、查看容器輸出
命令:docker [container] logs
【參數解析】
- -details:打印詳細信息;
- -f,-follow:持續保持輸出;
- -since string:輸出從某個時間開始的日誌;
- -tail string:輸出最近的若干日誌;
- -t,-timestamps:顯示時間戳信息;
- -until string:輸出某個時間之前的日誌;
具體例子可看上一序號的示例。
停止容器
主要介紹Docker容器的pause/unpause、stop和prune子命令
1、暫停容器
命令:docker [container] pause CONTAINER [CONTAINER...]
作用:暫停一個運行中的容器
命令:docker [container] unpause CONTAINER [CONTAINER...]
作用:恢復處於暫停狀態的容器
2、終止容器
命令:docker [container] stop [ -t | --time[=10] ] [CONTAINER...]
作用:終止一個運行中的容器
該命令會首先向容器發送SIGTERM信號,等待一段超時時間後(默認爲10秒),再發送SIGKILL信號來終止容器
此時,執行docker container prune命令,會自動清除掉所有處於停止狀態的容器。
此外,還可以通過docker [container] kill直接發送SIGKILL信號來強行終止容器。
進入容器
在使用-d參數時,容器啓動後會進入後臺,用戶無法看到容器中的信息,也無法進行操作。
這個時候如果需要進入容器進行操作,推薦使用官方的attach或exec命令。
1、attach命令
命令:docker [container] attach [ --detach-keys [ = [ ] ] ] [--no-stdin] [ --sig-proxy [ =true ] ] CONTAINER
【參數解析】
- --detach-keys[ = [ ] ]:指定退出attach模式的快捷鍵序列,默認是CTRL-p、CTRL-q;
- --no-stdin=true | false:是否關閉標準輸入,默認是保持打開;
- --sig-proxy=true | false:是否代理收到的系統信號給應用進程,默認爲true;
【注】然而使用attach命令有時候不方便,當多個窗口同時attach到同一個容器的時候,所有窗口都會同步顯示;當某個窗口因命令阻塞時,其他窗口也無法操作了。
2、exec命令
命令:docker [ container ] exec [ -di -detach ] [ detach-keys [= [ ] ] ] [ -il--interactive ] [ - -piivileged][ -t | --tty ] [ -u I --user [ =USER ] ] CONTAINER COMMAND [ARG . . . ]
【參數解析】
- -d, --detach : 在容器中後臺執行命令;
- -detach-keys ="":指定將容器切回後臺的按鍵;
- -e, - - env= []:指定環境變量列表 ;
- -i, --interactive=true | false :打開標準輸入接受用戶輸入命令, 默認值爲false;
- -- privileged=trueifalse : 是否給執行命令以高權限,默認值爲 false;
- -t, --tty = true | false : 分配僞終端,默認值爲 false;
- - u,--user="":執行命令的用戶名或 ID;
例:進入到剛剛創建容器中,並啓動一個bash
此時,可以在不影響容器內其他應用的前提下,與容器進行交互。
刪除容器
命令:docker [container) rm [ -f | --force) [ -l | --link ] [-v | --volumes ] CONTAINER [ CONTAINER... ]
【參數解析】
- -f,--force=false:是否強行終止並刪除一個運行中的容器;
- -l,--link=false:刪除容器的連接,但保留容器;
- -v,--volumes=false:刪除容器掛載的數據卷;
【注】
- 默認情況下,docker rm命令只能刪除已經處於終止或退出狀態的容器,並不能刪除處於運行狀態的容器;
- 如果要直接刪除一個運行中的容器,可以添加-f參數,Docker會先發送SIGKILL信號給容器,終止其中應用,之後強行刪除;
導入和導出容器
某些時候,需要將容器從一個系統遷移到另外一個系統,此時可以使用Docker的導入和導出功能,這也是Docker自身提供的一個重要特性。
1、導出容器
導出容器是指,導出一個已經創建的容器到一個文件,不管此時這個容器是否處於運行狀態。
命令:docker [container) export [-o l - -output [ =” ” ] ] CONTAINER
【參數解析】
- -o:指定導出的tar文件名,也可通過重定向來實現
之後可以將導出的tar文件傳輸到其他機器上,然後再通過導入命令導入到系統中,實現容器的遷移。
2、導入容器
命令:docker import [ -c | --change [ = [ ] ] ] [ -m | --message [ =MESSAGE ] ] file | URL | -[ REPOSITORY [ :TAG] ]
【注】用戶通過-c,--change=[ ]選項在導入的同時執行對容器進行修改的Dockerfile指令。
例:將導出的ubuntu_18_04.tar.gz文件導入到系統中
【Import和Load的區別】
相同:
- load命令可用來導入鏡像存儲文件到本地鏡像庫,import命令可用來導入一個容器快照到本地鏡像庫;
不同:
- 容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態);
- 鏡像存儲文件將保存完整記錄,體積更大;
因此,從容器快照文件導入時可以重新指定標籤等元數據信息。
查看容器
主要介紹Docker容器的inspect、top和stats子命令
1、查看容器詳情
命令:docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
例:查看某容器的具體信息,會以JSON格式返回包括容器id、創建時間、路徑、狀態、鏡像、配置等在內的各項信息。
2、查看容器內進程
命令:docker [container] top [OPTIONS] CONTAINER [CONTAINER...]
作用:類似於Linux系統中的top命令,會打印出容器內的進程信息,包括PID、用戶、時間、命令等。
例:查看某容器內的進程信息
3、查看統計信息
命令:docker [container] stats [OPTIONS] [CONTIANER...]
作用:顯示CPU、內存、存儲、網絡等使用情況的統計信息
【參數解析】
- -a,-all:輸出所有容器統計信息,默認僅在運行中;
- -format string:格式化輸出信息;
- -no-stream:不持續輸出信息,默認會自動更新持續實時結果;
- -no-trunc:不截斷輸出信息;
例:查看當前運行中容器的系統資源使用統計
其他容器命令
主要介紹Docker容器的cp、diff、port和update子命令
1、複製文件
命令:docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH | -
【參數解析】
- -a,-archive:打包模式,複製文件會帶有原始的uid/gid信息;
- -L,-follow-link:跟隨軟連接。當原路徑爲軟連接時,默認只複製鏈接信息,使用該選項會複製鏈接的目標內容;
2、查看變更
命令:docker [container] diff CONTAINER
例:查看容器內的數據修改
3、查看端口映射
命令:docker container port CONTAINER [PRIVATE_PORT [ / PROTO ] ]
例:查看容器的端口映射情況(寫者未做對應端口映射,查詢無結果)
4、更新配置
命令:docker [contianer] update [OPTIONS] CONTAINER [CONTAINER...]
【參數解析】
- - blkio-weight uint16 :更新塊 IO 限制,10~1000,默認值爲 0,代表着無限制;
- - cpu-period int :限制 CPU 調度器 CFS (Completely Fair Scheduler)使用時間,單位爲微秒,最小 1000;
- - cpu-quota int :限制 CPU 調度器 CFS 配額,單位爲微秒,最小 1000;
- - cpu-rt - period int :限制 CPU 調度器的實時週期,單位爲微秒 ;
- - cpu-rt - runtime int :限制 CPU 調度器的實時運行時,單位爲微秒;
- - c, -cpu-shares int : 限制 CPU 使用份額;
- - cpus decimal :限制 CPU 個數;
- - cpuset-cpus string :允許使用的 CPU 核,如 0-3, 0, 1;
- - cpuset - mems string :允許使用的內存塊,如 0-3, 0, 1;
- - kernel-memory bytes :限制使用的內核內存;
- - m, -memory bytes : 限制使用的內存;
- - memory-reservation bytes :內存軟限制;
- - memory-swap bytes :內存加上緩存區的限制, -1表示爲對緩衝區無限制;
- - restart stri口g : 容器退出後的重啓策略;