Featured image of post [Docker] 簡單的 Docker Volume 備份、還原或複製方法

[Docker] 簡單的 Docker Volume 備份、還原或複製方法

前言

Container (容器) 是現代應用程式部署的主要形式之一,container 主要分為 Stateful Container(有狀態容器)和 Stateless Container(無狀態容器)這兩種主要類型。

Stateful Container 可以保存應用程式的狀態和數據,但因為持久化數據需要確保數據一致性,且維運上需要考慮的面向也更多,使用上較複雜。

而 Stateless Container 因為不需要維護狀態和數據的一致性,因此擴充性、高可用性和容錯能力非常優秀,但實際上需要持久化數據的應用場景不在少數,因此 Stateful Container 還是很重要的。

Docker 目前是市面上最好用的容器部屬工具之一,但在 Stateful Container 使用上仍會有一定的複雜性存在,

在 volume 的備份方式有很多種,

loomchild/volume-backup 是一個 Docker volume 備份與還原工具,相較於其他工具程式,它簡單、輕量又快速

備份指令

1
docker run -v [volume-name]:/volume --rm --log-driver none loomchild/volume-backup backup > [archive-path]

參數說明:

  • [volume-name]:需備份的 volume 名稱
  • [archive-path]:備份檔案存放的路徑

範例:

1
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup some_archive

還原指令

1
docker run -i -v [volume-name]:/volume --rm loomchild/volume-backup restore < [archive-path]

參數說明:

  • [volume-name]:指定還原的 volume 名稱,可視實際需求更改,不一定要跟備份前的相同
  • [archive-path]:備份檔案存放的路徑

範例:

1
docker run -i -v some_volume:/volume --rm loomchild/volume-backup restore < some_archive.tar.bz2

使用情境範例

我最常拿來 clone volume,用來測試對 stateful container 的 image 版本進行升級,確保升級後沒有問題才去動 production。

這邊以升級 SonarCube v8 -> v9 為例。首先,先查看 container 掛載了哪些 volume (container name: sonarqube_230307)

1
docker container inspect sonarqube_230307

Mounts 的部分輸出如下,共掛載了 3 個 volumes

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
    // ...

    "Mounts": [
        {
            "Type": "volume",
            "Name": "sonarqube_logs",
            "Source": "/var/lib/docker/volumes/sonarqube_logs/_data",
            "Destination": "/opt/sonarqube/logs",
            "Driver": "local",
            "Mode": "z",
            "RW": true,
            "Propagation": ""
        },
        {
            "Type": "volume",
            "Name": "sonarqube_data",
            "Source": "/var/lib/docker/volumes/sonarqube_data/_data",
            "Destination": "/opt/sonarqube/data",
            "Driver": "local",
            "Mode": "z",
            "RW": true,
            "Propagation": ""
        },
        {
            "Type": "volume",
            "Name": "sonarqube_extensions",
            "Source": "/var/lib/docker/volumes/sonarqube_extensions/_data",
            "Destination": "/opt/sonarqube/extensions",
            "Driver": "local",
            "Mode": "z",
            "RW": true,
            "Propagation": ""
        }
    ],

    // ...
}

執行備份

1
2
3
docker run -v sonarqube_data:/volume --rm --log-driver none loomchild/volume-backup backup -v > sonarqube_data.tar.bz2
docker run -v sonarqube_extensions:/volume --rm --log-driver none loomchild/volume-backup backup -v > sonarqube_extensions.tar.bz2
docker run -v sonarqube_logs:/volume --rm --log-driver none loomchild/volume-backup backup -v > sonarqube_logs.tar.bz2

執行復原,volume name 的部分後面加上 _v9_test 尾綴,做完後等於 clone 了 3 個 volumes

1
2
3
docker run -i -v sonarqube_data_v9_test:/volume --rm loomchild/volume-backup restore < sonarqube_data.tar.bz2
docker run -i -v sonarqube_extensions_v9_test:/volume --rm loomchild/volume-backup restore < sonarqube_extensions.tar.bz2
docker run -i -v sonarqube_logs_v9_test:/volume --rm loomchild/volume-backup restore < sonarqube_logs.tar.bz2

使用測試用的 volumes 與新版 image 執行 docker run

1
2
3
4
5
6
docker run -d --name sonarqube_test_upgrade_to_v9 \\
    -p 9000:9000 \\
    -v sonarqube_data_v9:/opt/sonarqube/data \\
    -v sonarqube_extensions_v9:/opt/sonarqube/extensions \\
    -v sonarqube_logs_v9:/opt/sonarqube/logs \\
    sonarqube:9-community

References:

  • [Docker volume backup and restore the easy way. – kenops][https://www.kenops.io/2022/08/docker-volume-backup-and-restore-the-easy-way/]
  • [Backup & Restore Docker Named Volumes | by Jarek Lipski | Medium][https://jareklipski.medium.com/backup-restore-docker-named-volumes-350397b8e362]
  • loomchild/volume-backup: docker volume backup & restore utility