Docker定时清理docker容器日志、目录迁移、整体迁移和发布

Share
  • 2022年7月29日

一、定时清理docker容器日志

docker 容器启用一段时间之后日志会逐渐累积,越来越臃肿,可能高达十几G,我们需要定期自动清理此容器日志

1. 以下两个shell脚本可以查看和清理所有docker 容器日志

docker_log_size.sh 查所有容器日志大小脚本

#!/bin/sh
echo "======== docker containers logs file size ========"  
logs=$(find /var/lib/docker/containers/ -name *-json.log)  
for log in $logs  
        do  
             ls -lh $log   
        done 

clean_docker_log.sh 清空所有容器日志脚本

#!/bin/sh 
echo "======== start clean docker containers logs ========"  
logs=$(find /var/lib/docker/containers/ -name *-json.log)  
for log in $logs  
        do  
                echo "clean logs : $log"  
                cat /dev/null > $log  
        done  
echo "======== end clean docker containers logs ========"  

2. 脚本人工执行测试

查看日志大小

[email protected]:/opt/docker-sh# ./docker_log_size.sh 
======== docker containers logs file size ========
-rw-r----- 1 root root 4.3G Aug 18 16:14 /var/lib/docker/containers/c4e04562d33f1898eb1dd3d49ddd5a90dc3b989a3efca110bd44893829fc036c/c4e04562d33f1898eb1dd3d49ddd5a90dc3b989a3efca110bd44893829fc036c-json.log

清理所有日志

[email protected]:/opt/docker-sh# ./clean_docker_log.sh 
======== start clean docker containers logs ========
clean logs : /var/lib/docker/containers/13487e209673f8e3563bfcac486d0bcf8bc47a7ceb13e63967c4d69adf48bf1b/13487e209673f8e3563bfcac486d0bcf8bc47a7ceb13e63967c4d69adf48bf1b-json.log
======== end clean docker containers logs ========

3. crontab 定期清理日志

使用linux的crontab命令每天晚上2点定期执行脚本清空容器日志

0 0 2 * * ? /opt/docker-sh/clean_docker_log.sh
  1. 先查看定期命令,是否已存在相当指令
[email protected]:/opt/docker-sh# crontab -l
[email protected]:/opt/docker-sh# 
  1. 新增指令,保存指令
 0 0 2 * * ?  /opt/docker-sh/clean_docker_log.sh
[email protected]:/opt/docker-sh# crontab -e

用root权限进入容器内部

docker exec -u root -it *** sh 

或者

#vim clear_docker_logs.sh
#!/bin/bash
echo 'input log file  size '$1  
default=20  
if [ -n "$1" ]  
then  
  default=$1
fi
max=`expr 1024 \* $default`  
echo 'current set file size '$max  
for file in ` ls /home/docker/lib/docker/containers/*/*-json.log `  
do  
  #echo $file
  s=`du -k $file |awk '{print $1}'`
 # echo $s
  if [ $s -gt $max ]
  then
   echo 'remove'$file
   truncate -s 0 $file
   echo 'removed'$file
  fi
done

测试脚本

chmod +x clear_docker_logs.sh  
./clear_docker_logs.sh 20

加入crontab 每隔半小时清理日志 

#crontab -e
 */30 * * * * /bin/sh /data/docker/docker_logs.sh 20 >> /root/mylog.log 2>&1

二、Docker目录迁移

docker 默认安装路径为/var/lib/docker/,当docker用过一段时间后发现/var/lib/docker/overlay2 占用很大,就需要清理Docker占用的磁盘空间,将目录/var/lib/docker 目录迁移到较大的磁盘上

查看磁盘使用情况

# du -hs /var/lib/docker/


查看Docker的磁盘使用情况,docker system df命令,类似于Linux上的df命令,

# docker system df 


迁移/var/lib/docker目录
首先需要停止docker服务。

#systemctl stop docker 

创建新的docker目录,执行命令df -h,找一个大的磁盘。 我在/home目录下面建了/home/docker/lib目录

#mkdir -pv /home/docker/lib

迁移/var/lib/docker目录下面的文件到 /home/docker/lib

#rsync -avz /var/lib/docker /home/docker/lib/

 配置/etc/systemd/system/docker.service.d/devicemapper.conf。查看devicemapper.conf 是否存在。如果不存在就新建。

#mkdir -p /etc/systemd/system/docker.service.d/
#vim /etc/systemd/system/docker.service.d/devicemapper.conf

然后在devicemapper.conf 写入:(同步的时候把父文件夹一并同步过来,实际上的目录应在/home/docker/lib/docker

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd  --graph=/home/docker/lib/docker

重新加载 docker

#systemctl daemon-reload
#systemctl restart docker
#systemctl enable docker

为了确认一切顺利,运行

#docker info

命令检查Docker 的根目录.它将被更改为 /home/docker/lib/docker

启动成功后,再确认之前的镜像还在

确定容器没问题后删除/var/lib/docker/目录中的文件

三、整体迁移

1.定制镜像

由于save&load实际操作的是image,所以导出之前,要先使用commit命令把容器中相对于其底层镜像的修改,提交为一层文件系统,与原有的image结合构成一个新的image。新的image中会包含所有修改的内容。
(ps:这种制作镜像的方式不被提倡,因为这样做会保留一些元数据信息,导致image过大,如果想用于制作一个简洁的镜像,需使用DockerFile的方式定制镜像,这里不做详述)
这样以一个容器salve02为例,将它提交到一个叫做theslave02的镜像上,再打上标签
格式:docker commit -m ‘镜像描述’ -a ‘制作者’ 容器名 镜像名

docker commit -m ‘test’ -a ‘yourname’ container-py3 image-py3


提交完成后我们可以看到这么一个image:

2.导出镜像

把镜像导出为一个输出文件:

查看导出的文件:

3.传输文件

将导出的输出文件通过scp的方式发送到本地的主机上:

4.导入镜像

在本地主机上,将受到的文件导入为镜像文件:

查看镜像文件:

5.使用镜像运行容器

使用刚刚导入的镜像,运行为一个容器:

查看容器运行状况:

进入容器:

方法二

1.将镜像打成tar包
格式:docker save -o tar包的路径 镜像名

docker save -o /data/py3.tar image-py3


指定路径下,会有py3.tar。
2.使用tar包
先删除本地的容器和镜像,依次操作:

docker ps #查看运行中的容器

docker stop container-py3 #停止容器

docker rm container-py3 #删除容器

docker images #查看镜像

docker rmi image-py3 #删除镜像



加载制作好的tar包

格式:docker load < tar包所在路径

docker load < /data/py3.tar


3.使用镜像
查看镜像
创建并运行容器

docker run -dit --name container-py3 226354af8bd3 /bin/bash

进入容器

docker exec -it container-py3 /bin/bash

测试 python3 环境

python3

发布镜像

tar包形式分发不是很方便,可以将镜像发布到远程仓库。
Docker官网推出的docker仓库的一个公共服务器。
官网地址:https://hub.docker.com/

创建账号后

登录账号

docker login

退出账号

docker logout

1.打tag

docker tag image-py3 yourname/image-py3

2.push上传

docker push yourname/image-py3

3.查看docker仓库
上传完成后,可以在docker仓库web页面查看镜像。

4.其他人使用,拉取镜像

docker pull yourname/image-py3