Docker定期清除无用镜像

327 阅读3分钟

实现思路

配置Linux crontab 定时任务,从主节点ssh至其它节点(包括master),执行Docker指令。

免密登录

配置主节点M(192.168.1.200)免密登录至节点A(192.168.1.201)、B(192.168.1.202)。

  • 在M机器执行,一直回车,就可以在/root/.ssh目录下看到公钥(id_rsa.pub)和私钥(id_rsa)。
ssh-keygen -t rsa
  • 进入A/B机器,在/root/.ssh目录下创建文件authorized_keys。
  • 将从M机器复制的id_rsa.pub内容,添加到A/B机器的authorized_keys文件内。
  • 保存后完成免密配置,现在可以从M机器免密登录到A/B机器了。

安装Ansible

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

本想自己写个脚本,执行ssh命令执行各个节点的命令,后来从小伙伴那了解到Ansible,安装部署、配置很简单。

安装Ansible

yum install -y ansible

配置Host

新建需要执行命令的机器 ansible-host 文件。

[docker]
192.168.1.201
192.168.1.202

测试

# docker 是ansible-host配置文件中分组的名称
# "free -h" 是执行的命令
ansible docker -i /app/ansible-host -m shell -a "free -h"

执行日志

192.168.1.201 | SUCCESS | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           7.6G        2.2G        777M        433M        4.7G        4.7G
Swap:            0B          0B          0B

192.168.1.202 | SUCCESS | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            15G         11G        1.9G        116M        2.4G        3.8G
Swap:          1.0G        379M        644M

配置Crontab

Linux crontab 是用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

配置Crontab

# 进入任务编辑
crontab -e
# 添加定时任务,每天23:30 执行 "docker image prune -a -f" 命令
30 23 * * * ansible docker -i /app/ansible-host -m shell -a "docker image prune -a -f"  >>/app/logs/ansible.log 2>&1

查看日志

192.168.1.201 | SUCCESS | rc=0 >>
Deleted Images:
untagged: nginx:latest
untagged: nginx@sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3
deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

Total reclaimed space: 141.5MB
192.168.1.202 | SUCCESS | rc=0 >>
Total reclaimed space: 0B

最后

docker image prune命令用于删除未使用的映像。

如果指定了-a,还将删除任何容器未引用的所有映像。

如果制定了-f,不需要提示删除确认。

随着发布的服务的镜像越来越多,我们在删除无用镜像的时候,又不想删除一些基础的镜像(jdk),否则每次构建镜像的时候需要重新拉取。可以通过镜像的自定义LABEL来实现:

LABEL use=service

然后,修改Crontab脚本中删除镜像的命令

docker image prune -a --filter="label=use=service" -f