docker进阶速查

介绍关于docker的一些进阶内容,如docker file 中的关键词,后期维护等。

dockerfile中的常用关键词

关键词描述
FROM构建的新镜像是基于哪个镜像
MAINTAINER镜像维护者姓名或邮箱地址
RUN构建镜像时运行的shell命令
COPY拷贝文件或目录到镜像中
ADD更高级的复制文件,可以自动解压缩
ENV设置环境变量
ARG构建参数,类似于env,但是只在构建镜像时有用
USER指定用户
EXPOSE只是声明容器运行的服务端口,并不会在宿主进行端口映射
HEALTHCHECK容器中服务健康检查,1.12版本后提供,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。如有多个,只有最后一个生效
WORKDIR设置工作目录
ENTRYPOINT运行容器时执行,如有多个,只有最后一个执行,需要指定--entrypoint才能覆盖掉
CMD运行容器时执行,如有多个,只有最后一个执行,可以被docker run命令后的命令行参数覆盖掉
VOLUME定义匿名卷,容器运行时应该尽量保持容器存储层不发生写操作,所以像日志文件应该定义为

写dockerfile时需要注意的点:

  • 多个命令拼接在一起
  • 清理部署垃圾
  • 能用copy的时候就不用add,除非需要自动解压缩,因为add会让镜像构建缓存失效,从而可能导致镜像构建速度下降。
  • 比起cmd,更加推荐entrypoint

比如制作一个simhash的服务镜像:

FROM miniconda3/centos7:1.1.0
ADD simhash-web /home/simhash-web
WORKDIR /home/simhash-web/
RUN pip install -r requirements.txt
EXPOSE xxxx
ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8
ENTRYPOINT ["sh","-c","python xxx.py"]

overlay2存储驱动

里面存放docker的元数据,重点关注imagedblayerdb,在docker中,image是由多个layer组合而成的,layer是一个共享的层,可能有多个image会指向某个layer。

/var/lib/docker/image/overlay2/imagedb/content/sha256 里面可以看到镜像元数据的文件,文件的前面几位是镜像的id。镜像元数据其实是个json,可以看到镜像的历史数据,以及对应的layer,layer的信息在rootfs,层数由底层到高层。

docker默认的磁盘被占满了怎么办?

  1. 首先排查被占满的原因是什么,docker的默认存储位置在/var/lib/docker里,使用du查看占地儿最大的文件是哪个。一般被占满都是日志问题,然后如果是日志的话就删除它,如果不是日志,而是镜像太多或者是关闭容器太多,使用docker自带的清除命令也可以释放一部分空间:
   # 删除掉关闭的容器,没有用到的镜像,无tag的镜像,无用的数据卷
   docker system prune -a

删除日志可以写一个脚本处理,如下,只要磁盘占用率超过80%,就将超过1G的日志文件进行批量删除:

#!/bin/bash
use_space=`df -h | grep 'var$' | awk '{print $5*1}'`
limit=80
workdir='/var/lib/docker/overlay2/'
if [ $use_space -gt $limit ]; then
  echo '磁盘利用率大于阈值,将进行清理:'$use_space
  cd $workdir&&du -sh * |grep G|awk '{print $2}' | while read line
  do
     need_clean_log_dir=$workdir$line'/diff/home/apache-tomcat-9.0.2/logs'
     cd $need_clean_log_dir&&du -sh *| grep M|awk '{print $2}'|xargs -I dellist sh -c 'echo > dellist'
  done
  now_use_space=`df -h | grep 'var$' | awk '{print $5}'`
  echo '清理完毕,清理后磁盘使用空间为'$now_use_space
else
  echo '磁盘利用率未超过阈值'
fi
  1. 如果排查是log日志的原因,暂时的删除掉日志不是长久之策,要么使用挂载的形式,要么让生产日志的程序只保留近一个月的日志

  2. 为什么会log会占满磁盘
    在容器运行时,一个新的可写层在镜像层之上被创建,容器中进程写入位于底层的一个文件时,此文件的一个拷贝就会在顶层被创建。

参考资料

Docker存储驱动之–overlay2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值