Skip to main content
 首页 » 编程设计

backup之我应该如何备份和还原Docker命名卷

2024年11月24日24hnrainll

我对docker compose文件中的命名卷的功能有些困惑,特别是在备份/还原我的应用程序时。

我实际上正在测试此dockercompose文件:

      version: '2' 
      services: 
          django: 
              build:  
                  context: "{{ build_dir }}/docker/django" 
              depends_on: 
                  - db 
              environment: 
                  [...] 
              volumes: 
                  - code:/data/code 
                  - www:/var/www 
                  - conf:/data/conf 
              networks: 
                  - front 
                  - db 
              expose: 
                  - "8080" 
              entrypoint: "/init" 
          db: 
              build: 
                  context: "{{ build_dir }}/docker/postgres"  
              environment: 
                  [...] 
              volumes: 
                  - data:/var/lib/postgresql/data 
              networks: 
                  - db 
 
      volumes: 
          data: 
          www: 
          code: 
          conf: 
 
      networks: 
          front: 
              external: 
                  name: "proxy_nw" 

如文档所述,我尝试使用命名卷而不是仅数据容器。但是我应该如何备份我的数据?

使用仅数据容器,我本来可以完成 docker run --rm --volume-from DOC backup_container save的,这确实很容易。

现在,我阅读 in this topic,应该使用类似 docker run --rm --volume data --volume www --volume code --volume conf backup_container save的名称。这不是那么简单,因为我有许多具有不同类型和卷名的应用程序,因此这意味着我的保存数据的命令对于每个应用程序都必须有所不同。它使自动化过程复杂化。

编辑:实际上此语法 docker run --volume data --volume www container_image my_command不正确。
它需要容器内的挂载点,因此 docker run --volume data:/somewhere --volume www:/somewhereelse container_image my_command
因此,与备份容器一起使用甚至更加复杂。

那么,这种情况下的最佳实践是什么?我是否应该对所有容器仅使用一个命名卷?

请您参考如下方法:

实际上,应采用与官方文档中相同的方式进行。数据卷容器将其数据存储在“虚拟根目录”中,因此您应该使用下一条命令进行备份:

docker run --rm \  
  --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] \ 
  --volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \ 
  ubuntu \ 
  tar cvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar /[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] 

哪里:
  • --rm 表示将清除为此运行命令创建的镜像
  • DOCKER_COMPOSE_PREFIX 默认是您的项目目录名称
  • VOLUME_NAME 是组成文件
  • 中的数据量容器名称
  • TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA 是用于装载卷数据的目录
  • TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE 是虚拟映射到您当前目录的目录,备份将放置在该目录中
  • BACKUP_FILENAME -备份文件的名称(您可以在当前目录中找到它)
  • ubuntu -您可以将图像类型更改为带有tar的另一个容器:)

  • 将数据取回卷(还原):
    docker run --rm \  
      --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] \ 
      --volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \ 
      ubuntu \ 
      tar xvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar -C /[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] --strip 1 
    

    哪里:
  • TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP 是将提取的文件复制到的目录(此目录与卷链接,因此将写入该目录)
  • -C -告诉tar从哪里提取内容
  • --strip 1 -删除前导路径元素(例如,如果备份内容位于/ temp文件夹或类似文件夹中,则为父目录)