天天看點

Docker Data Volume 詳解及示例1、Docker Data Volume2、示例 13、示例 2 — 新建立 Docker Volume 綁定指定的主控端目錄,并在兩個 Docker 實作 Volume 共享

Docker Data Volume 詳解及示例

  • 1、Docker Data Volume
    • 1.1 概念介紹
    • 1.2 Docker Volume 管理機制
    • 1.3 Docker Volume Types
    • 1.4 Docker Volume Command Help
    • 1.5 Docker Run Volume Command
    • 1.6 Sharing volumes Types
  • 2、示例 1
    • 2.1 建立 Docker
    • 2.2 檢視現在主機上的 Docker Volume
    • 2.3 檢視 Docker busyboxvolume 的 Volumes 挂載位置
      • 2.3.1 第一種方式
      • 2.3.2 第二種方式
    • 2.4 進入到宿主的此目錄
    • 2.5 進入到 Docker busyboxvolume 的 /mydata 目錄
    • 2.6 删除 Docker busyboxvolume
    • 2.7 主控端上此目錄下的檔案還存在,
  • 3、示例 2 --- 新建立 Docker Volume 綁定指定的主控端目錄,并在兩個 Docker 實作 Volume 共享
    • 3.1 主控端上建立相關目錄,并建立相關測試文檔
    • 3.2 建立 Docker mybox1 ,并檢視相關測試檔案
    • 3.2 建立 Docker mybox2 ,使用 Docker mybox1 的 Volume 并檢視相關測試檔案

1、Docker Data Volume

1.1 概念介紹

  • Docker鏡像由多個隻讀層疊加而成,啟動容器時,Docker會加載隻讀鏡像層并在鏡像棧頂部添加一個讀寫層
  • 如果運作中的容器修改了現有的一個已經存在的檔案,那該檔案将會從讀寫層下面的隻讀層複制到讀寫層,該檔案的隻讀版本仍然存在,隻是已經被讀寫層中該檔案的副本所隐藏,此即“寫時複制(COW)”機制
  • 關閉并重新開機容器,其資料不受影響;但删除Docker容器,則其更改将會全部丢失
  • 存在的問題:
    # 存儲于聯合檔案系統中,不易于主控端通路;
    # 容器間資料共享不便
    # 删除容器其資料會丢失
               
  • 解決方案:“卷(volume)”

    “卷”是容器上的一個或多個“目錄”,此類目錄可繞過聯合檔案系統,與主控端上的某目錄“綁定(關聯)”

    Docker Data Volume 詳解及示例1、Docker Data Volume2、示例 13、示例 2 — 建立立 Docker Volume 綁定指定的主要端目錄,并在兩個 Docker 實作 Volume 共享
  • Data volumes provide several useful features for persistent or shared data
    # Volume于容器初始化之時即會建立,由base image提供的卷中的資料會于此期間完成複制
    # Data volumes can be shared and reused among containers
    # Changes to a data volume are made directly
    # Changes to a data volume will not be included when you update an image
    # Data volumes persist even if the container itself is deleted
               
  • Volume的初衷是獨立于容器的生命周期實作資料持久化,是以删除容器之時既不會删除卷,也不會對哪怕未被引用的卷做垃圾回收操作
  • 卷為docker提供了獨立于容器的資料管理機制

1.2 Docker Volume 管理機制

卷為docker提供了獨立于容器的資料管理機制:

  • 可以把“鏡像”想像成靜态檔案,例如“程式”,把卷類比為動态内容,例如“資料”;于是,鏡像可以重用,而卷可以共享
  • 卷實作了“程式(鏡像)”和“資料(卷)”分離,以及“程式(鏡像)”和“制作鏡像的主機”分離,使用者制作鏡像時無須再考慮鏡像運作的容器所在的主機的環境
Docker Data Volume 詳解及示例1、Docker Data Volume2、示例 13、示例 2 — 建立立 Docker Volume 綁定指定的主要端目錄,并在兩個 Docker 實作 Volume 共享

1.3 Docker Volume Types

Docker有兩種類型的卷,每種類型都在容器中存在一個挂載點,但其在主控端上的位置有所不同:

# Bind mount volume
	# a volume that points to a user-specified location on the host file system
# Docker-managed volume
	# the Docker daemon creates managed volumes in a portion of the host’s file system that’s owned byDocker
           
Docker Data Volume 詳解及示例1、Docker Data Volume2、示例 13、示例 2 — 建立立 Docker Volume 綁定指定的主要端目錄,并在兩個 Docker 實作 Volume 共享

1.4 Docker Volume Command Help

[[email protected]-6 ~]# docker container run --help | grep volume
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
           
[[email protected]-6 ~]# docker volume --help
[[email protected]-6 ~]# docker container volume --help
           

1.5 Docker Run Volume Command

