Docker 理解好映象和容器的關係

2022-07-04 01:42:14 字數 4051 閱讀 4212

映象也是 docker 的核心元件之一,映象時容器執行的基礎,容器是映象執行後的形態。前面我們介紹了容器的用法,今天來和大家聊聊映象的問題。

1.docker 入門及安裝[docker 系列-1]

2.docker 容器基本操作[docker 系列-2]

3.docker 容器高階操作[docker 系列-3]

總體來說,映象是乙個包含程式執行必要以來環境和**的唯讀檔案,它採用分層的檔案系統,將每一層的改變以讀寫層的形式增加到原來的唯讀檔案上。這有點像洋蔥,一層一層的,當我們後面學習了 dockerfile ,相信大家對於這樣的架構理解將更為準確。

前文已經向讀者介紹過容器的使用了,細心的讀者可能已經發現,容器在啟動或者建立時,必須指定乙個映象的名稱或者 id ,其實,這時映象所扮演的角色就是容器的模版,不同的映象可以構造出不同的容器,同乙個映象,我們也可以通過配置不同引數來構造出不通的容器。如下命令:

docker run -itd --name nginx nginx

命令中的最後乙個 nginx 即表示建立該容器所需要的映象(模版),當然這裡還省略了一些資訊,例如版本號等,這些我們後文會詳細介紹。

映象的最底層是乙個啟動檔案系統(bootfs)映象,bootfs 的上層映象叫做根映象,一般來說,根映象是乙個作業系統,例如 ubuntu、centos 等,使用者的映象必須構建於根映象之上,在根映象之上,使用者可以構建出各種各樣的其他映象。

從上面的介紹讀者可以看出,映象的本質其實就是一系列檔案的集合,一層套一層的結構有點類似於 git ,也有點類似於生活中的洋蔥

通過docker run命令指定乙個容器建立映象時,實際上是在該映象之上建立乙個空的可讀寫的檔案系統層級,可以將這個檔案系統層級當成乙個臨時的映象來對待,而命令中所指的模版映象則可以稱之為父映象。父映象的內容都是以唯讀的方式掛載進來的,容器會讀取共享父映象的內容,使用者所做的所有修改都是在檔案系統中,不會對父映象造成任何影響。當然使用者可以通過其他一些手段使修改持久化到父映象中,這個我們後面會詳細介紹到。

簡而言之,映象就是乙個固定的不會變化的模版檔案,容器是根據這個模版建立出來的,容器會在模版的基礎上做一些修改,這些修改本身並不會影響到模版,我們還可以根據模版(映象)建立出來更多的容器。

如果有必要,我們是可以修改模版(映象)的。

使用者可以通過docker images命令檢視本地所有映象,如下:

這裡一共有五個引數,含義分別如下:

[namespace\ubuntu]:這種倉庫名稱由命名空間和實際的倉庫名組成,中間通過\隔開。當開發者在 docker hub 上建立乙個使用者時,使用者名稱就是預設的命名空間,這個命令空間是用來區分 docker hub 上註冊的不同使用者或者組織(類似於 github 上使用者名稱的作用),如果讀者想將自己的映象上傳到 docker hub 上供別人使用,則必須指定命名空間,否則上傳會失敗。

[ubuntu]:這種只有倉庫名,對於這種沒有命名空間的倉庫名,可以認為其屬於頂級命名空間,該空間的倉庫只用於官方的映象,由 docker 官方進行管理,但一般會授權給第三方進行開發維護。當然使用者自己建立的映象也可以使用這種命名方式,但是將無法上傳到 docker hub 上共享。

[hub.c.163.com/library/nginx]:這種指定 url 路徑的方式,一般用於非 docker hub 上的映象命名,例如乙個第三方服務商提供的映象或者開發者自己搭建的映象中心,都可以使用這種命名方式命名。

使用docker images命令可以檢視本地所有的映象,如果映象過多,可以通過萬用字元進行匹配,如下:

如果需要檢視映象的詳細資訊,也可以通過上文提到的docker inspect命令來檢視。

當使用者執行docker run

其中:在執行docker run

執行命令如下:

映象可以通過docker rmi命令進行刪除,引數為映象的id或者映象名,引數可以有多個,多個引數之間用空格隔開。如下:

通過前面文章的閱讀,讀者已經了解到所謂的容器實際上是在父映象的基礎上建立了乙個可讀寫的檔案層級,所有的修改操作都在這個檔案層級上進行,而父映象並未受影響,如果讀者需要根據這種修改建立乙個新的本地映象,有兩種不同的方式,先來看第一種方式:commit。

首先,根據本地映象執行乙個容器,如下:

命令解釋:

