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

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

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

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

一.找到容器的ID

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

 二.执行命令

完整的命令结束如下:

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

  -a, --author=""     Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -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如下

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2018-08-06T18:58:25.3678712</Date>
    <Author>WIN-NDKCM8P8FFS\Administrator</Author>
    <Description>保证docker镜像的gitlab持久最新</Description>
    <URI>\docker gitlab</URI>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <Repetition>
        <Interval>PT2H</Interval>
        <Duration>P1D</Duration>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
      <StartBoundary>2018-08-06T00:15:37</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-2589090319-4090488750-3172618585-500</UserId>
      <LogonType>Password</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>false</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>F:\docker\gitlab\save.bat</Command>
    </Exec>
  </Actions>
</Task>

四.备份删除

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

我们可以使用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文件,内容如下

<?php
exec("docker images",$array,$ret);
if($ret==1)exit(0);
$i = 0;//记录用来保存最近2条
foreach($array as $temp){
    $temp =  array_values(array_filter(explode(' ',$temp)));
    if($temp[0]=="<none>"){
        $i++;
        if($i>2)exec("docker rmi ".$temp[2],$re,$ret);
    }
}

ok,执行下bat,效果还好

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