開發者不可不知的 Docker 命令

學習Docker,首先須要瞭解Docker基本概念,而後就開始「動手」了(也就是敲Docker命令)。Docker命令較多,這裏筆者總結下經常使用的Docker命令,方便小夥伴們查閱。java

Docker是基於go語言開發,底層技術(Linux下)主要基於cgroups、namespace以及聯合文件技術實現的一種進程級別的輕量級虛擬化解決方案。因爲Docker進程隔離獨立於宿主機上其餘進程,所以也稱爲容器,Docker在容器的基礎上,進行了更進一步的封裝,從文件系統、網絡到進程隔離等,極大簡化了容器的建立管理維護工做,下降了開發者使用門檻,所以纔在近幾年流行開來(畢竟Docker的底層技術在Docker出現以前就已經存在了)。node

Docker命令有2大類,分別是服務端命令和客戶端命令,前者是操做docker服務端(dockerd),後者也就是開發者經常使用的docker命令,更多Docker命令可使用 docker help 查看。python

  • 客戶端命令:基本命令格式爲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實例,兩者關係相似 可執行文件進程 的概念。web

鏡像命令

鏡像相關命令有搜索、查看、刪除、存檔和加載等,以下: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支持的容器操做子命令:shell

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 啓動容器,能夠指定參數設置容器啓動策略,以下:ubuntu

-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 參數無關centos

操做容器

進入容器

容器運行過程當中,經常須要進入容器中執行操做場景,可以使用以下命令進入容器:

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圖譜做爲結尾吧:

推薦閱讀 

 

 

相關文章
相關標籤/搜索