1. 程式人生 > >Dockerfile 指令 VOLUME 介紹

Dockerfile 指令 VOLUME 介紹

在介紹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 命令可以檢視到。

複製程式碼
[email protected]:~/myimage$ docker inspect test1
[
{
    "Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c",
.............................
    "Mounts": [
        {
            "Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01
", "Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true } ], ...........................
複製程式碼

上面 Mounts下的每條資訊記錄了容器上一個掛載點的資訊,"Destination" 值是容器的掛載點,"Source"值是對應的主機目錄。

可以看出這種方式對應的主機目錄是自動建立的,其目的不是讓在主機上修改,而是讓多個容器共享。

二、通過dockerfile建立掛載點

上面介紹的通過docker run命令的-v標識建立的掛載點只能對建立的容器有效。

通過dockerfile的 VOLUME 指令可以在映象中建立掛載點,這樣只要通過該映象建立的容器都有了掛載點。

還有一個區別是,通過 VOLUME 指令建立的掛載點,無法指定主機上對應的目錄,是自動生成的。

#test
FROM ubuntu
MAINTAINER hello1
VOLUME ["/data1","/data2"]

上面的dockfile檔案通過VOLUME指令指定了兩個掛載點 /data1 和 /data2.

我們通過docker inspect 檢視通過該dockerfile建立的映象生成的容器,可以看到如下資訊

複製程式碼
    "Mounts": [
        {
            "Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21",
            "Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data",
            "Destination": "/data1",
            "Driver": "local",
            "Mode": "",
            "RW": true
        },
        {
            "Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36",
            "Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data",
            "Destination": "/data2",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],
複製程式碼

可以看到兩個掛載點的資訊。

三、容器共享卷(掛載點)

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"

轉載地址:https://www.cnblogs.com/51kata/p/5266626.html

相關推薦

docker學習筆記18:Dockerfile 指令 VOLUME 介紹

在介紹VOLUME指令之前,我們來看下如下場景需求: 1)容器是基於映象建立的,最後的容器檔案系統包括映象的只讀層+可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來(或者基於容器建立新的映象)。能否可以讓容器程序持久化的資料儲存在主機上呢?這

Dockerfile 指令 VOLUME 介紹

在介紹VOLUME指令之前,我們來看下如下場景需求:1)容器是基於映象建立的,最後的容器檔案系統包括映象的只讀層+可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來(或者基於容器建立新的映象)。能否可以讓容器程序

Dockerfile指令VOLUME

在介紹VOLUME指令之前,我們來看下如下場景需求: 1)容器是基於映象建立的,最後的容器檔案系統包括映象的只讀層+可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來(或者基於容器建立新的映象)。能否可以讓容器程序持久化的資

Dockerfile 指令 ONBUILD介紹

來源:https://www.cnblogs.com/51kata/p/5265107.html ONBUILD指令可以為映象新增觸發器。其引數是任意一個Dockerfile 指令。 當我們在一個Dockerfile檔案中加上ONBUILD指令,該指令對利用該Dockerfile構建映象(比

DockerFile 指令命令介紹

ARG 是唯一一個可用於FROM前的指令 1 示例 ARG  CODE_VERSION=latest FROM base:${CODE_VERSION} CMD  /code/run-app FROM extras:${CODE_VERSION} CMD&

Dockerfile指令介紹

容器技術創建Docker鏡像的方式有三種1、docker commit命令:由容器生成鏡像;2、Dockerfile文件+docker build命令;3、從本地文件系統導入:OpenVZ的模板。 1. Dockerfile主要指令簡介 Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋

Dockerfile指令詳解--VOLUME 指令

格式為: VOLUME ["<路徑1>", "<路徑2>"...] VOLUME <路徑> 之前我們說過,容器執行時應該儘量保持容器儲存層不發生寫操作,對於資料庫類需要儲存動態資料的應用,其資料庫檔案應該保存於卷(volume)中,後面的章節我們會進一步

Dockerfile 指令 ADD 和 COPY介紹

一、ADD指令 ADD指令的功能是將主機構建環境(上下文)目錄中的檔案和目錄、以及一個URL標記的檔案 拷貝到映象中。 其格式是: ADD  源路徑  目標路徑 如: #test FROM ubuntu MAINTAINER hello ADD test1.txt test1

