轻量Docker容器

语言: CN / TW / HK

docker build 太慢怎么办?

docker build 出来的镜像太大了怎么办?

有什么用

免翻墙急速 docker build 出镜像,镜像极小,便于传输

实现方法

通常来说一个Dockerfile可能是这样的

FROM debian

RUN apt-get update \
    && apt-get install -y xxx xxx \
    && rm -rf /var/lib/apt/lists/*

COPY xxx /xxx

RUN pip install --no-cache-dir -r requirements.txt

这样构建出来的镜像通常非常大,如果要在服务器上部署,将镜像上传到服务器,非常非常非常耗时

比如上面的镜像构建需要5分钟,生成1-2GB大小的镜像,以2m/s上传,上传要10分钟,然后在服务器上 docker load 加载镜像,大概要1分钟

整个部署流程长达15分钟,而且需要人工监视状态执行下一步,非常耗精力

于是将Dockerfile改成这样

FROM debian

COPY xxx /xxx

CMD ["bash" "xxx.sh"]

xxx.sh

apt-get update
apt-get install -y xxx xxx
rm -rf /var/lib/apt/lists/*
pip install --no-cache-dir -r requirements.txt

镜像构建5秒,生成100-200MB左右镜像,以2m/s上传,上传1-2分钟,然后在服务器上 docker load 加载镜像,大概要20秒

一共2分钟完成,服务器网速快,无墙干扰,运行容器到正常服务大概2分钟

  • 可能会有人说了容器挂了怎么办?重新创建时耗时比前面的时间久太多,服务恢复的很慢

其实也可以用 docker commit 保存一下镜像

  • 可能又有人说了为什么不直接把代码传到服务器上运行构建和部署?和这个方法有什么区别

传代码不能实现版本管理,时间长就忘记服务器上是啥版本了

如果要用版本管理,需要传git仓库,git仓库 .git 文件巨多,非常影响上传速度,所以不太行

如果使用git服务(如GitHub),意味这服务器上要保存一个key访问GitHub,个人不期望服务器上留过多的key,其实GitHub有部署专用key,仓库只读权限,于是各种服务又面临key管理问题,目前key管理没有啥好办法,所以也不太行(如果有师傅知道有啥好办法,求告知)

灵感来源

来自生活实践,目前日报等服务是这样部署的

其实这主要的问题是网络墙和上传慢,不知道企业有没有这样玩的

一个想法,不一定对

这里是脑洞专栏