前言
上一篇大概認識了Docker,主要是從概念、架構、優點及流程方面進行闡述,並進行安裝和體驗; 接下來就開始進行實操學習,在演示過程中會針對關鍵的知識點進行歸納和總結,這里先從常用命令說起,來吧,小伙伴們。
正文
1. 預覽
Docker和我們熟悉的Git很類似,都是通過命令執行相關操作,當然也有一些界面管理工具(點按鈕的那種),但大家似乎更喜歡直接敲命令,畢竟這種方式更加靈活、更加容易理解操作本質;有大神將常用命令用一張圖很好的展現出來,這里借用一下(圖片來源於網絡,侵刪):
不熟悉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 exec
和docker 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 export
和docker import
將容器方便離線導出和導入;命令說明:
#將容器導出為tar文件 docker export -o testexport.tar 030aa6fcd7f3 # -o 指定輸出位置和文件名 # 030aa6fcd7f3 這個是容器ID #根據生成的tar文件導入為鏡像 docker import testexport.tar testexportimagename:v2 # 指定對應的tar文件 # testexportimagename:v2 鏡像名和版本, 可以自己定義
這對命令是不是和鏡像的
docker save
、docker load
這對命令用法很相似,但兩種方式不能混用,因為export導出的僅僅是容器快照,save保存的是完整的鏡像文件。 -
docker rm 容器ID
:刪除指定容器,運行中的容器默認不讓刪除,可以增加-f選項強制刪除,如下:
以上只是總結了平時比較常用的命令,並沒有全部列出,更多細節可以進入官網:https://docs.docker.com/engine/reference/commandline/rm/;
總結
上面內容主要針對鏡像和容器的常用命令進行演示和說明,關於數據卷、dockerfile、網絡相關的命令后面單獨分享;
看到這里,相信文章開頭的那張圖小伙伴們已經差不多看懂了,而且圖片中的模塊划分、箭頭指向都很有意義;還有好多干貨在后面,關注“Code綜藝圈”,和我一起學習吧;