開發者不可不知的 Docker 命令
- 2020 年 1 月 2 日
- 筆記

戳藍字「TopCoder」關注我們哦!

學習Docker,首先需要了解Docker基本概念,然後就開始「動手」了(也就是敲Docker命令)。Docker命令較多,這裡筆者總結下常用的Docker命令,方便小夥伴們查閱。
Docker是基於go語言開發,底層技術(Linux下)主要基於cgroups、namespace以及聯合文件技術實現的一種進程級別的輕量級虛擬化解決方案。由於Docker進程隔離獨立於宿主機上其他進程,因此也稱為容器,Docker在容器的基礎上,進行了更進一步的封裝,從文件系統、網路到進程隔離等,極大簡化了容器的創建管理維護工作,降低了開發者使用門檻,因此才在近幾年流行開來(畢竟Docker的底層技術在Docker出現之前就已經存在了)。
Docker命令有2大類,分別是服務端命令和客戶端命令,前者是操作docker服務端(dockerd),後者也就是開發者常用的docker命令,更多Docker命令可以使用 docker help
查看。
- 客戶端命令:基本命令格式為docker [OPTIONS] COMMAND [arg…];
- 服務端命令:基本命令格式為dockerd [OPTIONS]。
客戶端命令
centos下安裝docker可使用命令yum install docker
,mac下需要安裝docker-for-mac,使用命令 wget http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/stable/Docker.dmg
。安裝完成之後可以使用如下命令使用Docker:
service docker start 啟動docker服務 docker version/info 查看docker版本/資訊 docker inspect 查看容器詳細資訊 docker inspect -f {{.State.Pid}} xxxx 查看容器對應的pid docker logs 查看對應容器日誌
Docker有兩個基本概念:鏡像和容器,前者是打包後可執行的容器文件,後者是運行中的Docker實例,二者關係類似 可執行文件
和 進程
的概念。
鏡像命令
鏡像相關命令有搜索、查看、刪除、存檔和載入等,如下:
docker images 查看所有本地鏡像,或者使用命令 docker image ls docker search xxx 搜索官方倉庫中的鏡像 docker pull xxx:tag 下載鏡像,也可以使用docker push 推送自己的鏡像,docker run xxx命令會啟動容器,當本地沒有容器鏡像是會從倉庫中拉取 docker rmi imageName 刪除本地一個或多個鏡像,注意不要和docker rm刪除容器命令混淆 docker rm xxx 刪除一個或多個容器 docker history ubuntu:18.04 查看Ubuntu鏡像的創建過程(各個層內容) docker save -o ubuntu_18.04.tar ubuntu:18.04 導出鏡像到本地文件ubuntu_18.04.tar docker load -i ubuntu_18.04.tar 載入鏡像,或者使用命令 docker < ubuntu_18.04.tar
容器命令
圍繞容器,Docker提供了十分豐富的操作命令,允許用戶高效地管理容器的整個生命周期。可以使用docker container help
命令查看Docker支援的容器操作子命令:
docker ps 列出所有運行中的容器 docker ps -a 列出所有容器,包括停止狀態的 docker ps -a -q 列出所有鏡像的id docker rm containerId 刪除某一個鏡像 docker rm $(docker ps -a -q) 刪除所有處於終止狀態的容器,注意不能刪除正在運行中的容器 docker run -it --rm ubuntu:14:04 bash -it 這是兩個參數,-t是開一個終端(偽終端綁定到容器的標準輸入上),-i是互動式命令讓容器的標準輸入保持打開。--rm是容器退出後刪除,默認情況下容器退出不會自動刪除,方便排查問題。ubuntu:14:04使用的啟動鏡像。bash放在鏡像後面的命令。執行exit命令從容器中退出時,容器會自動退出。有時候需要讓容器已後台守護態運行,此時需要增加-d參數,比如docker urn -d ubuntu。 docker run ubuntu echo "hello world" 在docker容器中運行命令輸出hello world docker start containerId 啟動處於created狀態的容器 docker resetart containerId 重啟處於運行狀態的容器 docker stop containerId 停止容器運行 docker logs xxx 查看容器xxx輸出資訊 docker pause [container] 暫停容器,恢復使用命令docker unpause xxx docker inspect [container] 查看容器的詳細資訊,創建時間、路徑、狀態配置等詳細資訊。 docker top [container] 查看容器內進程資訊。 docker stats [container] 查看容器的CPU、記憶體、網路等統計資訊,支援選項有:-a:輸出所有統計資訊,默認只輸出運行中資訊;-no-stream:不持續輸出,默認會自動更新統計結果。 docker cp zzz.txt 26755872da4d:/tmp:將本地zzz.txt文件複製到容器26755872da4d的/tmp目錄下,也可以使用命令將容器內文件複製到本地機器,docker cp 26755872da4d:/tmp/zzz.txt /tmp。 docker container diff 26755872da4d:container diff命令查看容器內文件系統的變更。 docker container port 26755872da4d:查看容器埠映射。 docker update --cpus 4 26755872da4d:限定容器使用CPU個數為4
container update命令可以更新容器的一些運行時配置,主要是一些資源限制份額。命令格式為docker [container] 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 string:容器退出後的重啟策略。
docker run參數
docker run 啟動容器,可以指定參數設置容器啟動策略,如下:
-d 容器會在後台運行並不會把輸出(STDOUT)列印到宿主機上 -t 讓docker分配一個偽終端並綁定到容器的標準輸入上 -i 讓容器的標準輸入保持打開 -p 映射本地埠和容器埠,格式為-p ip:hostPort:containerPort或者-p hostPort:containerPort。 -P 大寫的P,使用 -P 標記時,Docker 會隨機映射一個 49000~49900 的埠到內部容器開放的網路埠。 --rm 在容器執行完畢後將其刪除,默認只能刪除已停止的容器,如果想要刪除正在運行中容器,可增加-f參數。 --name xxx 執行容器的name
注意,容器是否會長久運行,是和docker run指定的命令有關,和 -d 參數無關。
操作容器
進入容器
容器運行過程中,常常需要進入容器中執行操作場景,可使用如下命令進入容器:
attach:使用命令docker attach containerId/names進入容器,但是使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。注意,進入容器後,如果使用exit退出容器,那麼容器也會停止運行,可以使用命令Ctrl+P+Q來退出但不關閉容器。 nsenter:nsenter 啟動一個新的shell進程(默認是/bin/bash),同時會把這個新進程切換到和目標(target)進程相同的命名空間,這樣就相當於進入了容器內部。nsenter 要正常工作需要有 root 許可權 exec:使用exec命令更加便捷,docker exec -it 775c7c9ee1e1 /bin/bash ,很方便的進入容器
導入/導出容器
docker export -o test.tar [container] 將某個容器導出到本地 docker import test.tar 導入某個容器導出文件(容器導出為鏡像文件,這裡相當於載入鏡像文件)。實際上,既可以使用docker load命令來導入鏡像存儲文件到本地鏡像庫,也可以使用docker[container] import命令來導入一個容器快照到本地鏡像庫。這兩者的區別在於:容器快照文件將丟棄所有的歷史記錄和元數據資訊(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積更大。此外,從容器快照文件導入時可以重新指定標籤等元數據資訊。
埠映射
在啟動容器的時候,如果不指定對應參數,在容器外部是無法通過網路來訪問容器內的網路應用和服務的。當容器中運行一些網路應用,要讓外部訪問這些應用時,可以通過-P或-p參數來指定埠映射。當使用-P(大寫的)標記時,Docker會隨機映射一個49000~49900的埠到內部容器開放的網路埠。
docker run -d -p 500:5000 xxxwebapp python app.py:啟動容器並運行python app.py程式,映射本地500埠到容器5000埠。或者使用docker run -d -p 127.0.0.1:500:5000 xxxwebapp python app.py指定特定地址。 docker run -it --name zzz ubuntu bash docker run -it --name zzz2 --link zzz:zzz ubuntu bash zzz2容器和zzz容器建立互聯關係。 --link參數的格式為--link name:alias,其中name是要鏈接的容器的名稱,alias是別名。 Docker相當於在兩個互聯的容器之間創建了一個虛機通道,而且不用映射它們的埠到宿主主機上。 在啟動db容器的時候並沒有使用-p和-P標記,從而避免了暴露資料庫服務埠到外部網路上。
數據管理
Docker的數據管理主要分為2種:
- 數據卷:容器內數據直接映射到本地;
- 數據卷容器:特定容器維護數據卷。
數據卷(Data Volumes)是一個可供容器使用的特殊目錄,它將主機作業系統目錄直接映射進容器,類似於Linux中的mount行為。如果直接掛載一個文件到容器,使用文件編輯工具,包括vi或者sed –in-place的時候,可能會造成文件inode的改變。從Docker 1.1.0起,這會導致報錯誤資訊。所以推薦的方式是直接掛載文件所在的目錄到容器內。
服務端命令
dockerd命令負責啟動服務端主進程,支援的命令選項如下表所示:



圖片來源《Docker技術入門與實戰 第三版》
Docker命令圖譜
最後來一張Docker圖譜作為結尾吧:

圖片來源《Docker技術入門與實戰 第三版》
推薦閱讀
歡迎小夥伴關注【TopCoder】閱讀更多精彩好文。
