Docker數(shù)據(jù)持久化——Docker容器存儲插件Convoy

一佩伤、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)敬請理解與指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末户盯,一起剝皮案震驚了整個濱河市嵌施,隨后出現(xiàn)的幾起案子饲化,更是在濱河造成了極大的恐慌,老刑警劉巖吗伤,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吃靠,死亡現(xiàn)場離奇詭異,居然都是意外死亡足淆,警方通過查閱死者的電腦和手機巢块,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巧号,“玉大人族奢,你說我怎么就攤上這事〉ず瑁” “怎么了越走?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長靠欢。 經(jīng)常有香客問我廊敌,道長,這世上最難降的妖魔是什么掺涛? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任庭敦,我火速辦了婚禮,結(jié)果婚禮上薪缆,老公的妹妹穿的比我還像新娘。我一直安慰自己伞广,他們只是感情好拣帽,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚼锄,像睡著了一般减拭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上区丑,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天拧粪,我揣著相機與錄音,去河邊找鬼沧侥。 笑死可霎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宴杀。 我是一名探鬼主播癣朗,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旺罢!你這毒婦竟也來了旷余?” 一聲冷哼從身側(cè)響起绢记,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎正卧,沒想到半個月后蠢熄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡炉旷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年护赊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾跃。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡骏啰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抽高,到底是詐尸還是另有隱情判耕,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布翘骂,位于F島的核電站壁熄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碳竟。R本人自食惡果不足惜草丧,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莹桅。 院中可真熱鬧昌执,春花似錦、人聲如沸诈泼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铐达。三九已至岖赋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓮孙,已是汗流浹背唐断。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杭抠,地道東北人脸甘。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像祈争,于是被迫代替她去往敵國和親斤程。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容