一佩伤、Convoy簡介
Convoy是一種支持多種存儲類型的Docker存儲卷宗插件,由Go語言編寫掘托,支持快照瘦锹、備份和恢復(fù)。支持的后端存儲設(shè)備有多種闪盔,devicemapper弯院、NFS、DigitalOcean和EBS等泪掀。
二听绳、實驗規(guī)劃
在本實驗中,我們選擇兩臺CentOS7.x异赫,一臺已經(jīng)安裝好Docker椅挣,另一臺安裝NFS網(wǎng)絡(luò)文件共享服務(wù)。安裝Docker的一臺服務(wù)器作為NFS的客戶端塔拳,另一臺作為NFS服務(wù)器鼠证。
1、實驗環(huán)境
host1(已安裝Docker):
IP:192.168.10.11 關(guān)閉防火墻
系統(tǒng)版本:CentOS Linux release 7.6.1810 (Core)
Docker版本:Docker version 18.09.2, build 6247962
host2(作為NFS服務(wù)器):
IP:192.168.10.15 關(guān)閉防火墻
系統(tǒng)版本:CentOS Linux release 7.6.1810 (Core)
2靠抑、實驗準(zhǔn)備
兩臺主機網(wǎng)絡(luò)暢通量九,需要為host1安裝Docker,具體安裝方法不再贅述颂碧,另外需要掌握docker和docker-compose相關(guān)知識荠列。
三、NFS網(wǎng)絡(luò)文件共享系統(tǒng)
注意:
以下操作如沒有特別說明载城,均是在host2上進行操作肌似。
1、安裝
CentOS/RHEL 6系列中:
# yum install -y rpcbind
# yum install -y nfs-utils
CentOS/RHEL 7系列中:
# yum install -y nfs-utils
因為在CentOS7中已經(jīng)默認(rèn)安裝了rpcbind诉瓦。
2川队、創(chuàng)建共享目錄
# mkdir /data
3、配置共享
# vim /etc/exports
/data/ 192.168.10.0/24(rw,no_root_squash,sync)
4睬澡、NFS權(quán)限說明
(1)普通用戶
當(dāng)設(shè)置all_squash時:
訪客一律被映射為匿名用戶(nfsnobody)呼寸。
當(dāng)設(shè)置no_all_squash時:
訪客被映射為服務(wù)器上相同uid的用戶,因此在客戶端應(yīng)建立與服務(wù)端uid一致的用戶猴贰,否則也映射為nfsnobody对雪。root除外,因為root_suqash為默認(rèn)選項米绕,除非指定了no_root_squash瑟捣。
(2)root用戶
當(dāng)設(shè)置root_squash時:
訪客以root用戶訪問NFS服務(wù)端時,被映射為nfsnobody用戶栅干。
當(dāng)設(shè)置no_root_squash時:
訪客以root用戶訪問NFS服務(wù)端時迈套,被映射為root用戶。以其他用戶訪問時同樣映射為對應(yīng)uid的用戶碱鳞,因為no_all_squash是默認(rèn)選項桑李。
NFS權(quán)限選項說明:
ro:共享目錄只讀
rw:共享目錄可讀可寫
all_squash:所有訪問用戶都映射為匿名用戶或用戶組
no_all_squash(默認(rèn)):訪問用戶先與本機用戶匹配,匹配失敗后再映射為匿名用戶或用戶組
root_squash(默認(rèn)):將來訪的root用戶映射為匿名用戶或用戶組
no_root_squash:來訪的root用戶保持root帳號權(quán)限
anonuid=<UID>:指定匿名訪問用戶的本地用戶UID,默認(rèn)為nfsnobody(65534)
anongid=<GID>:指定匿名訪問用戶的本地用戶組GID贵白,默認(rèn)為nfsnobody(65534)secure(默認(rèn)):限制客戶端只能從小于1024的tcp/ip端口連接服務(wù)器
insecure:允許客戶端從大于1024的tcp/ip端口連接服務(wù)器
sync:將數(shù)據(jù)同步寫入內(nèi)存緩沖區(qū)與磁盤中率拒,效率低,但可以保證數(shù)據(jù)的一致性
async:將數(shù)據(jù)先保存在內(nèi)存緩沖區(qū)中禁荒,必要時才寫入磁盤
wdelay(默認(rèn)):檢查是否有相關(guān)的寫操作猬膨,如果有則將這些寫操作一起執(zhí)行,這樣可以提高效率
no_wdelay:若有寫操作則立即執(zhí)行呛伴,應(yīng)與sync配合使用
subtree_check(默認(rèn)) :若輸出目錄是一個子目錄勃痴,則nfs服務(wù)器將檢查其父目錄的權(quán)限
no_subtree_check :即使輸出目錄是一個子目錄,nfs服務(wù)器也不檢查其父目錄的權(quán)限热康,這樣可以提高效率
5沛申、啟動服務(wù)
(1)啟動rpcbind服務(wù)
CentOS/RHEL 6:
# service rpcbind start
CentOS/RHEL 7:
# systemctl start rpcbind
(2)啟動nfs服務(wù)
CentOS/RHEL 6:
# service nfs start
CentOS/RHEL 7:
# systemctl start nfs
(3)查看RPC服務(wù)的注冊狀況
# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 44241 status
100024 1 tcp 59150 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 35427 nlockmgr
100021 3 udp 35427 nlockmgr
100021 4 udp 35427 nlockmgr
100021 1 tcp 36870 nlockmgr
100021 3 tcp 36870 nlockmgr
100021 4 tcp 36870 nlockmgr
(4)列出已設(shè)置的共享
先在nfs服務(wù)端本機查看共享目錄。
# showmount -e localhost
Export list for localhost:
/data 192.168.10.0/24
注意:
以下操作如沒有特殊說明姐军,均是在host1操作铁材。
6、客戶端掛載使用
(1)測試能否列出共享目錄
跟服務(wù)端測試相同庶弃,使用showmount 加服務(wù)器IP查看共享情況衫贬。
# showmount -e 192.168.10.15
Export list for 192.168.10.15:
/data 192.168.10.0/24
(2)創(chuàng)建客戶端掛載點
# mkdir /nfs
(3)掛載
# mount -t nfs 192.168.10.15:/data/ /nfs
(4)查看掛載情況
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 56G 52G 3.8G 94% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 35M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda5 1014M 234M 781M 24% /boot
/dev/sda1 98M 36M 63M 36% /boot/efi
tmpfs 790M 40K 790M 1% /run/user/1000
tmpfs 790M 0 790M 0% /run/user/0
192.168.10.15:/data 13G 1.7G 11G 14% /nfs
四、Docker容器卷宗插件Convoy
項目地址:https://github.com/rancher/convoy
注意:
以下操作如沒有特殊說明歇攻,均是在host1上面操作固惯。
1、下載安裝
獲取安裝包:
# wget https://github.com/rancher/convoy/releases/download/v0.5.2/convoy.tar.gz
解壓:
# tar -xvf convoy.tar.gz
convoy/
convoy/convoy-pdata_tools
convoy/SHA1SUMS
convoy/convoy
進入解壓目錄查看內(nèi)容
# cd convoy/
# ls -l
total 39728
-rwxr-xr-x 1 root root 17607008 Dec 8 10:32 convoy
-rwxr-xr-x 1 root root 23068627 Dec 8 10:32 convoy-pdata_tools
-rw-r--r-- 1 root root 124 Dec 8 10:32 SHA1SUMS
解壓后目錄內(nèi)有兩個可執(zhí)行文件和一個SHA1校驗信息文件缴守,可以查看一下里面內(nèi)容葬毫,然后和官方給出的校驗信息作對比,防止文件被篡改屡穗。
# cat SHA1SUMS
569b079b2dd867f659b86ac8beda2ad6d348d4aa *convoy/convoy-pdata_tools
6bf6eb6b3b4f042ed2088367e9eea956e9154b9f *convoy/convoy
此處不作文件完整性校驗贴捡,直接安裝。安裝方式也很簡單村砂,只需將可執(zhí)行文件添加到PATH路徑即可:
# cp convoy convoy-pdata_tools /usr/local/bin/
注意:
此處使用相對路徑烂斋,因解壓后已經(jīng)進入解壓目錄。所以cp命令操作的對象直接是可執(zhí)行文件础废,不附帶目錄層次汛骂。
2、設(shè)置Docker的卷插件
以下操作的前提是您已經(jīng)安裝Docker评腺,否則操作無效帘瞭。
(1)創(chuàng)建插件配置文件目錄
# mkdir /etc/docker/plugins/
(2)創(chuàng)建Convoy插件配置文件
# bash -c 'echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec'
3、Convoy守護進程的停止與啟動
(1)啟動Convoy守護進程
# convoy daemon --drivers vfs --driver-opts vfs.path=/nfs &
[1] 20318
[root@ops ~]# DEBU[0000] Found existing config. Ignoring command line opts, loading config from /var/lib/rancher/convoy pkg=daemon
DEBU[0000] driver=vfs driver_opts=map[vfs.path:/nfs] event=init pkg=daemon reason=prepare root=/var/lib/rancher/convoy
DEBU[0000] driver=vfs event=init pkg=daemon reason=complete
DEBU[0000] Registering GET, /info pkg=daemon
DEBU[0000] Registering GET, /volumes/list pkg=daemon
DEBU[0000] Registering GET, /volumes/ pkg=daemon
DEBU[0000] Registering GET, /snapshots/ pkg=daemon
DEBU[0000] Registering GET, /backups/list pkg=daemon
DEBU[0000] Registering GET, /backups/inspect pkg=daemon
DEBU[0000] Registering POST, /volumes/mount pkg=daemon
DEBU[0000] Registering POST, /volumes/umount pkg=daemon
DEBU[0000] Registering POST, /snapshots/create pkg=daemon
DEBU[0000] Registering POST, /backups/create pkg=daemon
DEBU[0000] Registering POST, /volumes/create pkg=daemon
DEBU[0000] Registering DELETE, /backups pkg=daemon
DEBU[0000] Registering DELETE, /volumes/ pkg=daemon
DEBU[0000] Registering DELETE, /snapshots/ pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Remove pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Mount pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Path pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Get pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Capabilities pkg=daemon
DEBU[0000] Registering plugin handler POST, /Plugin.Activate pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Create pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Unmount pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.List pkg=daemon
WARN[0000] Remove previous sockfile at /var/run/convoy/convoy.sock pkg=daemon
執(zhí)行啟動命令后屏幕輸出以上內(nèi)容蒿讥,終端出現(xiàn)“假死”情況蝶念,直接回車即可繼續(xù)使用該終端抛腕。
注意:
daemon參數(shù)表示convoy啟動守護進程
--drivers后面接的是后端存儲設(shè)備類型,Device Mapper對應(yīng)的參數(shù)是devicemapper媒殉,NFS對應(yīng)的參數(shù)是vfs,其他類型請自行點擊項目地址担敌,在項目頁面下方查看。
(2)Convoy守護進程的停止
因為convoy沒有提供停止守護進程的功能 适袜,所以只能使用kill命令將其進程殺死柄错。
獲取進程PID:
# ps -ef|grep convoy
root 15461 1 0 Feb26 ? 00:00:00 convoy daemon --drivers vfs --driver-opts vfs.path=/nfs
root 21438 534 0 15:37 pts/1 00:00:00 grep --color=auto convoy
殺死進程:
# kill -9 15461
結(jié)合awk工具殺死進程:
# kill -9 $(ps -ef|grep convoy|awk -F" " 'NR==1{print $2}')
4舷夺、Convoy的使用
(1)卷的創(chuàng)建苦酱、查看與刪除
創(chuàng)建卷:
convoy create <volume_name>
例如,創(chuàng)建一個名為docker_test的卷给猾,使用如下命令:
# convoy create docker_test
docker_test
注意:
守護進程啟動后vfs.path對應(yīng)的目錄會自動生成一個config目錄疫萤,請勿將之刪除。
如果不小心將vfs.path對應(yīng)目錄內(nèi)的config目錄刪除或系統(tǒng)沒有自動生成config目錄敢伸,創(chuàng)建卷宗時會出現(xiàn)以下錯誤:
# convoy create test
DEBU[0038] Calling: POST, /volumes/create, request: POST, /v1/volumes/create pkg=daemon
DEBU[0038] event=create object=volume opts=map[VolumeIOPS:0 PrepareForVM:false Size:0 BackupURL: VolumeName:test VolumeType: EndpointURL: VolumeDriverID:] pkg=daemon reason=prepare volume=test
ERRO[0038] Handler for POST /volumes/create returned error: Couldn't get flock. Error: open /nfs/config/vfs_volume_test.json.lock: no such file or directory pkg=daemon
ERRO[0000] Error response from server, Couldn't get flock. Error: open /nfs/config/vfs_volume_test.json.lock: no such file or directory
{
"Error": "Error response from server, Couldn't get flock. Error: open /nfs/config/vfs_volume_test.json.lock: no such file or directory\n"
}
出現(xiàn)這種錯誤時需要手動在vfs.path對應(yīng)的目錄內(nèi)創(chuàng)建config目錄扯饶,創(chuàng)建完成后再執(zhí)行創(chuàng)建卷的命令就不會報錯。
查看系統(tǒng)中所有卷:
convoy list
例如池颈,列出系統(tǒng)中所有的卷尾序,將以json格式顯示,如下:
# convoy list
{
"docker_test": {
"Name": "docker_test",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Wed Feb 27 10:37:56 +0800 2019",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/nfs/docker_test",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Wed Feb 27 10:37:56 +0800 2019",
"VolumeName": "docker_test"
},
"Snapshots": {}
},
"test": {
"Name": "test",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Wed Feb 27 10:37:11 +0800 2019",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/nfs/test",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Wed Feb 27 10:37:11 +0800 2019",
"VolumeName": "test"
},
"Snapshots": {}
}
}
查看某個特定卷的信息:
convoy inspect <volume_name>
例如躯砰,查看剛剛創(chuàng)建的名為docker_test的卷的信息每币,使用如下命令:
# docker inspect docker_test
[
{
"CreatedAt": "0001-01-01T00:00:00Z",
"Driver": "convoy",
"Labels": null,
"Mountpoint": "",
"Name": "docker_test",
"Options": null,
"Scope": "local"
}
]
刪除卷:
convoy delete <volume_name>
例如,刪除系統(tǒng)中的test卷琢歇,使用如下命令:
# convoy delete test
刪除卷后再進行查看:
# convoy list
{
"docker_test": {
"Name": "docker_test",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Wed Feb 27 10:37:56 +0800 2019",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/nfs/docker_test",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Wed Feb 27 10:37:56 +0800 2019",
"VolumeName": "docker_test"
},
"Snapshots": {}
}
}
看到如上信息兰怠,說明已經(jīng)成功的刪除了test卷。
(2)快照的創(chuàng)建李茫、查看與刪除
創(chuàng)建快照:
convoy snapshot create <volume_name> --name <snapshot_name>
例如揭保,對docker_test卷做一個名為docker_test-01的快照,使用如下命令:
# convoy snapshot create docker_test --name docker_test-01
docker_test-01
查看快照:
convoy snapshot inspect <snapshot_name>
例如魄宏,查看快照docker_test-01的詳情秸侣,使用如下命令:
# convoy snapshot inspect docker_test-01
{
"Name": "docker_test-01",
"VolumeName": "docker_test",
"VolumeCreatedAt": "Wed Feb 27 10:37:56 +0800 2019",
"CreatedTime": "Wed Feb 27 11:54:53 +0800 2019",
"DriverInfo": {
"Driver": "vfs",
"FilePath": "/var/lib/rancher/convoy/vfs/snapshots/docker_test_docker_test-01.tar.gz",
"SnapshotCreatedAt": "Wed Feb 27 11:54:53 +0800 2019",
"SnapshotName": "docker_test-01",
"VolumeUUID": "docker_test"
}
}
刪除快照:
convoy snapshot delete <snapshot_name>
例如,刪除docker_test-01這個快照宠互,使用如下命令:
# convoy snapshot delete docker_test-01
(3)快照的備份味榛、備份查看、備份恢復(fù)與備份刪除
創(chuàng)建快照備份:
convoy backup create <snapshot_name> --dest vfs:///<path>
例如名秀,對快照docker_test-01做備份励负,命令如下:
# convoy backup create docker_test-01 --dest vfs:///backup
vfs:///backup?backup=backup-c0fd6c56ac6c4b03\u0026volume=docker_test
查看快照備份:
convoy backup list <dest_url>
例如,查看上一步創(chuàng)建的快照備份信息匕得,使用如下命令:
# convoy backup list vfs:///backup
{
"vfs:///backup?backup=backup-2bd89ea77a144dbc\u0026volume=docker_test": {
"BackupName": "backup-2bd89ea77a144dbc",
"BackupURL": "vfs:///backup?backup=backup-2bd89ea77a144dbc\u0026volume=docker_test",
"CreatedTime": "Wed Feb 27 15:59:07 +0800 2019",
"DriverName": "vfs",
"SnapshotCreatedAt": "Wed Feb 27 15:58:44 +0800 2019",
"SnapshotName": "docker_test-02",
"VolumeCreatedAt": "Wed Feb 27 10:37:56 +0800 2019",
"VolumeName": "docker_test",
"VolumeSize": "0"
},
"vfs:///backup?backup=backup-c0fd6c56ac6c4b03\u0026volume=docker_test": {
"BackupName": "backup-c0fd6c56ac6c4b03",
"BackupURL": "vfs:///backup?backup=backup-c0fd6c56ac6c4b03\u0026volume=docker_test",
"CreatedTime": "Wed Feb 27 13:40:24 +0800 2019",
"DriverName": "vfs",
"SnapshotCreatedAt": "Wed Feb 27 11:54:53 +0800 2019",
"SnapshotName": "docker_test-01",
"VolumeCreatedAt": "Wed Feb 27 10:37:56 +0800 2019",
"VolumeName": "docker_test",
"VolumeSize": "0"
}
}
通過以上命令可以查看到继榆,當(dāng)前vfs:///backup這個dest_url下有兩個快照備份體巾表,詳細(xì)情況都顯示在終端中。
查看某個具體的快照備份詳情:
convoy backup inspect <backup_url>
溫馨提示:
此處的<backup_url>是指具體的備份體的url略吨,在備份創(chuàng)建成功后會顯示在終端集币,也可以通過上一步的命令查看,json字典中的“vfs:///backup?backup=backup-xxx*”就是此處所說的<backup_url>翠忠,您可以根據(jù)json中給出的詳情結(jié)合備份體創(chuàng)建的時間確定哪一個是您需要操作的<backup_url>鞠苟。
例如,查看上一步對快照docker_test-01做的備份秽之,可以使用如下命令:
# convoy backup inspect vfs:///backup?backup=backup-c0fd6c56ac6c4b03\u0026volume=docker_test
#注意:以上內(nèi)容為一行命令
{
"BackupName": "backup-c0fd6c56ac6c4b03",
"BackupURL": "vfs:///backup?backup=backup-c0fd6c56ac6c4b03\u0026volume=docker_test",
"CreatedTime": "Wed Feb 27 13:40:24 +0800 2019",
"DriverName": "vfs",
"SnapshotCreatedAt": "Wed Feb 27 11:54:53 +0800 2019",
"SnapshotName": "docker_test-01",
"VolumeCreatedAt": "Wed Feb 27 10:37:56 +0800 2019",
"VolumeName": "docker_test",
"VolumeSize": "0"
}
注意:
以上兩種方法都可以查看快照備份的詳情当娱,區(qū)別是list后接的dest_url參數(shù)是創(chuàng)建備份時指定的url,創(chuàng)建備份的時候會在系統(tǒng)上創(chuàng)建一個對應(yīng)的目錄考榨,此處是“/backup”,且使用list加dest_url參數(shù)查看到的結(jié)果時“vfs:///backup”這個url下面的所有備份體的詳細(xì)信息跨细;而使用inspect加backup_url參數(shù)查詢到的是系統(tǒng)中某個具體的備份體的詳細(xì)情況,而不是所有備份體都列出來河质,且使用inspect命令時接vfs:///backup參數(shù)會出現(xiàn)報錯冀惭。此處有點繞,dest_url和backup_url的關(guān)系可以理解為:dest_url(vfs:///backup)是一個大集合掀鹅,而backup_url(vfs:///backup?backup=backup-c0fd6c56ac6c4b03\u0026volume=docker_test)是vfs:///backup這個大集合中的一個元素散休。
備份的恢復(fù):
先在docker_test卷下創(chuàng)建一個a.txt文件:
# cd /nfs/docker_test
# echo "hello world\!" > a.txt
# cat a.txt
hello world\!
創(chuàng)建一個名為aaa的快照:
# convoy snapshot create docker_test --name aaa
DEBU[0354] Calling: POST, /snapshots/create, request: POST, /v1/snapshots/create pkg=daemon
DEBU[0354] event=create object=snapshot pkg=daemon reason=prepare snapshot=aaa volume=docker_test
DEBU[0354] event=create object=snapshot pkg=daemon reason=complete snapshot=aaa volume=docker_test
DEBU[0354] Response: aaa pkg=daemon
aaa
對快照aaa進行備份:
# convoy backup create aaa --dest vfs:///backup
DEBU[0466] Calling: POST, /backups/create, request: POST, /v1/backups/create pkg=daemon
DEBU[0466] dest_url=vfs:///backup driver=vfs endpoint_url= event=backup object=snapshot pkg=daemon reason=prepare snapshot=aaa volume=docker_test
DEBU[0466] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[0466] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[0466] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[0466] Creating backup event=backup filepath=/var/lib/rancher/convoy/vfs/snapshots/docker_test_aaa.tar.gz object=snapshot pkg=objectstore reason=start snapshot=aaa
DEBU[0466] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f2c4c175df4d45b5.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[0466] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f2c4c175df4d45b5.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[0466] Created backup event=backup object=snapshot pkg=objectstore reason=complete snapshot=aaa
DEBU[0466] dest_url=vfs:///backup driver=vfs endpoint_url= event=backup object=snapshot pkg=daemon reason=complete snapshot=aaa volume=docker_test
DEBU[0466] Response: vfs:///backup?backup=backup-f2c4c175df4d45b5\u0026volume=docker_test pkg=daemon
vfs:///backup?backup=backup-f2c4c175df4d45b5\u0026volume=docker_test
對a.txt文件進行修改:
# echo "123456abcde" > a.txt
# cat a.txt
123456abcde
將文件恢復(fù)到修改前的狀態(tài),即通過快照備份進行恢復(fù):
命令語法:
# convoy create <volume_name> --backup <backup_url>
通過快照恢復(fù)到修改前的命令:
# convoy create docker_test1 --backup vfs:///backup?backup=backup-f2c4c175df4d45b5\u0026volume=docker_test
DEBU[2131] Calling: POST, /volumes/create, request: POST, /v1/volumes/create pkg=daemon
DEBU[2131] event=create object=volume opts=map[VolumeType: Size:0 BackupURL:vfs:///backup?backup=backup-f2c4c175df4d45b5&volume=docker_test VolumeName:docker_test1 VolumeDriverID: EndpointURL: VolumeIOPS:0 PrepareForVM:false] pkg=daemon reason=prepare volume=docker_test1
DEBU[2131] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[2131] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[2131] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[2131] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[2131] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[2131] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[2131] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f2c4c175df4d45b5.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[2131] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f2c4c175df4d45b5.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[2131] Created volume event=create object=volume pkg=daemon reason=complete volume=docker_test1
DEBU[2131] Response: docker_test1 pkg=daemon
docker_test1
注意:
此處使用從快照恢復(fù)功能不能直接恢復(fù)到原來的docker_test卷宗乐尊,操作的實質(zhì)是通過該備份重新創(chuàng)建了一個卷宗戚丸。
如果直接將備份恢復(fù)到現(xiàn)有的卷,會出現(xiàn)報錯科吭,如下:
# convoy create docker_test --backup vfs:///backup?backup=backup-f2c4c175df4d45b5\u0026volume=docker_test
DEBU[2096] Calling: POST, /volumes/create, request: POST, /v1/volumes/create pkg=daemon
ERRO[2096] Handler for POST /volumes/create returned error: Volume docker_test already exists pkg=daemon
ERRO[0000] Error response from server, Volume docker_test already exists
{
"Error": "Error response from server, Volume docker_test already exists \n"
}
[root@ops docker_test]# convoy create docker_test1 --backup vfs:///backup?backup=backup-f2c4c175df4d45b5\u0026volume=docker_test
查看恢復(fù)情況:
# cd /nfs/docker_test1/
# ll
total 4
-rw-r--r-- 1 root root 14 Mar 6 11:22 a.txt
# cat a.txt
hello world\!
備份的刪除:
命令語法:
convoy backup delete <backup_url>
刪除前面為快照aaa創(chuàng)建的備份昏滴,使用如下命令:
# convoy backup delete vfs:///backup?backup=backup-f2c4c175df4d45b5\u0026volume=docker_test
DEBU[11513] Calling: DELETE, /backups, request: DELETE, /v1/backups pkg=daemon
DEBU[11513] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[11513] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[11513] dest_url=vfs:///backup?backup=backup-f2c4c175df4d45b5&volume=docker_test driver=vfs endpoint_url= event=remove object=snapshot pkg=daemon reason=prepare
DEBU[11513] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[11513] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f2c4c175df4d45b5.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[11513] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f2c4c175df4d45b5.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[11513] Removed convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f2c4c175df4d45b5.cfg on objectstore pkg=objectstore
DEBU[11513] dest_url=vfs:///backup?backup=backup-f2c4c175df4d45b5&volume=docker_test driver=vfs endpoint_url= event=remove object=snapshot pkg=daemon reason=complete
(4)一些疑問
快照的實體存放在何處?
先查看快照信息:
# convoy snapshot inspect test-01
DEBU[16148] Calling: GET, /snapshots/, request: GET, /v1/snapshots/ pkg=daemon
{
"Name": "test-01",
"VolumeName": "test",
"VolumeCreatedAt": "Wed Mar 06 11:19:53 +0800 2019",
"CreatedTime": "Wed Mar 06 15:02:31 +0800 2019",
"DriverInfo": {
"Driver": "vfs",
"FilePath": "/var/lib/rancher/convoy/vfs/snapshots/test_test-01.tar.gz",
"SnapshotCreatedAt": "Wed Mar 06 15:02:31 +0800 2019",
"SnapshotName": "test-01",
"VolumeUUID": "test"
}
}
注意:
此處的快照是另外創(chuàng)建的对人,跟前面沒有任何關(guān)聯(lián)谣殊,若您沒有創(chuàng)建名為test-01的快照,則使用此命令會出現(xiàn)報錯牺弄,因此姻几,在此處您應(yīng)當(dāng)使用自己創(chuàng)建的快照名查看快照的詳細(xì)信息。
以上命令的輸出結(jié)果中势告,有FilePath蛇捌,F(xiàn)ilePath對應(yīng)的值就是當(dāng)前的快照實體,我們可以使用命令查看:
# ll /var/lib/rancher/convoy/vfs/snapshots/test_test-01.tar.gz
-rw-r--r-- 1 root root 128 Mar 6 15:02 /var/lib/rancher/convoy/vfs/snapshots/test_test-01.tar.gz
在“/var/lib/rancher/convoy/vfs/snapshots/”這個目錄下咱台,存放了我們創(chuàng)建的所有快照络拌,如果不記得之前創(chuàng)建的快照名,可以到此目錄下查看所有的已創(chuàng)建的快照:
# cd /var/lib/rancher/convoy/vfs/snapshots/
# ll
total 16
-rw-r--r-- 1 root root 185 Mar 6 11:24 docker_test_aaa.tar.gz
-rw-r--r-- 1 root root 142 Feb 27 11:54 docker_test_docker_test-01.tar.gz
-rw-r--r-- 1 root root 182 Feb 27 15:58 docker_test_docker_test-02.tar.gz
-rw-r--r-- 1 root root 128 Mar 6 15:02 test_test-01.tar.gz
卷宗和快照被刪除后回溺,還可以通過快照的備份恢復(fù)嗎春贸?(或者說卷宗和快照被刪除了混萝,原來在這些被刪除的快照上面創(chuàng)建的備份還能用來恢復(fù)嗎?)
首先萍恕,對docker_test創(chuàng)建一個快照:
# convoy snapshot create docker_test --name aaa
DEBU[17187] Calling: POST, /snapshots/create, request: POST, /v1/snapshots/create pkg=daemon
DEBU[17187] event=create object=snapshot pkg=daemon reason=prepare snapshot=aaa volume=docker_test
DEBU[17187] event=create object=snapshot pkg=daemon reason=complete snapshot=aaa volume=docker_test
DEBU[17187] Response: aaa pkg=daemon
aaa
然后對快照進行備份:
# convoy backup create aaa --dest vfs:///backup
DEBU[17254] Calling: POST, /backups/create, request: POST, /v1/backups/create pkg=daemon
DEBU[17254] dest_url=vfs:///backup driver=vfs endpoint_url= event=backup object=snapshot pkg=daemon reason=prepare snapshot=aaa volume=docker_test
DEBU[17254] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[17254] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[17254] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[17254] Creating backup event=backup filepath=/var/lib/rancher/convoy/vfs/snapshots/docker_test_aaa.tar.gz object=snapshot pkg=objectstore reason=start snapshot=aaa
DEBU[17254] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f9f54dab546449da.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[17254] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f9f54dab546449da.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[17254] Created backup event=backup object=snapshot pkg=objectstore reason=complete snapshot=aaa
DEBU[17254] dest_url=vfs:///backup driver=vfs endpoint_url= event=backup object=snapshot pkg=daemon reason=complete snapshot=aaa volume=docker_test
DEBU[17254] Response: vfs:///backup?backup=backup-f9f54dab546449da\u0026volume=docker_test pkg=daemon
vfs:///backup?backup=backup-f9f54dab546449da\u0026volume=docker_test
刪除docker_test卷:
# convoy delete docker_test
DEBU[18130] Calling: DELETE, /volumes/, request: DELETE, /v1/volumes/ pkg=daemon
DEBU[18130] event=delete object=volume pkg=daemon reason=prepare volume=docker_test
DEBU[18130] Cleaning up /nfs/docker_test for volume docker_test pkg=vfs
DEBU[18130] event=delete object=volume pkg=daemon reason=complete volume=docker_test
刪除aaa快照:
# convoy snapshot delete aaa
DEBU[17327] Calling: DELETE, /snapshots/, request: DELETE, /v1/snapshots/ pkg=daemon
DEBU[17327] event=delete object=snapshot pkg=daemon reason=prepare snapshot=aaa volume=docker_test
DEBU[17327] event=delete object=snapshot pkg=daemon reason=complete snapshot=aaa volume=docker_test
注意:
刪除快照也可以到快照存放路徑使用系統(tǒng)命令進行刪除逸嘀。同樣,也可以使用這種方法去刪除卷允粤,但不同的是使用系統(tǒng)命令刪除卷之后崭倘,使用卷查看命令依然能查到該卷的信息。
使用快照aaa的備份嘗試恢復(fù)(用備份創(chuàng)建一個名為aaa的卷):
# convoy create aaa --backup vfs:///backup?backup=backup-f9f54dab546449da\u0026volume=docker_test
DEBU[17332] Calling: POST, /volumes/create, request: POST, /v1/volumes/create pkg=daemon
DEBU[17332] event=create object=volume opts=map[Size:0 VolumeName:aaa BackupURL:vfs:///backup?backup=backup-f9f54dab546449da&volume=docker_test EndpointURL: VolumeDriverID: VolumeType: VolumeIOPS:0 PrepareForVM:false] pkg=daemon reason=prepare volume=aaa
DEBU[17332] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[17332] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[17332] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[17332] Loaded driver for %vvfs:///backup pkg=vfs
DEBU[17332] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[17332] filepath=convoy-objectstore/volumes/do/ck/docker_test/volume.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[17332] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f9f54dab546449da.cfg kind=vfs object=config pkg=objectstore reason=start
DEBU[17332] filepath=convoy-objectstore/volumes/do/ck/docker_test/backups/backup_backup-f9f54dab546449da.cfg kind=vfs object=config pkg=objectstore reason=complete
DEBU[17332] Created volume event=create object=volume pkg=daemon reason=complete volume=aaa
DEBU[17332] Response: aaa pkg=daemon
aaa
通過以上實驗我們發(fā)現(xiàn)类垫,即使我們刪除了備份的母體——快照和快照的母體——卷司光,備份依然是有效的,我們可以繼續(xù)使用備份進行恢復(fù)阔挠。
那么飘庄,問題來了……
系統(tǒng)運行時間久了脑蠕,有些備份我們已經(jīng)很久沒有使用了购撼,也占用了不少存儲空間,而且忘記了具體的url谴仙,這種情況下使用命令刪除備份就顯得很麻煩迂求,那如何一次性刪除不用的備份呢?
此時最有效的辦法就是進入到快照備份目錄晃跺,找到并刪除相應(yīng)的備份文件和配置文件揩局。
備份的存放目錄是我們創(chuàng)建備份時指定的dest_url,在創(chuàng)建備份時convoy會自動在系統(tǒng)上創(chuàng)建該目錄掀虎。以下是dest_url的目錄結(jié)構(gòu):
# cd /backup
# tree
.
├── convoy-objectstore
│ └── volumes
│ ├── do
│ │ └── ck
│ │ └── docker_test
│ │ ├── BackupFiles
│ │ │ ├── backup-2bd89ea77a144dbc.bak
│ │ │ ├── backup-c0fd6c56ac6c4b03.bak
│ │ │ └── backup-f9f54dab546449da.bak
│ │ ├── backups
│ │ │ ├── backup_backup-2bd89ea77a144dbc.cfg
│ │ │ ├── backup_backup-c0fd6c56ac6c4b03.cfg
│ │ │ └── backup_backup-f9f54dab546449da.cfg
│ │ └── volume.cfg
│ └── te
│ └── st
│ └── test
│ ├── BackupFiles
│ │ └── backup-f8f4ad07043244eb.bak
│ ├── backups
│ │ └── backup_backup-f8f4ad07043244eb.cfg
│ └── volume.cfg
└── home.tar
12 directories, 11 files
說明:
所有備份文件都按volume進行分類凌盯,在volumes下使用卷名的首4個字母分兩個進行遞歸命名。如:docker_test卷產(chǎn)生的所有備份文件是存放在volumes/do/ck/<volume_name>/BackupFiles下面烹玉。
五驰怎、在Docker中使用Convony插件實現(xiàn)數(shù)據(jù)持久化存儲
1、命令行模式下使用Convoy對Docker做數(shù)據(jù)持久化
注意:
此處以nginx容器為例二打,其他服務(wù)請自行按需求操作县忌。
(1)獲取nginx的鏡像
# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f7e2b70d04ae: Pull complete
08dd01e3f3ac: Pull complete
d9ef3a1eb792: Pull complete
Digest: sha256:98efe605f61725fd817ea69521b0eeb32bef007af0e3d0aeb6258c6e6fe7fc1a
Status: Downloaded newer image for nginx:latest
(2)查看鏡像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 881bd08c0b08 29 hours ago 109MB
php 7.2.13 a1c0790840ba 2 months ago 367MB
ubuntu latest 1d9c17228a9e 2 months ago 86.7MB
(3)創(chuàng)建www卷并創(chuàng)建一個index.html文件
創(chuàng)建卷:
# convoy create www
DEBU[22537] Calling: POST, /volumes/create, request: POST, /v1/volumes/create pkg=daemon
DEBU[22537] event=create object=volume opts=map[BackupURL: VolumeDriverID: PrepareForVM:false VolumeIOPS:0 Size:0 EndpointURL: VolumeName:www VolumeType:] pkg=daemon reason=prepare volume=www
DEBU[22537] Created volume event=create object=volume pkg=daemon reason=complete volume=www
DEBU[22537] Response: www pkg=daemon
www
創(chuàng)建index文件:
# echo 'hello convoy!' > /nfs/www/index.html
# cat /nfs/www/index.html
hello convoy!
(4)啟動nginx容器,并掛載卷
# docker run -itd --name TestConvoy -p 80:80 -v /nfs/www/:/usr/share/nginx/html --volume-driver=convoy nginx
f0254ddb0225625d9d95cdb58b54557644f50901c058469901dda43093a6f6cc
(5)訪問測試
# curl 127.0.0.1
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.15.9</center>
</body>
</html>
如出現(xiàn)以上錯誤继效,則說明是卷的權(quán)限問題症杏,默認(rèn)使用root創(chuàng)建卷后,卷的權(quán)限如下:
# ll
total 0
drwx------ 2 root root 19 Mar 6 11:22 aaa
drwx------ 2 root root 19 Mar 6 11:22 aaa1
drwxr-xr-x 2 root root 116 Mar 6 17:34 config
drwx------ 2 root root 6 Mar 6 11:19 test
drwx------ 2 root root 24 Mar 6 17:37 www
因此瑞信,需要更改卷的權(quán)限為其他人有讀取和執(zhí)行權(quán)限厉颤。如下:
# chmod -R 755 www/
# ll
total 0
drwx------ 2 root root 19 Mar 6 11:22 aaa
drwx------ 2 root root 19 Mar 6 11:22 aaa1
drwxr-xr-x 2 root root 116 Mar 6 17:34 config
drwx------ 2 root root 6 Mar 6 11:19 test
drwxr-xr-x 2 root root 24 Mar 6 17:37 www
再進行訪問測試:
# curl 127.0.0.1
hello convoy!
(6)不提前創(chuàng)建映射目錄,在啟動過程中自動創(chuàng)建
在上一步的實驗中凡简,我們啟動容器前創(chuàng)建了一個存放index文件的目錄逼友,并在啟動容器的過程中使用了絕對路徑的方式映射绩郎。而此處,我們將不提前創(chuàng)建目錄翁逞,而是使用插件自動創(chuàng)建肋杖。
啟動容器:
# docker run -itd --name TestConvoy -p 80:80 -v wwwroot:/usr/share/nginx/html --volume-driver=convoy nginx
586e1fecf03d30321fe838394b138fbd93da40b8575bc3d2dc17d752987b4143
訪問測試:
# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a >nginx.org</a>.<br/>
Commercial support is available at
<a >nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
很顯然,這個頁面是nginx默認(rèn)的index文件挖函。
此時我們切換到/nfs目錄進行查看:
# cd /nfs
# ll
total 4
drwx------ 2 root root 19 Mar 6 11:22 aaa
drwx------ 2 root root 19 Mar 6 11:22 aaa1
drwxr-xr-x 2 root root 179 Mar 7 10:38 config
drwx------ 2 root root 6 Mar 6 11:19 test
drwxr-xr-x 2 root root 24 Mar 6 17:37 www
drwxr-xr-x 2 root root 40 Mar 7 17:48 wwwroot
發(fā)現(xiàn)已經(jīng)自動創(chuàng)建了wwwroot目錄状植,原因是我們在啟動過程中指定了volume驅(qū)動類型為convoy,在容器啟動過程中怨喘,docker調(diào)用了convoy插件津畸,自動創(chuàng)建了一個convoy卷并映射到了我們指定的容器目錄,并且必怜,容器內(nèi)的目錄沒有像上個實驗一樣被替換肉拓,而是容器內(nèi)部的目錄替換了宿主機的目錄∈崆欤可進入目錄查看:
# cd /nfs/wwwroot/
# ll
total 8
-rw-r--r-- 1 root root 494 Feb 26 22:13 50x.html
-rw-r--r-- 1 root root 612 Feb 26 22:13 index.html
2暖途、使用docker-compose工具調(diào)用convoy插件實現(xiàn)數(shù)據(jù)持久化
(1)編輯docker-compose.yml文件
# vim docker-compose.yml
version: '3'
services:
TestConvoy:
image: nginx:latest
container_name: nginx
volumes:
- html:/usr/share/nginx/html
ports:
- 80:80
volumes:
html:
driver: convoy
(2)使用docker-compose啟動nginx容器
# docker-compose up -d
DEBU[26106] Handle plugin get volume: POST /VolumeDriver.Get pkg=daemon
DEBU[26106] Request from docker: &{nfs_html map[]} pkg=daemon
DEBU[26106] event=mountpoint object=volume pkg=daemon reason=prepare volume=nfs_html
DEBU[26106] event=mountpoint mountpoint= object=volume pkg=daemon reason=complete volume=nfs_html
DEBU[26106] Found volume nfs_html for docker pkg=daemon
DEBU[26106] Response: {
"Volume": {
"Name": "nfs_html"
}
} pkg=daemon
DEBU[26106] Handle plugin get volume: POST /VolumeDriver.Get pkg=daemon
DEBU[26106] Request from docker: &{nfs_html map[]} pkg=daemon
DEBU[26106] event=mountpoint object=volume pkg=daemon reason=prepare volume=nfs_html
DEBU[26106] event=mountpoint mountpoint= object=volume pkg=daemon reason=complete volume=nfs_html
DEBU[26106] Found volume nfs_html for docker pkg=daemon
DEBU[26106] Response: {
"Volume": {
"Name": "nfs_html"
}
} pkg=daemon
DEBU[26106] Handle plugin get volume: POST /VolumeDriver.Get pkg=daemon
DEBU[26106] Request from docker: &{nfs_html map[]} pkg=daemon
DEBU[26106] event=mountpoint object=volume pkg=daemon reason=prepare volume=nfs_html
DEBU[26106] event=mountpoint mountpoint= object=volume pkg=daemon reason=complete volume=nfs_html
DEBU[26106] Found volume nfs_html for docker pkg=daemon
DEBU[26106] Response: {
"Volume": {
"Name": "nfs_html"
}
} pkg=daemon
Starting nginx ...
DEBU[26106] Handle plugin get volume: POST /VolumeDriver.Get pkg=daemon
DEBU[26106] Request from docker: &{nfs_html map[]} pkg=daemon
DEBU[26106] event=mountpoint object=volume pkg=daemon reason=prepare volume=nfs_html
DEBU[26106] event=mountpoint mountpoint= object=volume pkg=daemon reason=complete volume=nfs_html
DEBU[26106] Found volume nfs_html for docker pkg=daemon
DEBU[26106] Response: {
"Volume": {
"Name": "nfs_html"
}
} pkg=daemon
DEBU[26106] Handle plugin mount volume: POST /VolumeDriver.Mount pkg=daemon
DEBU[26106] Request from docker: &{nfs_html map[]} pkg=daemon
DEBU[26106] Mount volume: nfs_html for docker pkg=daemon
DEBU[26106] event=mount object=volume opts=map[MountPoint:] pkg=daemon reason=prepare volume=nfs_html
DEBU[26106] event=list mountpoint=/nfs/nfs_html object=volume pkg=daemon reason=complete volume=nfs_html
DEBU[26106] Response: {
"Mountpoint": "/nfs/nfs_html"
Starting nginx ... done
啟動過程中,自動創(chuàng)建了/nfs/nfs_html目錄膏执,可以進入查看:
# cd /nfs/nfs_html/
# ll
total 8
-rw-r--r-- 1 root root 494 Feb 26 22:13 50x.html
-rw-r--r-- 1 root root 612 Feb 26 22:13 index.html
(3)訪問測試
從以上的信息中驻售,我們可以看到,掛載的目錄中自動生成了index文件和50x文件更米,這個文件是nginx自帶的欺栗。
# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a >nginx.org</a>.<br/>
Commercial support is available at
<a >nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
很顯然,這是nginx原生的index頁面征峦。我們也可以將自己的index文件復(fù)制到此處迟几。如下:
# cp www/index.html nfs_html/
cp: overwrite ‘nfs_html/index.html’? yes
# curl 127.0.0.1
hello convoy!
3、總結(jié)
當(dāng)我們提前創(chuàng)建映射目錄并使用docker run命令進行目錄映射時栏笆,啟動容器過程中类腮,是把我們宿主機目錄內(nèi)的東西“寫進去”,寫到容器內(nèi)部目錄竖伯;而不提前創(chuàng)建映射目錄和通過docker-compose實驗我們發(fā)現(xiàn)存哲,在容器啟動過程中會自動在我們的nfs文件系統(tǒng)掛載目錄內(nèi)調(diào)用convoy插件創(chuàng)建一個卷,而對文件的操作剛好與提前創(chuàng)建目錄并使用絕對路徑映射的方式相反七婴,不提前創(chuàng)建映射目錄和docker-compose是將容器內(nèi)部的數(shù)據(jù)寫到宿主機目錄祟偷。
注意:
因本人水平有限,因此打厘,文檔中難免存在不準(zhǔn)確的地方和描述不恰當(dāng)?shù)牡胤叫蕹Γ缬胁划?dāng)敬請理解與指正。