1. 程式人生 > >Docker volume分析

Docker volume分析

本文基於docker v1.13版本

首先檢視本地檔案系統的情況:

[root@localhost /]# df
Filesystem              1K-blocks     Used Available Use% Mounted on
/dev/mapper/centos-root  52403200 26219152  26184048  51% /
devtmpfs                  1923288        0   1923288   0% /dev
tmpfs                     1933472        0   1933472   0% /dev/shm
tmpfs 1933472 17024 1916448 1% /run tmpfs 1933472 0 1933472 0% /sys/fs/cgroup /dev/mapper/centos-home 47760604 32928 47727676 1% /home /dev/sda1 508588 155828 352760 31% /boot tmpfs 386696 0 386696 0
% /run/user/0

啟動一個掛載了網路儲存卷的容器:

[root@localhost /]# docker run -it --rm -v foo:/opt/foo busybox /bin/sh   

再次檢視本地檔案系統的情況:

[root@localhost ~]# df
Filesystem              1K-blocks     Used Available Use% Mounted on
/dev/mapper/centos-root  52403200 26224408  26178792  51% /
devtmpfs                  1923288        0
1923288 0% /dev tmpfs 1933472 0 1933472 0% /dev/shm tmpfs 1933472 17092 1916380 1% /run tmpfs 1933472 0 1933472 0% /sys/fs/cgroup /dev/mapper/centos-home 47760604 32928 47727676 1% /home /dev/sda1 508588 155828 352760 31% /boot tmpfs 386696 0 386696 0% /run/user/0 /dev/dm-4 10474496 34660 10439836 1% /var/lib/docker/devicemapper/mnt/0e975c0bc5b50f8faaf52e3bd5a279ffb47b9a131e34192a4bb153cf5710604f shm 65536 0 65536 0% /var/lib/docker/containers/cc814a199dbe9d542b7a0db6af4b8928f19afd74a60d7f3248125f4177b35902/shm :/opt/test 18307072 8859648 9447424 49% /var/lib/docker/volumes/foo/_data

可以看出,最後多出了三個目錄,其中/var/lib/docker/volumes/foo/_data就是docker維護volume的目錄,也是網路共享目錄的掛載點。

Data Volume和儲存驅動

由於Docker是基於映象,在所有的映象層之上,對每個容器分別建立讀寫層,所以容器中的操作都是在讀寫層中進行的。在容器中如果需要對一個檔案進行改動,docker會從映象的最上層到最下層逐層搜尋這個需要被操作的檔案,然後將它拷貝到讀寫層,然後供容器進行操作。這個操作叫做copy-on-write,並且它只在第一次對該檔案操作的時候會發生,以後所有的操作都是對第一次拷貝的檔案副本的操作。針對不同的容器儲存驅動,copy-on-write的操作效率和實現方式會有所區別。

data volume是一個宿主機的本地目錄,掛載到容器中去。data volume不受docker儲存驅動的控制,在容器中對data volume的讀寫操作,取決於宿主機上該目錄的本地速度,與docker儲存驅動無關。

Docker Engine管理容器資料的兩種方式

  • Data volume
  • Data volume containers

Data volume

data volume可以繞過容器的聯合檔案系統,在多個容器之間共享和持久化資料。
有如下特點:

  • volume在容器建立的時候初始化
  • 可以在容器之間共享和反覆使用
  • 其中的變化會立即生效
  • 其中的變化和映象無關
  • 容器銷燬後依然存在

volume的操作對宿主機和容器中對應目錄的影響

如果在宿主機建立了docker volume並且volume的目錄中已經留存有檔案,同時,該volume掛載到容器中的目錄中也存有檔案,那麼容器該目錄將會指向宿主機的volume目錄,並顯示其中的檔案,容器該目錄中的原有檔案將會在卷umount之後,才可以操作。
另外,如果宿主機上volume目錄為空,容器目標volume目錄不為空,容器啟動的時候,容器目標volume中的檔案將會拷貝到宿主機volume目錄中,即使容器被銷燬,該volume中的檔案依然留存。
具體的實驗結果如下:

[root@localhost _data]# docker run -it busybox:volume
/ # cd busybox:volume/
/volumeInContainer # ls
hahaha

