1. 程式人生 > >初識Docker學習-Docker的基本命令和概念

初識Docker學習-Docker的基本命令和概念

docker的基本命令-拉取、執行、停止、刪除映象,檢視日誌等操作,以及對應的概念說明

docker的基本操作

注:本文基於《Docker-從入門到實踐》的學習

獲取映象

Docker Hub (https://hub.docker.com/search/?q=&type=image ) 有許多高質量的映象,先說說如何獲取這些映象。

從 Docker 映象倉庫獲取映象的命令是 docker pull 。其命令格式為:

docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標籤]

具體的選項可以通過 docker pull --help 命令看到,這裡我們說一下映象名稱的格式。

  • Docker 映象倉庫地址:地址的格式一般是 <域名/IP>[:埠號] 。預設地址是 DockerHub
  • 倉庫名:如之前所說,這裡的倉庫名是兩段式名稱,即 <使用者名稱>/<軟體名>
    對於 DockerHub,如果不給出使用者名稱,則預設為 library ,也就是官方映象

現在我們獲取個 ununtu的官方映象試一下:
在這裡插入圖片描述
沒有制定映象倉庫地址,所以會預設去官方拿,而映象名稱是 ubuntu:16.04
因此將會獲取官方映象 library/ubuntu 倉庫中標籤為 16.04 的映象

下載過程中可以看出,之前寫的初始Docker學習中提及的分層儲存的概念,映象是多層儲存所構成。
所以下載也是一層一層去下載,不是單個檔案。每一層的ID也輸出了(12位),也打印出了完整的sha256摘要

執行

啟動一個容器

有了映象後,就能夠以這個映象為基礎啟動並執行一個容器

docker run --name webserver -d -p 80:80 nginx

這條命令會用 nginx 映象啟動一個容器,命名為 webserver ,並且映射了 80 埠。
這樣我們可以用瀏覽器去訪問這個 nginx 伺服器。
這裡就簡單的啟動個nginx映象,由於我沒有下載,它自動下載並啟動了。
在這裡插入圖片描述
在這裡插入圖片描述

容器內的一些操作

以互動式終端方式進入 webserver 容器,並執行了 bash 命令,也就是獲得一個可操作的 Shell。

然後,我們用 <h1 style = "color:red;">Hello Docker!</h1> 覆蓋了 /usr/share/nginx/html/index.html 的內容。再重新整理瀏覽器的話,會發現內容被改變了。

在這裡插入圖片描述
我們修改了容器的檔案,也就是改動了容器的儲存層。我們可以通過 docker diff 命令看到具體的改動。

這裡簡要的說明一下上面用到的引數。

  • -it :這是兩個引數,一個是 -i :互動式操作,一個是 -t 終端。我們這裡打算進入bash 執行一些命令並檢視返回結果,因此我們需要互動式終端。
  • –rm :這個引數是說容器退出後隨之將其刪除。預設情況下,為了排障需求,退出的容器並不會立即刪除,除非手動 docker rm 。我們這裡只是隨便執行個命令,看看結果,不需要排障和保留結果,因此使用 --rm 可以避免浪費空間。。
  • bash :放在映象名後的是命令,這裡我們希望有個互動式 Shell,因此用的是 bash 。
  • exit 退出了這個容器。

如果仔細觀察之前的 docker diff webserver 的結果,你會發現除了真正想要修改的/usr/share/nginx/html/index.html 檔案外,由於命令的執行,還有很多檔案被改動或添加了。這還僅僅是最簡單的操作,如果是安裝軟體包、編譯構建,那會有大量的無關內容被新增進來,如果不小心清理,將會導致映象極為臃腫。所以一般不建議修改映象後再commit儲存映象,建議使用Dockerfile定製映象。

停止執行中的容器

通過 ps -n 條數 可以檢視執行的容器(包括執行中和已停止的容器)
在這裡插入圖片描述
這裡可以看到 之前我們運行了兩次就停止的hello-world,還有一個還在執行的 nginx

通過 docker stop 容器ID 即可停止
在這裡插入圖片描述
當然想再次啟動也可以通過 docker start 容器ID 進行啟動

檢視執行的日誌

通過 docker logs 容器ID 可檢視容器執行的相關日誌(檢視下之前執行的萬惡之源)
在這裡插入圖片描述
也可以通過 docker attach 容器ID 進行實時連線檢視(這裡我頁面重新整理,日誌實時更新)
在這裡插入圖片描述

檢視已經下載的映象

docker image ls

檢視映象

刪除本地映象

如果要刪除本地的映象,可以使用 docker image rm 命令

docker image rm [選項]<映象1>[<映象2> ....]

其中, <映象> 可以是 映象短 ID 、 映象長 ID 、 映象名 或者 映象摘要刪除圖片
如果觀察上面這幾個命令的執行輸出資訊的話,你會注意到刪除行為分為兩類,一類是Untagged ,另一類是 Deleted 。我們之前介紹過,映象的唯一標識是其 ID 和摘要,而一個映象可以有多個標籤。

因此當我們使用上面命令刪除映象的時候,實際上是在要求刪除某個標籤的映象。所以首先需要做的是將滿足我們要求的所有映象標籤都取消,這就是我們看到的 Untagged 的資訊。因為一個映象可以對應多個標籤,因此當我們刪除了所指定的標籤後,可能還有別的標籤指向了這個映象,如果是這種情況,那麼 Delete 行為就不會發生。所以並非所有的 dockerimage rm 都會產生刪除映象的行為,有可能僅僅是取消了某個標籤而已當該映象所有的標籤都被取消了,該映象很可能會失去了存在的意義,因此會觸發刪除行為

映象是多層儲存結構,因此在刪除的時候也是從上層向基礎層方向依次進行判斷刪除。映象的多層結構讓映象複用變動非常容易,因此很有可能某個其它映象正依賴於當前映象的某一層。這種情況,依舊不會觸發刪除該層的行為。直到沒有任何層依賴當前層時,才會真實的刪除當前層。

除了映象依賴以外,還需要注意的是容器對映象的依賴。如果有用這個映象啟動的容器存在(即使容器沒有執行),那麼同樣不可以刪除這個映象。之前講過,容器是以映象為基礎,再加一層容器儲存層,組成這樣的多層儲存結構去執行的。因此該映象如果被這個容器所依賴的,那麼刪除必然會導致故障。如果這些容器是不需要的,應該先將它們刪除,然後再來刪除映象。

一些基本的操作和指令到此結束,後面將講解Dockerfile和進一步學習其他指令。
注:可以通過 命令 --help 的方式檢視其他引數的使用方法