最近在用docker,主要是用它搭建gitlab。本身呢,这个gitlab是可以通过volumes来实现数据持久化的。但是因为我用的是windows平台,所以文件夹映射在这个应用上总是出现一些权限上的问题,搜索了很多国内外的网站,目前也没有什么好用的简单的解决方案。
不过,容器创建后,我们可以使用 docker commit 通过差异性,创建一个新的image。
默认情况下,在提交时,容器的执行将被暂停,以保证数据的完整性,当然你可以指定选项 p ,来禁止。
下面就以gitlab为例处理备份。
如下图,使用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 ")
-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 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,效果还好