使用docker commit 备份镜像来实现数据持久化
最近在用docker,主要是用它搭建gitlab。本身呢,这个gitlab是可以通过volumes来实现数据持久化的。但是因为我用的是windows平台,所以文件夹映射在这个应用上总是出现一些权限上的问题,搜索了很多国内外的网站,目前也没有什么好用的简单的解决方案。不过,容器创建后,我们可以使用 docker commit 通过差异性,创建一个新的image。默认情况下,在提交时,容器的执...
最近在用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,效果还好
更多推荐
所有评论(0)