天天看點

Docker(8)---匿名卷(匿名挂載)和命名卷(具名挂載)

Docker(8)---匿名卷(匿名挂載)和命名卷(具名挂載)

上一篇:Docker(7)—自定義鏡像并設定鏡像挂載

1.什麼是匿名挂載和具名挂載?

  所謂匿名挂載(匿名卷),即在進行資料卷挂載的時候不指定主控端的資料卷目錄,

-v

指令之後直接跟上

容器内資料卷所在的路徑

  而具名挂載(命名卷)即在進行資料卷挂載的時候既指定

主控端資料卷所在路徑

,又指定

容器資料卷所在路徑

  先通過下面這種指令的方式感受一下兩者的差別:

#匿名挂載(匿名卷)
docker run -d -p 6379:6379 --name mycentos -v /src/volume01

#具名挂載(命名卷) -v 主控端資料卷所在路徑:容器資料卷所在路徑
docker run -d -p 6379:6379 --name mycentos -v /home/docker_volume:/src/volume01
           

  除此種方式之外,我們也可以在在dockerfile建構docker鏡像的時候使用

VOLUME

保留字來對資料卷進行挂載,此種挂載方式是匿名挂載的,我們可以指定一個或多個資料卷,這樣隻要啟動了該自定義容器鏡像,則會自動進行資料挂載,不會出現

忘記挂載導緻資料不安全

的情況。

VOLUME ["容器内資料卷路徑1","容器内資料卷路徑2"……]
           

由于匿名挂載的時候隻是指定了

容器内資料卷的路徑

,至于該

容器内資料卷的路徑

到底和

主控端

中的哪個檔案進行資料挂載,可以使用下面指令進行檢視:

#檢視目前正在運作的鏡像容器id
[root@privateCloud / ]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
38d2810685e1        fc67f9b77899        "/bin/sh -c /bin/bash"   2 hours ago         Up 2 hours          80/tcp              focused_williams

#使用 inspect 檢視鏡像資訊
[root@privateCloud / ]# docker inspect 38d2810685e1(這是容器id)
#在彈出來的資訊中找到下面的資料:
"Mounts": [
            {
                "Type": "volume",
                "Name": "040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8",
                "Source": "/var/lib/docker/volumes/040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c",
                "Source": "/var/lib/docker/volumes/b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
       
           

   從上面的 Mounts 中可以看到 Destination 和 Source 分别就是 容器内的資料卷 和 主控端内的容器卷

2.匿名卷和命名卷的差別?

  命名卷在用過一次之後以後挂載容器的時候還是可以繼續使用,是以一般在需要儲存資料的時候使用

命名卷

的方式,下面例子用以展示

命名卷

對于資料的儲存方式:

#1.檢視目前的鏡像
[root@privateCloud / ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB

#2.啟動centos鏡像并且使用命名挂載的方式進行資料卷挂載(此centos是官網下載下傳的官方鏡像包)
[root@privateCloud / ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
48dece440eb377a466d72327895c5ed24a75823e70ffebf40fee0e2fe9e4c66e

#3.檢視剛剛啟動的容器id
[root@privateCloud / ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
48dece440eb3        470671670cac        "/bin/bash"         4 minutes ago       Up 4 minutes                            mycentos

#4.進入容器内部
[root@privateCloud / ]# docker exec -it 48dece440eb3 /bin/bash

#5.檢視/usr/local/,發現多了一個 volume01檔案夾
[root@48dece440eb3 /]# cd /usr/local/
[root@48dece440eb3 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  volume01

#6.建立一個txt檔案
[root@48dece440eb3 local]# cd volume01/
[root@48dece440eb3 volume01]# touch file01.txt
[root@48dece440eb3 volume01]# vi file01
#随便輸入一段話
this file create in container

[root@48dece440eb3 volume01]# ls
file01.txt

#7.使用 ctrl+p+Q 不停止容器退出
#8.進行主控端 容器卷 所在路徑
[root@privateCloud /home/centos_volume ]# cd /home/centos_volume/

#9.發現多了一個 file01檔案,說明資料挂載成功
[root@privateCloud /home/centos_volume ]# ll
total 0
-rw-r--r-- 1 root root 0 Jun  1 17:17 file01.txt

#10.此時将啟動的容器停掉:
[root@privateCloud /home/centos_volume ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
48dece440eb3        470671670cac        "/bin/bash"         8 minutes ago       Up 8 minutes                            mycentos
[root@privateCloud /home/centos_volume ]# docker stop 48dece440eb3
48dece440eb3

#11.然後重新進入該容器
[root@privateCloud /usr/local ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac

#12.直接到 /usr/local/volume01路徑
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a842a7e8d514        470671670cac        "/bin/bash"         2 minutes ago       Up 2 minutes                            mycentos
[root@privateCloud /usr/local ]# docker exec -it a842a7e8d514 /bin/bash
[root@a842a7e8d514 /]# cd /usr/local/volume01/
[root@a842a7e8d514 volume01]# ls
file01.txt
#13.檢視該file01.txt檔案
[root@a842a7e8d514 volume01]# cat file01.txt 
this file create in container



           
#1.檢視鏡像
[root@privateCloud /usr/local ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB

#2.使用匿名挂載的方式隻指定容器内資料卷所在路徑啟動鏡像
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /usr/local/centos 470671670cac
175034d3759bb678877fcaaba6db2b9cd50aa9e61a7cb5770a48370032f07d1f

#3.進入 容器内資料卷所在路徑
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
175034d3759b        470671670cac        "/bin/bash"         About a minute ago   Up About a minute                       mycentos
[root@privateCloud /usr/local ]# docker exec -it 175034d3759b /bin/bash
[root@175034d3759b /]# cd /usr/local/centos/

#4.編輯一個檔案
[root@175034d3759b centos]# vi file02
[root@175034d3759b centos]# cat file02 
this file create in container222222222

#5.使用ctrl+p+Q指令不停止并退出容器
#6.檢視目前容器資料卷挂載在主控端的檔案路徑
[root@privateCloud /home ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
175034d3759b        470671670cac        "/bin/bash"         7 minutes ago       Up 7 minutes                            mycentos
[root@privateCloud /home ]# docker inspect 175034d3759b

#7.從顯示的資訊中找到Mounts
 "Mounts": [
            {
                "Type": "volume",
                "Name": "226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e",
                "Source": "/var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data",
                "Destination": "/usr/local/centos",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

#8.進入主控端挂載的路徑目錄中
[root@privateCloud /home ]# cd /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# ll
total 4
-rw-r--r-- 1 root root 39 Jun  1 17:45 file02

#9.發現該目錄下也生成了file02檔案
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# cat file02 
this file create in container222222222

#10.關閉目前容器并重新使用匿名方式啟動
[root@privateCloud / ]# docker run -it -d -v /usr/local/centos 470671670cac 
19a23edc6aebd23109437cac91e0011737d3e0cb29d0fad99ea884193409ec9e

#11.進入容器
[root@privateCloud / ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
19a23edc6aeb        470671670cac        "/bin/bash"         32 seconds ago      Up 32 seconds                           laughing_wiles
[root@privateCloud / ]# docker exec -it 19a23edc6aeb /bin/bash
[root@19a23edc6aeb /]# cd /usr/local/centos/

#12.發現重新啟動之後,該資料卷之下的資料沒有了,但是命名卷在重新開機之後資料就還在
[root@19a23edc6aeb centos]# ls
[root@19a23edc6aeb centos]# 

           

繼續閱讀