busybox:volume映象的/busybox:volume目錄中存有檔案hahaha,卷hostVolume如下:

[root@localhost _data]# docker volume ls
DRIVER              VOLUME NAME
local               hostVolume
[root@localhost _data]# docker volume inspect hostVolume
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/hostVolume/_data",
        "Name": "hostVolume",
        "Options": {},
        "Scope": "local"
    }
]
[root@localhost _data]# cd /var/lib/docker/volumes/hostVolume/_data
[root@localhost _data]# ls
nothahaha

可見hostVolume中存有檔案nothahaha。啟動容器掛載卷,可見掛載目錄中的檔案是hostVolume的檔案。

[root@localhost _data]# docker run -it -v hostVolume:/volumeInContainer busybox:volume /bin/sh
/ # cd volumeInContainer/
/volumeInContainer # ls
nothahaha

在宿主機hostVolume中沒有檔案的時候:

[root@localhost _data]# cd /var/lib/docker/volumes/hostVolume/_data
[root@localhost _data]# ll
total 0
[root@localhost _data]# docker run -it -v hostVolume:/volumeInContainer busybox:volume /bin/sh
/ # exit
[root@localhost _data]# ll
total 0
-rw-r--r--. 1 root root 0 Jun  7 08:20 hahaha

經過容器卷的掛載之後,容器中的檔案會被持久化到宿主機的hostVolume中。即使刪除容器後,檔案依舊存在。

[root@localhost _data]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
fca3709bbd52        busybox:volume      "/bin/sh"           About a minute ago   Exited (0) About a minute ago                       amazing_clarke
[root@localhost _data]# docker rm fca3
fca3
[root@localhost _data]# ls
hahaha

docker啟動時-v引數

如果是絕對路徑,指定宿主機的絕對路徑;如果是名稱,則對應有名volume。如果該volume不存在,會自動建立。

[root@localhost _data]# docker run -itd -v foo2:/volumeInContainer busybox:volume /bin/sh          
[root@localhost _data]# docker volume ls
DRIVER              VOLUME NAME
local               foo2

相關推薦

Docker volume分析

本文基於docker v1.13版本 首先檢視本地檔案系統的情況: [root@localhost /]# df Filesystem 1K-blocks Used Available Use% Mounted on

DockerScan:Docker安全分析&測試工具

ext 帶來 issue secret 自身 python n) 承擔 幫助 DockerScan:Docker安全分析&測試工具 今天給大家介紹的是一款名叫DockerScan的工具,我們可以用它來對Docker進行安全分析或者安全測試。 項目主頁h

[Docker]Volume

系統調用 並且 names 成了 指定 保存 ace dock 鏡像   容器技術使用rootfs機制和Mount Namespace,構建出一個同宿主機完全隔離開的文件系統環境   那容器裏進程新建的文件,怎麽樣才能讓宿主機獲取到?宿主機上的文件和目錄,怎麽樣才能讓容器裏

docker程序分析

序言      悶熱。無風。。。          非常久沒寫技術文章,所以今天分析一下docker相關的程序。 容器相

Docker Volume

說明 產生 內容 docker容器 文件夾 載體 容器 主機 出錯 Docker Volume Docker的文件系:Docker鏡像是由多個文件系統(只讀層)疊加而成.當我們啟動一個容器的時候,Docker會加載鏡像層並在其上添加一個讀寫層.如果運行中的容器修改了現有的一

Docker價值分析(優缺點和誰在使用?)

Docker價值分析(優缺點和誰在使用?)   摘要: Docker,一個新的容器技術,它能夠在相同的舊伺服器上執行的更多的應用程式,這也使得它很容易打包和釋出程式。 它可以得到相同的硬體上比其他技術執行更多的應用(小的開銷記憶體/ CPU/硬碟,這意味著更低成本); 它使開發人員

