Docker踩坑日记-1

最近有一个需求需要手动的构建一个docker镜像,遇到了一些docker的坑,记录一下:

1. 使用centos的镜像无法使用yum安装

dockerfile构建,但是里面的yum死活执行不了,无法连接上centos的官方镜像库。提示如下错

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was

其中dockerfile如下:

FROM centos:7

···

ENV PYTHONIOENCODING=utf-8
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
ENV FLASK_RUN_PORT 5051

CMD ["gunicorn", "app:app", "-c", "gun.conf"]

原因就在于第一句的,FROM centos:7,我本地所连接的镜像仓库使用的是默认仓库,这个仓库里面的centos是精简版的,并不内置yum

解决办法,换一个镜像仓库,这里使用阿里云的加速:

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://c8it25aj.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload && systemctl restart docker

然后构建Dockerfile,就变得6的一批了。

2. 一个简单的RPC服务,竟然构建出来的镜像1.5G

看到原始的FROM镜像才200MB,猜测构建镜像的大小无非两个:

  • 容器构建的方法的问题
  • 容器内安装的程序和文件增加了镜像大小

 

(1) 首先想到的是,会不会是因为RUN的层数太多,后面的container合并的时候会导致镜像变大

然后把RUN合并成为一个,把能够合并的命令合并成一个,开始通过dockerfile构建docker镜像,最后发现,并没有卵用,镜像还是那么大。

为此还继续做了排除实验,即仅仅保留FROM centos以及一个COPY方法,构建出来的docker image大小大概等于:centos源镜像大小+COPY文件的大小

结论:

  1. Dockerfile的RUN是会产生一层container去执行命令,而且不同的RUN之间文件层级是隔离的,RUN写的太多只会影响构建的速度,并不会影响最终构建出来的image大小。
  2. Docker镜像的大小只与Docker容器内的文件大小有关,与构建方法无关。

(2) 问题就是docker内安装了太多的东西,需要清除以下的内容:

  • yum安装时候的缓存和程序包

在进行yum安装完后,添加了如下命令进行软件包和缓存的清除

yum clean packages && yum clean headers && yum clean all
  • pip安装时候的缓存和程序包

在进行pip安装的时候,加上参数--no-cache-dir进行无缓存安装,如:

pip3 --no-cache-dir install pillow 
  • 减少不必要的依赖包
    • 减少不必要的依赖包,这个难度是比较大的,网上的一些教程中的依赖包并不知道是不是真的是需要的,就都一股脑的安装上去了,最好的办法还是,仅仅只适用yum和pip安装,不自行下载安装。
    • 对于tar包等一些压缩包,使用ADD命令COPY,ADD命令是会自动解压这部分的压缩包,而不会把压缩包的内容一块带到镜像上面去。如果使用COPY则还需要手动的删除这些压缩包。
    • 构建docker镜像的时候,上下文目录不要有太多东西,只保留必要的东西在里面
  • 改用flask为更加轻量级的bottle

亲测,flask改为bottle省不了多少空间。

 

 

3. 一些错误的Dockerfile构建过程,产生了太多Exited状态的废弃container

对于这些container不必手下留情,直接全部删除:

docker rm $(docker ps -q -f status=exited);

当然如果有一些其他的docker是可用的,可能会误删,请慎用!

 

4. 使用docker save的时候,不要使用image id,而是使用 [REPOSITORY]:[TAG]

不要使用image id,而是使用 [REPOSITORY]:[TAG],原因是因为如果用的image id进行构建的话,并不会保留[REPOSITORY]:[TAG],导致重新load这个镜像的时候,REPOSITORY与TAG为None

[root@localhost ai_build]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ai_module    v1        dc8dab4a9aa0   7 seconds ago   923MB
nginx        latest    f6d0b4767a6c   8 weeks ago     133MB
centos       latest    300e315adb2f   3 months ago    209MB
centos       7         8652b9f0cb4c   3 months ago    204MB
[root@localhost ai_build]# 
[root@localhost ai_build]# 
[root@localhost ai_build]# 
[root@localhost ai_build]# docker save -o ai_module.tar ai_module:v1

 

5. Dockerfile语法校验

可以在以下网站中进行dockerfile的语法校验,还会给你提一些意见:

https://www.fromlatest.io/#/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值