在介紹volume指令之前,我們來看下如下場景需求:
1)容器是基於映象建立的,最後的容器檔案系統包括映象的唯讀層+可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來(或者基於容器建立新的映象)。能否可以讓容器程序持久化的資料儲存在主機上呢?這樣即使容器刪除了,資料還在。
2)當我們在開發乙個web應用時,開發環境是在主機本地,但執行測試環境是放在docker容器上。
這樣的話,我在主機上修改檔案(如html,js等)後,需要再同步到容器中。這顯然比較麻煩。
3)多個容器執行一組相關聯的服務,如果他們要共享一些資料怎麼辦?
對於這些問題,我們當然能想到各種解決方案。而docker本身提供了一種機制,可以將主機上的某個目錄與容器的某個目錄(稱為掛載點、或者叫卷)關聯起來,容器上的掛載點下的內容就是主機的這個目錄下的內容,這類似linux系統下mount的機制。 這樣的話,我們修改主機上該目錄的內容時,不需要同步容器,對容器來說是立即生效的。 掛載點可以讓多個容器共享。
下面我們來介紹具體的機制。
一、通過docker run命令
1、執行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash
其中的 -v 標記 在容器中設定了乙個掛載點 /data(就是容器中的乙個目錄),並將主機上的 /home/xqh/myimage 目錄中的內容關聯到 /data下。
這樣在容器中對/data目錄下的操作,還是在主機上對/home/xqh/myimage的操作,都是完全實時同步的,因為這兩個目錄實際都是指向主機目錄。
2、執行命令:docker run --name test1 -it -v /data ubuntu /bin/bash
上面-v的標記只設定了容器的掛載點,並沒有指定關聯的主機目錄。這時docker會自動繫結主機上的乙個目錄。通過docker inspect 命令可以檢視到。
xqh@ubuntu:~/myimage$ docker inspect test1上面 mounts下的每條資訊記錄了容器上乙個掛載點的資訊,"destination" 值是容器的掛載點,"source"值是對應的主機目錄。[ ],
...........................
可以看出這種方式對應的主機目錄是自動建立的,其目的不是讓在主機上修改,而是讓多個容器共享。
二、通過dockerfile建立掛載點
上面介紹的通過docker run命令的-v標識建立的掛載點只能對建立的容器有效。
通過dockerfile的 volume 指令可以在映象中建立掛載點,這樣只要通過該映象建立的容器都有了掛載點。
還有乙個區別是,通過 volume 指令建立的掛載點,無法指定主機上對應的目錄,是自動生成的。
#test上面的dockfile檔案通過volume指令指定了兩個掛載點 /data1 和 /data2.from ubuntu
maintainer hello1
volume [
"/data1
","/data2
"]
我們通過docker inspect 檢視通過該dockerfile建立的映象生成的容器,可以看到如下資訊
"可以看到兩個掛載點的資訊。mounts
": [,],
三、容器共享卷(掛載點)
docker run --name test1 -it myimage /bin/bash
上面命令中的 myimage是用前面的dockerfile檔案構建的映象。 這樣容器test1就有了 /data1 和 /data2兩個掛載點。
下面我們建立另乙個容器可以和test1共享 /data1 和 /data2卷 ,這是在 docker run中使用 --volumes-from標記,如:
可以是**不同映象,如:
docker run --name test2 -it --volumes-from test1 ubuntu /bin/bash
也可以是同一映象,如:
docker run --name test3 -it --volumes-from test1 myimage /bin/bash
上面的三個容器 test1 , test2 , test3 均有 /data1 和 /data2 兩個目錄,且目錄中內容是共享的,任何乙個容器修改了內容,別的容器都能獲取到。
四、最佳實踐:資料容器
如果多個容器需要共享資料(如持久化資料庫、配置檔案或者資料檔案等),可以考慮建立乙個特定的資料容器,該容器有1個或多個卷。
其它容器通過--volumes-from 來共享這個資料容器的卷。
因為容器的卷本質上對應主機上的目錄,所以這個資料容器也不需要啟動。
如: docker run --name dbdata myimage echo "data container"
Dockerfile指令總結
指令的一般格式為instruction arguments,指令包括from maintainer run等。格式為from或from 第一條指令必須為from指令。並且,如果在同乙個dockerfile中建立多個映象時,可以使用多個from指令 每個映象一次 格式為maintainer,指定維護者...
Dockerfile 指令詳解
一種通過commit的方式 把做了一系列操作的容器關閉,然後利用docker的commit指令 dockercommit 容器id 映象名 tag。然後dockerpush到映象倉庫。別人pull下來的再次啟動的時候,就是你當前的操作的形態。另一種是通過dockerfile構建的方式 把操作的步驟通...
Dockerfile 常用指令
下面列出了 dockerfile 中最常用的指令,完整列表和說明可參看官方文件。from 指定 base 映象。maintainer 設定映象的作者,可以是任意字串。copy 將檔案從 build context 複製到映象。copy 支援兩種形式 copy src dest copy src de...