Windows下利用goaccess(docker分析Nginx日誌

        由於公司專案需要分析Nginx,工具不少,比如ngxtop的實時監控,經過對其初步瞭解,發現必須所有配置檔案都在nginx.conf下才可以使用。然而專案卻include了很多配置。而且由於資源限制,在伺服器上安裝也不現實,因此有了日誌分析的念頭。而

什麽是Docker Volume?

依然 text ubun man 顯示 作者 -- bind script 摘要:Docker Volume,通常翻譯為數據卷,用於保存持久化數據。當我們將數據庫例如MySQL運行在Docker容器中時,一般將數據通過Docker Volume保存在主機上,這樣即使刪除My

用一個實際例子理解Docker volume工作原理

rip system java字符串 副本 作用 box 令行 高效 mage 要了解Docker Volume,首先我們需要理解Docker文件系統的工作原理。Docker鏡像是由多個文件系統的只讀層疊加而成。當一個容器通過命令docker run啟動時,Docker會加

利用Docker volume修改Nginx Docker映象裡index.html

通過這個小例子我們可以進一步加深對Docker volume概念的理解和使用方法。 我們都知道執行基於Docker的Nginx映象後,訪問localhost能看到Nginx預設的首頁,這個首頁的位置是Nginx映象內的/usr/share/nginx/html目錄下面。 假設我們有個需求,修

修改docker -v 掛載的檔案遇到的問題。inode 軟連結 硬連結 docker volume

原文地址:https://lrita.github.io/2017/08/18/mount-volume-to-docker-and-modify-from-host/ 在啟動docker容器時,為了保證一些基礎配置與宿主機保持同步,通常需要將這些配置檔案掛載進docker容器,例如/etc/r

Dockerdocker volume 掛載到容器(volume的介紹與作用、一)(第十四篇)

        其實想寫這篇文章已經好幾天了,但是一直沒有搞明白這個東西到底該怎麼操作,然後又不知道從何處入手,也去查閱了很多資料,終於搞明白了一點,下面是我最近的實驗總結,總共分為五個部分,第一部分介紹volume的介紹和作用,第二個部分是 掛載在容器,第三個部分是系統目錄

谷歌開源Docker映象分析比對工具container-diff

谷歌釋出了一個叫作 container-diff的工具,用於分析比對Docker映象。它支援檔案系統比對,並能夠感知到由apt、npm和pip這些包管理器所帶來的變更。

docker原始碼分析之容器日誌處理與log-driver實現

子程序:由一個程序(父程序)建立的程序,整合父程序大部分屬性,同時可以被父程序守護和管理。 (2) 你需要知道關於程序產生日誌的形式: 程序產生

基於 rbd nbd 的支援搶鎖的 rbd docker volume plugin

1.注意本plugin的master分支和 Luminous 一起配合,不需要下面的patch本plugin 的 old-volume-helpers和jewel(10.2.2)一起測試過,需要apply 下面的patch:ceph-patch/rbd-nbd-ceph-10

深入理解 Docker Volume

本文主要介紹了Docker Volume的原理以及使用方式,是Docker入門教程的延伸。作者通過從資料的共享、資料容器、備份、許可權以及刪除Volume五方面深入介紹了Volume的工作原理,從實戰中幫助讀者瞭解Volume。 從Docker IRC頻道以及 stacko

Docker volume 掛載卷

    最簡單的hello world輸出映象的製作是最簡單的開始,但是如果我們需要修改我們的執行程式碼,或者有輸入輸出檔案的時候,我們就沒有辦法了,每一個container執行完畢後,其分配的資源以及檔案系統都會消失,那麼我們就需要在本地給docker container

Docker原始碼分析(二)之Docker Client

一、建立Docker Client     Docker是一個client/server的架構,通過二進位制檔案docker建立Docker客戶端將請求型別與引數傳送給Docker Server,Docker Server具體執行命令呼叫。 Docker Client執行流

docker volume 容器卷的那些事(一)

docker volume 容器卷的那些事(二)。接觸 docker 的朋友都知道,docker 映象是以 layer 概念存在的,一層一層的疊加,最終成為我們需要的映象。但該映象的每一層都是 ReadOnly 只讀的。只有在我們執行容器的時候才會建立讀寫層

【原創】docker原始碼分析(2)---docker server

上一節,分析了Engine和job。那這一節就開始講下docker server。 1、docker server 1.1 主體流程 我們從main函式開始,看看docker server