# 為 docker run 指令使用 -v 選項即可使用 Volume

	# Docker-managed volume
		# docker  run  -it  -name bbox1–v /data  busybox
		# docker inspect -f {{.Mounts}} bbox1
			# 檢視bbox1容器的卷、卷辨別符及挂載的主機目錄
			
	# Bind-mount Volume
		# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox
		# docker inspect -f {{.Mounts}} bbox2
           

1.6 Sharing volumes Types

There are two ways to share volumes between containers.

# 多個容器的卷使用同一個主機目錄,例如
	# docker run–it --name c1 -v /docker/volumes/v1:/data busybox
	# docker run–it --name c2 -v /docker/volumes/v1:/data busybox

# 複制使用其它容器的卷,為 docker run命 令使用 --volumes-from 選項
	# docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox
	# docker run -it --name bbox2 --volumes-from bbox1 busybox
           

2、示例 1

2.1 建立 Docker

[[email protected]-6 ~]# docker run --name busyboxvolume -it -v /mydata busybox      
/ # ls        						# 根目錄下自動建立相關目錄
bin     dev     etc     home    mydata  proc    root    sys     tmp     usr     var
/ # cd /mydata/
/mydata # ls
total 0
           

2.2 檢視現在主機上的 Docker Volume

[[email protected]-6 ~]# docker volume ls
DRIVER              VOLUME NAME
local               11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872
local               54373374ed1b7312481af30c8338abca41c22c2900c7d643dd5e522e27e984b2
           

2.3 檢視 Docker busyboxvolume 的 Volumes 挂載位置

2.3.1 第一種方式

[[email protected]-6 ~]# docker container inspect busyboxvolume
"Mounts": [
            {
                "Type": "volume",
                "Name": "11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872",
                "Source": "/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data",
                "Destination": "/mydata",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
           

2.3.2 第二種方式

[[email protected]-6 ~]# docker container inspect -f {{.Mounts.Source}} busyboxvolume
           

2.4 進入到宿主的此目錄

[[email protected]-6 ~]# cd /var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[[email protected]-6 _data]# ll
total 0
[[email protected]-6 _data]# pwd
/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[[email protected]-6 _data]# vim test.txt
[[email protected]-6 _data]# cat test.txt 
How are you?
           

2.5 進入到 Docker busyboxvolume 的 /mydata 目錄

[[email protected]-6 ~]# docker run --name busyboxvolume -it -v /mydata busybox
/ # ls
bin     dev     etc     home    mydata  proc    root    sys     tmp     usr     var
/ # cd /mydata/
/mydata # ls
test.txt
/mydata # cat test.txt 
How are you?
           

2.6 删除 Docker busyboxvolume

[email protected]-6 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
7abbd3c486a8        busybox             "sh"                     2 minutes ago       Exited (0) 54 seconds ago                         busyboxvolume
[[email protected]-6 ~]# docker rm busyboxvolume
busyboxvolume
[[email protected]-6 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
           

2.7 主控端上此目錄下的檔案還存在,

不會随着 Docker 的删除還被删除,但是在建立 Docker 時,使用 -rm 選項,會被删除。

[email protected]-6 ~]# cd -
/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[[email protected]-6 _data]# ll
total 4
-rw-r--r-- 1 root root 13 Nov 23 16:09 test.txt
[[email protected]-6 _data]# cat test.txt 
How are you?
           

3、示例 2 — 新建立 Docker Volume 綁定指定的主控端目錄,并在兩個 Docker 實作 Volume 共享

3.1 主控端上建立相關目錄,并建立相關測試文檔

[[email protected]-6 ~]# mkdir /data/volumes/v1 -pv
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/volumes’
mkdir: created directory ‘/data/volumes/v1’
[[email protected]-6 ~]# cd /data/volumes/v1/
[[email protected]-6 v1]# cat test.txt 
Hello!!!
           

3.2 建立 Docker mybox1 ,并檢視相關測試檔案

[[email protected]-6 ~]# docker run --name mybox1 -it -v /data/volumes/v1:/my/data busybox
/ # cd /my/data/
/my/data # ls
test.txt
/my/data # cat test.txt 
Hello!!!
           

3.2 建立 Docker mybox2 ,使用 Docker mybox1 的 Volume 并檢視相關測試檔案

[[email protected]-6 ~]# docker run --name mybox2 -it --volumes-from mybox1 busybox
/ # ls
bin   dev   etc   home  my    proc  root  sys   tmp   usr   var
/ # cd /my/data/
/my/data # ls
test.txt
/my/data # cat test.txt 
Hello!!!
           
[[email protected]-6 ~]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
169a543f5345        busybox             "sh"                About an hour ago   Up About an hour                        mybox2
f250ffc6d357        busybox             "sh"                About an hour ago   Up About an hour                        mybox1
           

繼續閱讀