1. 程式人生 > >Docker資料管理 Named volume

Docker資料管理 Named volume

Docker資料管理:Named volume

Docker中可以使用Named volume和data container來進行資料的管理。

單一Container的使用Helloworld

Step 1:建立一個Named Volume

事前確認volume的資訊,沒有VOLUME存在

[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
[root@host88 volumes]#
  • 1
  • 2
  • 3

確認/var/lib/docker/volumes的狀況

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# ll
total 0
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5

建立一個名為volname的資料卷,通過-v引數可以進行建立,同時也可以通過docker volume create來建立。

[root@host88 volumes]# docker run -it -v volname:/volumedata/dbdata debian
root@b2e3523a6dd9
:/# cd volumedata/dbdata root@b2e3523a6dd9:/volumedata/dbdata# ls -l total 0 root@b2e3523a6dd9:/volumedata/dbdata#
  • 1
  • 2
  • 3
  • 4
  • 5

在Container外部確認此事volname是否已經建立成功

[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4

確認/var/lib/docker/volumes下面 的情況

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# ll
total 0
drwxr-xr-x 3 root root 18 Jul 25 06:23 volname
[root@host88 volumes]# find . -type f
[root@host88 volumes]# find . -type d
.
./volname
./volname/_data
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

除了目錄結構沒有任何檔案存在

Step 2:在Container中儲存資料Hello world

root@b2e3523a6dd9:/volumedata/dbdata# ls -l
total 0
root@b2e3523a6dd9:/volumedata/dbdata# echo "hello, world" >>helloworld
root@b2e3523a6dd9:/volumedata/dbdata# cat helloworld
hello, world
root@b2e3523a6dd9:/volumedata/dbdata# ls -l
total 4
-rw-r--r-- 1 root root 13 Jul 25 06:26 helloworld
root@b2e3523a6dd9:/volumedata/dbdata#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在外部確認該資訊是否已經存在

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# find . -type f
./volname/_data/helloworld
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Step 3:在外部直接修改該檔案

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# find . -type f
./volname/_data/helloworld
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world
[root@host88 volumes]# echo "hell, this is `hostname`" >>./volname/_data/helloworld
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world
hell, this is host88
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在內部確認資訊

root@b2e3523a6dd9:/volumedata/dbdata# ls -l
total 4
-rw-r--r-- 1 root root 34 Jul 25 06:29 helloworld
root@b2e3523a6dd9:/volumedata/dbdata# cat helloworld
hello, world
hell, this is host88
root@b2e3523a6dd9:/volumedata/dbdata#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

從Container中退出前再追加一條資訊

root@b2e3523a6dd9:/volumedata/dbdata# echo "hello, I will exit from `hostname`" >>helloworld
root@b2e3523a6dd9:/volumedata/dbdata# cat helloworld
hello, world
hell, this is host88
hello, I will exit from b2e3523a6dd9
root@b2e3523a6dd9:/volumedata/dbdata#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Step 4:退出Container後看資料是否仍然存在

root@b2e3523a6dd9:/volumedata/dbdata# exit
exit
[root@host88 volumes]# find . -type f
./volname/_data/helloworld
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world
hell, this is host88
hello, I will exit from b2e3523a6dd9
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

資料仍然存在。使用docker volume ls可以看到剛剛volname的資料卷也依然存在。

[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4

資料卷的管理

docker的volume的管理目前主要有下面4種:create/ls/inspect/rm

查詢(ls)

[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4

正常的環境一定不會跑出這麼清靜的結果。

inspect

[root@host88 volumes]# docker volume inspect volname
[
    {
        "Name": "volname",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/volname/_data"
    }
]
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

其實這個資訊可能會覺得非常眼熟,看完docker insepect 的結果就會發現,內容是一致的,以下是docker inspect b2e3523a6dd9的mounts相關資訊

        "Mounts": [
            {
                "Name": "volname",
                "Source": "/var/lib/docker/volumes/volname/_data",
                "Destination": "/volumedata/dbdata",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": "rslave"
            }
        ],
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

刪除(rm)

刪除之前的確認

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# find . -type f
./volname/_data/helloworld
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world
hell, this is host88
hello, I will exit from b2e3523a6dd9
[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

刪除volume之前需要刪除與其有依賴關係的container

[root@host88 volumes]# docker rm b2e3523a6dd9
b2e3523a6dd9
[root@host88 volumes]#
  • 1
  • 2
  • 3

刪除container並不會將volume一併刪除

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# find . -type f
./volname/_data/helloworld
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5

而使用docker volume rm則會乾淨地刪除掉所有資訊

[root@host88 volumes]# docker volume rm volname
volname
[root@host88 volumes]# ll
total 0
[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

長時間執行的Docker環境中,成為殭屍的不只是/var/lib/docker/volumes下面的實際資料
而且docker volume ls中也會有很多完全不知道的資訊,甚至有些相關聯的實際資料已經被刪除
這種情況在很多考慮不足的環境中屢見不鮮,雖然只是很簡單的helloworld
資料管理時候需要考慮的問題還是值得引起足夠的重視。

建立(create):

可以像例子那樣通過run 和-v建立volume,同時也可以使用docker volume create來建立

[root@host88 volumes]# docker volume create --driver=local --name=volname
volname
[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

有些volume在建立時還要結合使用–opt引數(或者-o)
如果不指定–name引數,docker會體貼地替你取一個,大概就像下面這樣

[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
[root@host88 volumes]# docker volume create
e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d
[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
local               e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

看著太鬧心了,一下全部刪掉吧。

[root@host88 volumes]# docker volume rm $(docker volume ls -q)
volname
e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4

需要注意的是這個名字必須是唯一的,所以前面也說到過不使用docker volume rm來刪除的話會導致問題,
下次用同樣名字想要建立一個volume卻發現已經存在的時候就只能是建立失敗了。

多Container共用一個數據卷

Step 1:建立一個Named Volume

用你喜歡的方式建立一個named volume

[root@host88 volumes]# docker volume create --name=volname
volname
[root@host88 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               volname
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Step 2:路人甲Container與之相連

[root@host88 volumes]# docker run -it -v volname:/volumedata/dbdata debian
root@5a43b6347b53:/#
  • 1
  • 2

路人甲使用Debian,他想知道誰是docker的主機

root@5a43b6347b53:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volumedata
root@5a43b6347b53:/# cd volumedata/dbdata
root@5a43b6347b53:/volumedata/dbdata# ls -l
total 0
root@5a43b6347b53:/volumedata/dbdata# echo "hello, world by `hostname`, who is host?" >> helloworld
root@5a43b6347b53:/volumedata/dbdata# cat helloworld
hello, world by 5a43b6347b53, who is host?
root@5a43b6347b53:/volumedata/dbdata#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Step 3:主機與路人乙

主機此時看到了這個資訊

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# find . -type f
./volname/_data/helloworld
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world by 5a43b6347b53, who is host?
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

同時路人乙也與該volume進行了連線

[root@host88 ~]# docker run -it -v volname:/volumedata/dbdata centos
[root@6365668cea55 /]#
  • 1
  • 2

BTW,Docker現在不能使用相對路徑,所以volname:/volumedata/dbdata的這個寫法最前面的/仍然是不可或缺.
路人乙說雖然你不是找我,但是我看見了,這是共享的,我就可以回信麼,說我不知道。

[root@6365668cea55 dbdata]# ls -l
total 4
-rw-r--r-- 1 root root 43 Jul 25 09:36 helloworld
[root@6365668cea55 dbdata]# cat helloworld
hello, world by 5a43b6347b53, who is host?
[root@6365668cea55 dbdata]# echo "hello, world by `hostname`, I do not know" >> helloworld
[root@6365668cea55 dbdata]# cat helloworld
hello, world by 5a43b6347b53, who is host?
hello, world by 6365668cea55, I do not know
[root@6365668cea55 dbdata]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Step 4:主機與路人丙

主機什麼時候都能看見資訊的更新,作為應該回郵件的人,完全有權利裝作看不見

[root@host88 volumes]# pwd
/var/lib/docker/volumes
[root@host88 volumes]# ll
total 0
drwxr-xr-x 3 root root 18 Jul 25 05:31 volname
[root@host88 volumes]# find . -type f
./volname/_data/helloworld
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world by 5a43b6347b53, who is host?
hello, world by 6365668cea55, I do not know
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

路人丙使用ubuntu,他覺得這樣資料設計地實在不好,他表示他根本不想看到這樣的資訊,大家不要再reply to all

[root@host88 ~]# docker run -it -v volname:/volumedata/dbdata ubuntu
root@730209b03ea6:/# cd volumedata/dbdata
root@730209b03ea6:/volumedata/dbdata# ls -l
total 4
-rw-r--r-- 1 root root 87 Jul 25 09:44 helloworld
root@730209b03ea6:/volumedata/dbdata# cat helloworld
hello, world by 5a43b6347b53, who is host?
hello, world by 6365668cea55, I do not know
root@730209b03ea6:/volumedata/dbdata#  echo "hello, world by `hostname`, please do not reply to all" >> helloworld
root@730209b03ea6:/volumedata/dbdata# cat helloworld
hello, world by 5a43b6347b53, who is host?
hello, world by 6365668cea55, I do not know
hello, world by 730209b03ea6, please do not reply to all
root@730209b03ea6:/volumedata/dbdata#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Step 5:大家都看到了資訊,決定都不再說話

作為和現實世界相反的期待,大家覺得這實在太無聊了,於是沒有人再不斷跳出來Reply all說請把我從mail link中剔除

[[email protected]6365668cea55 dbdata]# cat helloworld
hello, world by 5a43b6347b53, who is host?
hello, world by 6365668cea55, I do not know
hello, world by 730209b03ea6, please do not reply to all
[[email protected]6365668cea55 dbdata]#
  • 1
  • 2
  • 3
  • 4
  • 5
root@5a43b6347b53:/volumedata/dbdata# cat helloworld
hello, world by 5a43b6347b53, who is host?
hello, world by 6365668cea55, I do not know
hello, world by 730209b03ea6, please do not reply to all
root@5a43b6347b53:/volumedata/dbdata#
  • 1
  • 2
  • 3
  • 4
  • 5
[root@host88 volumes]# cat ./volname/_data/helloworld
hello, world by 5a43b6347b53, who is host?
hello, world by 6365668cea55, I do not know
hello, world by 730209b03ea6, please do not reply to all
[root@host88 volumes]#
  • 1
  • 2
  • 3
  • 4
  • 5

實際多Container使用同一個Volume完全可以做的更好,把讀寫的許可權進行合理設定,能夠滿足很多實際的場景。

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed