使用docker commit 备份镜像来实现数据持久化

最近在用docker,主要是用它搭建gitlab。本身呢,这个gitlab是可以通过volumes来实现数据持久化的。但是因为我用的是windows平台,所以文件夹映射在这个应用上总是出现一些权限上的问题,搜索了很多国内外的网站,目前也没有什么好用的简单的解决方案。

不过,容器创建后,我们可以使用 docker commit 通过差异性,创建一个新的image。

默认情况下,在提交时,容器的执行将被暂停,以保证数据的完整性,当然你可以指定选项 p ,来禁止。

下面就以gitlab为例处理备份。

一.找到容器的ID

如下图,使用docker ps 列出当前所有运行的容器,这个30160e6e2787就是啦,当然完整的比这个长很多。在执行命令的时候,其实使用 30160就好了。可以看到这个容器其实已经重新启动过了,使用的是近期的备份,刚好服务器最近更新了一次。

使用docker commit 备份镜像来实现数据持久化_第1张图片

 二.执行命令

完整的命令结束如下:

Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]Create a new image from a container's changes

  -a, --author=""     Author (e.g., "John Hannibal Smith ")
  -m, --message=""    Commit message
  -p, --pause=true    Pause container during commit

这里直接用的 docker commit 30160e6e2787 gitlab/gitlab-ce:latest 

三.计划任务

为了方便,可以添加一个计划任务,让其可以自动备份,首先写一个bat脚本。

@echo off
title GitLab Saveing
mode con cols=90 lines=18&color 2e
echo "   ____ _ _   _          _       ____                  _             "
echo "  / ___(_) |_| |    __ _| |__   / ___|  __ ___   _____(_)_ __   __ _ "
echo " | |  _| | __| |   / _` | '_ \  \___ \ / _` \ \ / / _ \ | '_ \ / _` |"
echo " | |_| | | |_| |___ (_| | |_) |  ___) | (_| |\ V /  __/ | | | | (_| |"
echo "  \____|_|\__|_____\__,_|_.__/  |____/ \__,_| \_/ \___|_|_| |_|\__, |"
echo "                                                               |___/ "
docker commit 30160e6e2787 gitlab/gitlab-ce:latest>>F:/docker/gitlab/log.txt

脚本将处理结果追加写在log.txt中。

然后创建计划任务,导出配置xml如下



  
    2018-08-06T18:58:25.3678712
    WIN-NDKCM8P8FFS\Administrator
    保证docker镜像的gitlab持久最新
    \docker gitlab
  
  
    
      
        PT2H
        P1D
        false
      
      2018-08-06T00:15:37
      true
      
        1
      
    
  
  
    
      S-1-5-21-2589090319-4090488750-3172618585-500
      Password
      HighestAvailable
    
  
  
    IgnoreNew
    false
    true
    true
    false
    false
    
      false
      false
    
    true
    true
    false
    false
    false
    PT1H
    7
  
  
    
      F:\docker\gitlab\save.bat
    
  

四.备份删除

昨天配好备份脚本,然后今天用docker images指令查了一下,好多的镜像备份, 看来还要定期删除了。

使用docker commit 备份镜像来实现数据持久化_第2张图片

我们可以使用docker rmi命令-删除image,指令如下

Usage: docker rmi IMAGE [IMAGE...]Remove one or more images

  -f,--force=falseForce removal of the image
  --no-prune=falseDonotdelete untagged parents

行的吧,后面再写个脚本吧,2小时备份一下,是有点多了。

 

补充:只保留最近2条image

服务器放了php环境,通过php脚本处理实现

① 在bat文件后面加    D:\devops\php72\php.exe F:\docker\gitlab\index.php

② 创建index.php文件,内容如下

"){
        $i++;
        if($i>2)exec("docker rmi ".$temp[2],$re,$ret);
    }
}

ok,执行下bat,效果还好

使用docker commit 备份镜像来实现数据持久化_第3张图片

你可能感兴趣的:(docker)