跳到主要内容

数据卷备份和迁移

备份和迁移数据卷是维护 Docker 容器数据的重要操作。说实话,数据卷的备份和迁移比绑定挂载麻烦。第一次看到长长的备份命令时,我惊讶了,不过理解之后也还好。

一、备份数据卷

  1. 确定要备份的数据卷

    # 使用 docker volume ls 命令列出所有数据卷。假设备份 my_volume
    ubuntu@www.zxzsk.com:~$ docker volume ls
    DRIVER VOLUME NAME
    local 8fc4a7d5d333e2addff8d6c859064b93daf9715d4352d9b03837ea6389d93f26
    local my_volume
    local my_volume2
    local my_volume3
    local my_volume4

    # 要备份 my_volume 卷。查看哪些容器使用了 my_volume 卷。
    ubuntu@www.zxzsk.com:~$ docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Mounts}}"
    CONTAINER ID NAMES MOUNTS
    9f7ad149cfef my-nginx4 my_volume
    11be6349947f my-nginx my_volume
    e230b1fd483f priceless_allen
    0ea1a7d43fb9 cool_satoshi
    5f9cfbdba6a0 musing_dijkstra
  2. 创建备份: 可以使用 docker run 命令结合 tar 命令来备份一个数据卷。以下是一个示例命令:

    docker run --rm --volumes-from <app_container> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /app/data
    理解命令

    首先你要知道上面是一个很长的 docker run 命令,回顾 docker run 命令的格式: docker run [选项] 容器 [命令]

    然后我告诉你这个 docker run 做了什么:

    1. --rm 在容器停止后,自动销毁容器。
    2. --volumes-from <app_container> 共享另一个容器(app_container)的存储卷
    3. $(pwd):/backup 将宿主机当前目录挂载到容器 /backup 目录
    4. ubuntu使用镜像ubuntu:latest。使用哪个镜像无所谓,只要镜像内有 tar 命令即可。
    5. tar cvf /backup/<backup_name>.tar /app/data 是容器启动时要执行的命令。作用:使用 tar 命令将容器的数据卷(假设/app/data目录)备份到 /backup 目录下,也就是宿主机 $(pwd) 目录 。
    示例
    # 备份 my-nginx 容器在 my_volume 卷数据
    ubuntu@www.zxzsk.com:~$ docker run --rm --volumes-from my-nginx -v $(pwd):/backup ubuntu tar cvf /backup/my-nginx-data.tar /usr/share/nginx/html/
    tar: Removing leading `/' from member names
    /usr/share/nginx/html/
    /usr/share/nginx/html/index.html
    /usr/share/nginx/html/50x.html

    # 数据已备份到宿主机当前目录
    ubuntu@www.zxzsk.com:~$ ls
    my-nginx-data.tar

二、迁移数据卷

  1. 传输备份文件: 将生成的 .tar 文件传输到目标机器。

  2. 在目标机器上恢复数据卷: 在目标机器上创建一个新的容器并挂载新的数据卷,然后使用以下命令恢复数据:

    docker run --rm --volumes-from app_container -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /app/data
    理解命令

    这里同样是通过运行一个临时容器,将宿主机目录和另一个容器(<app-container>)的存储卷挂载到临时容器,然后通过 tar 命令将备份文件还原到存储卷目录。tar -C:指定解包到某个目录。


注意事项

  • 在进行备份和迁移操作时,请确保容器已经停止,以避免数据不一致。
  • 在迁移数据卷之前,请确保目标机器上 Docker 的版本兼容。
  • 安全地传输备份文件,可以使用 scpsftp 或其他安全的数据传输方式。
  • 定期进行数据卷的备份,以防止数据丢失。 这些步骤适用于大多数情况,但具体的命令和参数可能需要根据您的实际环境和需求进行调整。