首先執行 docker images 命令,檢視本地映象。

根據本地映象中的 nginx 映象,建立乙個名為 nginx 的容器,並啟動。

將宿主機中乙個名為 index.html 的檔案拷貝到容器中。

訪問容器,發現改變已經生效。

接下來再重新建立乙個容器,名為 nginx2.

訪問 nginx2 ,發現 nginx2 中預設的頁面還是 nginx 的預設頁面,並未發生改變。

接下來,根據剛剛建立的第乙個容器,建立乙個本地映象,如下:

命令解釋:

引數 -m 是對建立的該映象的乙個簡單描述。

--author 表示該映象的作者。

ce1fe32739402 表示建立映象所依據的容器的 id。

sang/nginx 則表示倉庫名,sang 是命名空間,nginx 是映象名。

v1 表示倉庫的 tag。

建立完成後,通過 docker images 命令就可以檢視到剛剛建立的映象。

通過剛剛建立的映象執行乙個容器,訪問該容器,發現 nginx 預設的首頁已經發生改變。

這是我們通過 commint 方式建立本地映象的方式,但是 commit 方式存在一些問題,比如不夠透明化,無法重複,體積較大,為了解決這些問題,可以考慮使用 dockerfile ,實際上,主流方案也是 dockerfile。

dockerfile 就是乙個普通的文字檔案,其內包含了一條條的指令,每一條指令都會構建一層。先來看乙個簡單的例子。

首先在乙個空白目錄下建立乙個名為 dockerfile 的檔案,內容如下:

命令解釋:

from nginx 表示該映象的構建,以已有的 nginx 映象為基礎,在該映象的基礎上構建。

maintainer 指令用來宣告建立映象的作者資訊以及郵箱資訊,這個命令不是必須的。

run 指令用來修改映象,算是使用比較頻繁的乙個指令了,該指令可以用來安裝程式、安裝庫以及配置應用程式等,乙個 run 指令執行會在當前映象的基礎上建立乙個新的映象層,接下來的指令將在這個新的映象層上執行,run 語句有兩種不同的形式:shell 格式和 exec 格式。本案例採用的 shell 格式,shell 格式就像 linux 命令一樣,exec 格式則是乙個 json 陣列,將命令放到陣列中即可。在使用 run 命令時,適當的時候可以將多個 run 命令合併成乙個,這樣可以避免在建立映象時建立過多的層。

copy 語句則是將映象上下文中的hello.html檔案拷貝到映象中。

檔案建立完成後,執行如下命令進行構建:

命令解釋:

-t 引數用來指定映象的命名空間,倉庫名以及 tag 等資訊。

最後面的.是指映象構建上下文。

注意

docker 採用了 c/s 架構,分為 docker 客戶端(docker 可執行程式)與 docker 守護程序,docker 客戶端通過命令列和 api 的形式與 docker 守護程序進行通訊,docker 守護程序則提供 docker 服務。因此,我們操作的各種 docker 命令實際上都是由 docker 客戶端傳送到 docker 守護程序上去執行。我們在構建乙個映象時,不可避免的需要將一些本地檔案拷貝到映象中,例如上文提到的 copy 命令,使用者在構建映象時,需要指定構建映象的上下文路徑(即前文的.), docker build 在獲得這個路徑之後,會將路徑下的所有內容打包,然後上傳給 docker 引擎。

映象構建成功後,可以通過 docker images 命令檢視,如下:

然後建立容器並啟動,就可以看到之前的內容都生效了。

如果您覺得我們的文章還不錯,請幫忙讚賞、在看、**支援,鼓勵我們分享出更好的文章。

Docker 理解好映象和容器的關係

映象也是 docker 的核心元件之一,映象時容器執行的基礎,容器是映象執行後的形態。總體來說,映象是乙個包含程式執行必要以來環境和 的唯讀檔案,它採用分層的檔案系統,將每一層的改變以讀寫層的形式增加到原來的唯讀檔案上。這有點像洋蔥,一層一層的,當我們後面學習了 dockerfile 相信大家對於這...

docker映象和容器

伺服器安裝docker,請網上查詢 windows安裝docker可參考 1.1 docker search fastdfs 在網上搜尋映象資源 1.2 拉取映象並檢視狀態 docker image pull delron fastdfs 拉取映象到本地 docker images 檢視本地映象 d...

Docker映象 容器的理解和使用方法

零 應用背景 先看下面2個問題 1.單機多系統。如 windows上跑linux vps服務 pass服務。windows上跑linux,一般用vm技術實現。vps提供商需要將一台機器劃分成多個虛擬機器,提供給使用者,例如將一台8核16g的物理機器劃分成8個1核2g 實際上會比這個少 給8個使用者使...