dockerfile角度
dockerfile的架构、编写都将影响docker 的性能。
docker语句注意点:
- 1、利用构建缓存:镜像构建是从dockerfile第一句开始执行,并一步一步往下的,故docker镜像升级导致会改动的语句镜像写在下面。因为一旦有一层没命中,往下的每条语句都不会利用缓存。
- 2、合并镜像:执行docker build语句时,增加–squash,创建一个合并的镜像。为合并前,一个打包的镜像由很多镜像层构建,使用该参数后只存在一层整体镜像层
- 3、构建时利用apt包管理器,在执行apt-get install时命令应增加 no-install-recommends参数,这样可以保证APT仅安装核心依赖,减少不必要的包下载。
- 4、每执行一次RUN命令就会增加一层镜像层,习惯使用&&连接多个命令以及()换行的方法是个很好的习惯。
docker多阶段构建:一个运行环境可能存在多个阶段、比如前端变异阶段、jar包编译阶段、执行发布jar包阶段。这样会导致最终的镜像包特别大、事实上最终镜像可以抛弃不必要的编译工具,npm、maven等。想实现这种效果推荐使用建造者模式
。
可以观察到该dockerfile存在三个阶段:
- 阶段0: 称为storefront。npm install 作用:安装模块到node_module中,npm run build 作用:执行package.json中script下的
输出符合各个模块规范的js文件。 - 阶段1: 称为appserver,该阶段执行了编译打包动作,生成了jar文件
- 阶段2: 称为production,该阶段拉取执行jar包的jdk8基础镜像,接着创建一个用户,设置工作路径,然后执行COPY–from指令,他从之前阶段构建的镜像中
仅复制生产环境相关的应用代码和文件
,最后设置当前应用程序为容器启动时的主程序,CMD用来给ENTRYPOINT追加参数。
构建完成使用dockerbuild命令,如 docker image build -t multi:stage .
那么构建过程如下:
使用docker image ls查看生成的镜像。
我们可以观察到:storefront、appserver、production都成了分开的镜像,如此操作大大缩小了镜像的size。
docker存储驱动设置角度
每个docker容器都有一个本地存储空间、保存层叠的镜像层 和 容器文件系统。容器的所有读写操作都在镜像层和容器文件系统。
以往本地存储通过存储驱动(Storage Driver)
进行管理,为了稳定性,docker还是使用自己支持的存储驱动。Docker 在 Linux底层支持了几种不同驱动的具体实现,他和本地存储一样都采用不同方法实现了栈式镜像层和写时复制。
修改驱动:可以在/etc/docker/deamon.json文件修改存储引擎,并重启docker才生效。格式如下:
如果修改了正在运行的docker存储引擎类型,重启之后现有的镜像和容器将不可用,因为存的位置是不一样的,通常在/var/lib/docker//…目录下。只有切换到原来引擎才可使用,或者 将镜像上传到镜像仓库,切换引擎后重新下载。选择引擎推荐清单如下(请查阅最新的清单)。
Device Mapper驱动配置
如果您选用的是Device Mapper驱动,需要设置direct-lvm,因为默认设置的模式为loopbac mounted sparse file ,性能很慢。设置内容如下
原因 这种设置通过裸块设备(Raw Blow Device)的lvm精简池可获取更好的性能。这种设置的限制:这种方式只能配置在一个块设备。且只能在第一次安装后生效,以后可能会改变。(以后看看linux内核再来思考这块)。