docker學習筆記16:Dockerfile 指令 ADD 和 COPY介紹

一、ADD指令 ADD指令的功能是將主機構建環境(上下文)目錄中的檔案和目錄、以及一個URL標記的檔案 拷貝到映象中。 其格式是: ADD  源路徑  目標路徑 如: #test FROM ubuntu MAINTAINER hello ADD test1.txt t

Dockerfile指令(1):VOLUME

在介紹VOLUME指令之前,我們來看如下的場景需求: 容器是基於映象建立的,最後的容器檔案系統包括映象的只讀層+可寫層,容器中的程序操作的資料持久化都是儲存在容器的可寫層上。一旦容器刪除後,這些資料就沒了,除非我們人工備份下來(或者基於容器建立新的映象)。能

Docke--Dockerfile指令介紹

Dockerfile 構建映象常用指令  Dockerfile 是一個文字檔案,其內包含了一條條的指定(Instruction),每一條指令構建一層,因此每一條指定的內容,就是描述該層應當如何構建。   通過使用build 命令,根據Dockerfile的描述來構建映象   通過原始碼的方式

Dockerfile指令總結

dockerfile指令總結指令的一般格式為INSTRUCTION arguments,指令包括FROM、MAINTAINER、RUN等。FROM格式為FROM <image>或FROM <image>:<tag>。第一條指令必須為FROM指令。並且,如果在同一個Docke

西門子PLC基本指令功能介紹

地址 基本 輸出 計數器 在線培訓 bit 行業 基礎 輸入 一、標準觸點 LD、A、O、LDN、AN、ON、 LD,取指令。表示一個與輸入母線相連的常開接點指令,即常開接點邏輯運算起始。 LDN,取反指令。表示一個與輸入母線相連的常閉接點指令,即常閉接點邏輯運算起始。

Docker Dockerfile 指令

zip 所在 time 14.04 docker 影響 就是 com mkdir -p Dockerfile 指令 CMD CMD指令用於指定一個容器啟動時要運行的命令。這有點兒類似於RUN指令,只是RUN指令是指定鏡像被構建時要運行的命令,而CMD是指定容器被啟動時要運行

JVM指令介紹

fse inf clas -s val 轉載 signed sig icm 轉載自:http://glutinit.iteye.com/blog/1263446 延伸參考 JVM接收參數和方法調用 void spin() { int i; for

DockerfileDockerfile指令

env .tar.gz nta rfi start.s 容器 tar HA .sh FROM 基於那個鏡像構建容器 例:centos:7 任何Dockerfile的第一條指令必須為FROM指令MAINTAINER 鏡像維護者信息 例:unixzhang <220554

Dockerfile 指令詳解

art 直接 上下 復制 並不會 文件的 pan 環境變量 inter 使用Dockerfiledocker build [選項] <上下文路徑/URL/->其他構建方法直接用Git repo 進行構建用給定的tar壓縮包構建從標準輸入中讀取Dockerfile

12-----指令系統介紹

表達式 true 時間 三元表達式 tcl 介紹 屬性。 當我 接收 所謂指令系統,大家可以聯想咱們的cmd命令行工具,只要我輸入一條正確的指令,系統就開始幹活了。 在vue中,指令系統,設置一些命令之後,來操作我們的數據屬性,並展示到我們的DOM上。 OK,接下來我們一一

dockerfile指令(四)

服務 宋體 cmd 創建 ops psi colspan 變量 col dockerfile: 使用dockerfile快速創建自定義鏡像。 支持以#開頭的註釋行。 分為4部分: 基礎鏡像信息。 維護者信息。 鏡像操作指令。 容器啟動時執行指令

3-3.8 Dockerfile 指令詳解之二

上一篇文章介紹了Dockerfile指令詳解之一,包括: FROM 指定基礎映象 RUN 執行命令 COPY 複製檔案 ADD 更高階的複製檔案 CMD 容器啟動命令 ENTRYPOINT 入口點 ENV 設定環境變數 目錄 1. ARG 構建引數 2. VO