Docker小白到實戰之常用命令演示,通俗易懂

Code綜藝圈發表於2021-08-20

前言

上一篇大概認識了Docker,主要是從概念、架構、優點及流程方面進行闡述,並進行安裝和體驗; 接下來就開始進行實操學習,在演示過程中會針對關鍵的知識點進行歸納和總結,這裡先從常用命令說起,來吧,小夥伴們。

正文

1. 預覽

Docker和我們熟悉的Git很類似,都是通過命令執行相關操作,當然也有一些介面管理工具(點按鈕的那種),但大家似乎更喜歡直接敲命令,畢竟這種方式更加靈活、更加容易理解操作本質;有大神將常用命令用一張圖很好的展現出來,這裡借用一下(圖片來源於網路,侵刪):

cmd_logic

不熟悉Docker的小夥伴可能看見這圖直接懵圈了,別急,接著往下看, 看完再回過頭來瞅這張圖,絕對感覺很給力。

2. 常用命令實操

2.1 全域性命令
  • docker version:檢視docker版本資訊。

  • docker info:檢視docker詳情資訊,比如倉儲資訊、加速器配置資訊、有多少個映象、有多少個容器、CPU、記憶體等。

  • docker events:從docker 服務獲取實時事件,通俗一點理解就是操作日誌,比如對映象、容器、網路、掛載卷等操作,就會記錄對應的事件資訊;最多能返回最近的1000條日誌資訊

    先在一個終端執行命令,終端會阻塞:

    開啟另一個終端,執行根據映象執行容器的命令:

    此時開啟的第一個終端就實時輸出事件訊息,如映象拉取、容器啟動、容器結束等資訊,如下:

    既然可以把這個命令當做操作日誌理解,那肯定可以根據條件檢視對應的資料,如下:

    如圖所示,會先顯示符合條件的事件資訊,然後會繼續阻塞,如果對服務端有操作,資訊還會實時顯示。常用的引數指定如下:

    -f :根據條件過濾事件,如上圖指定的是映象為hello-world相關的事件資訊;

    --since :從指定的時間戳後顯示所有事件,可以理解為開始時間,支援多種時間格式,預設使用本地主機的時區;

    --until :顯示到指定的時間為止,可以理解為結束時間;

2.2 映象常用命令

映象(image)可以理解為一種輕量級、可獨立執行的軟體包,包含了應用程式及其他執行需要的基礎設施,如執行時、配置檔案、依賴的庫等,所以沒有映象就沒法啟動容器;就好比開發中沒有類(class),又怎麼去根據類建立例項呢。

映象是隻讀的,所以操作命令不多,一般就是增、刪、查。

  • docker images:列出Docker主機上的映象

    可以指定引數,比較常用的如下:

    -a :列出本地所有的映象(含中間映象層,預設過濾掉中間映象層)。

    -q :只顯示映象ID。

    上圖中的-aq就是顯示所有映象的ID,一般用於批量刪除

  • docker search:從遠端倉儲中搜尋映象,後面直接根映象名稱即可

    可以指定條件進行搜尋,如下:

    --filter:指定條件搜尋,is-official表示是否為官方的,stars表示要找多少星星以上的

    對於搜尋,我還是比較喜歡用介面,直觀好看:

  • docker pull:從遠端倉儲中拉取映象,後面跟映象名和tag即可,即指定版本拉取,如果不指定tag,預設就latest,最新的

    映象的分層原理就是採用UnionFS(聯合檔案系統),是一種分層、輕量級的高效能檔案系統;映象可以通過分層來進行繼承,可以基於基礎映象製作出各種具體的應用映象,比如我們剛拉取下來的nginx映象,這裡先了解,後續我們自己製作映象的時候就明白了。

    docker pull 映象名:tag:指定版本拉取;

  • docker rmi:刪除指定映象,後面可以跟名稱或映象ID

    刪除指定版本,如下:

    根據映象ID刪除,可以一下刪除多個,中間用空格隔開:

    刪除全部映象,就是找出所有映象ID,然後刪除就行了,當然肯定不是一個一個的拷貝映象ID;docker images -aq可以顯示所有映象ID ,所以兩個命令結合用即可,如下:

     docker rmi -f $(docker images -aq)
    

    -f:代表強制刪除,比如一些映象和容器有依賴,會提示不能直接刪除,加上這個選項就可以強制刪除。

  • docker save:匯出映象,可以離線拷貝到其他主機上使用,避免沒有網路不能下載映象的場景。

    生成的tar檔案就可以根據需要拷貝到對應裝置上載入使用,不用線上拉取,因為很多場景是不允許連外網的。

  • docker load:載入映象,根據拷貝過來的tar檔案可以直接載入映象到主機上。

    這裡演示就將原來拉取的映象刪除,然後通過load命令重新載入,如下:

    載入映象,如下:

    換一種寫法,如下:

    選項說明:

    --input , -i : 指定匯入的檔案。

    --quiet , -q : 簡化輸出資訊,不顯示具體載入過程。

    注:這裡因為是在TestDockerImage目錄下執行命令,所以指定tar的檔案時,就在當前目錄下。

2.3 容器常用命令

容器是用映象建立的執行例項, 它可以被啟動、開始、停止、刪除,每個容器都是相互隔離;可以把容器看做是一個極簡版的Linux環境和在其中執行程式的組合;

容器和映象幾乎一樣,唯一的區別就是映象層上面載入了一個可寫層,這層稱為容器層

以下對容器的操作,可以指定容器名稱,也可以指定容器ID,演示統一用容器ID,不再重複截圖。

  • docker run:根據映象啟動容器;語法如下:docker run [OPTIONS] IMAGE [COMMAND] [ARG...];

    常用選項引數說明,如下:

    --name="容器名" : 為容器指定一個名稱;

    -d: 後臺執行容器,並返回容器ID;

    -i: 以互動模式執行容器,一般和 -t 同時使用;

    -t: 為容器重新分配一個偽輸入終端,一般和 -i 同時使用;

    -P: 隨機埠對映,容器內部埠隨機對映到主機的埠

    -p: 指定埠對映,格式為:主機埠:容器埠

    演示如下:

    上圖可以看到終端阻塞了,這種模式稱為attached預設,即前臺執行,與之對應的是detached模式,及後臺執行,接下來會演示。 由於終端阻塞,這裡另開一個終端執行docker ps命令看執行的容器,如下:

    前臺執行模式終端很容易被關閉,啟動的nginx容器也會停掉,這種情況對於很多場景是不允許的,所以可以指定為後臺模式執行,即detached模式,如下:

    現在只是在容器內啟動了一個nginx,並監聽80埠,如果需要通過主機能訪問到容器裡面的nginx,還需進行埠對映,如下:

    這裡啟動了兩個nginx容器,都是監聽80埠,但並沒有報埠被佔用的錯,所以容器之間是互不影響的。通過-p選項進行埠對映,這下就可以通過主機的9999埠訪問到容器內部的80埠,如下:

    既然剛開始說可以將容器理解為簡易版的Linux,那就應該可以進入容器內部操作一把,如下:

    在容器裡面只能執行一些核心的命令,因為是極簡版,所以內部只包含重要的功能,如果需要其他功能可以自己安裝擴充套件。

    退出容器的兩種方式:

    a、容器中執行exit命令,容器停止並退出,回到主機;

    b、利用組合鍵ctrl+p+q,容器不停止退出,回到主機;

  • docker ps [OPTIONS] :顯示主機中的容器,不加選項預設只列出執行中的容器

    -a : 顯示所有的容器,包括未執行的;

    -n : 列出最近建立的n個容器;

    演示如下:

  • 啟動和停止容器的命令;

     docker start 容器id  # 啟動被停止的容器
     docker stop 容器id  # 停止執行中的容器
     docker restart 容器id # 重啟容器
     docker kill 容器id  # 強制停止容器
    

    docker stop停止容器,後面可以跟一個或多個容器ID:

    docker start:啟動被停止的容器,後面可以跟一個或多個容器ID:

    docker restart重啟命令和docker kill強制停止命令就不截圖啦

  • docker execdocker attach兩種方式進入正在執行的容器。

    很多場景容器都是後臺執行,但有時需要進入容器內部進行相關配置的更改。

    docker exec:進入容器後開啟一個新的終端,正常執行Linux相關命令。

    docker attach:進入容器正在執行的終端,不會啟動新的程式。

    退出容器模式:

    容器中執行exit命令,容器停止並退出;

    利用組合鍵ctrl+p+q,容器不停止退出;

  • docker logs [OPTIONS] 容器ID:檢視指定容器的日誌;

    常用OPTIONS如下:

    -f :跟蹤日誌輸出

    --since :顯示指定開始時間之後所有日誌

    -t : 顯示時間戳

    --tail :列出最新N條容器日誌

    可以指定選項,檢視需要的日誌,如下:

  • docker top 容器ID:列出指定容器內部的程式,可以看到容器內的應用程式是否正常執行,如下:

  • docker inspect 容器ID:檢視指定容器的詳細資訊,比如執行狀態、網路配置、掛載的卷等資訊都有,如下:

  • docker commit:根據容器生成一個新的映象;容器是可編輯的,有些時候需要將已更改的容器生成一個新的映象給其他人用。

    命令說明:

    -a :提交的映象作者;

    -m :提交時的說明文字;

    命令中testcommitimage:v1是自定義的映象名和tag;

    根據新生成的映象啟動容器,則內部就會有建立的對應檔案(容器內部可以根據需要任意改,這裡只是演示建立檔案而已)。

  • docker exportdocker import將容器方便離線匯出和匯入;

    命令說明:

     #將容器匯出為tar檔案
     docker export -o testexport.tar 030aa6fcd7f3
     # -o 指定輸出位置和檔名
     # 030aa6fcd7f3 這個是容器ID
     
     #根據生成的tar檔案匯入為映象
     docker import testexport.tar testexportimagename:v2
     # 指定對應的tar檔案
     # testexportimagename:v2 映象名和版本, 可以自己定義
    

    這對命令是不是和映象的docker savedocker load這對命令用法很相似,但兩種方式不能混用,因為export匯出的僅僅是容器快照,save儲存的是完整的映象檔案。

  • docker rm 容器ID:刪除指定容器,執行中的容器預設不讓刪除,可以增加-f選項強制刪除,如下:

以上只是總結了平時比較常用的命令,並沒有全部列出,更多細節可以進入官網:https://docs.docker.com/engine/reference/commandline/rm/

總結

上面內容主要針對映象和容器的常用命令進行演示和說明,關於資料卷、dockerfile、網路相關的命令後面單獨分享;

看到這裡,相信文章開頭的那張圖小夥伴們已經差不多看懂了,而且圖片中的模組劃分、箭頭指向都很有意義;還有好多幹貨在後面,關注“Code綜藝圈”,和我一起學習吧;

圖片

相關文章