老的方案
在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式:
1、全部放入一个 Dockerfile
一种方式是将所有的构建过程编包含在一个 Dockerfile
中,包括编译、测试、打包等流程,这样做的缺点是 Dockerfile
非常大,可维护性低,镜像层次多,镜像体积较大,部署时间变长,且存在源码泄漏风险。
2、分散到多个 Dockerfile
另一种方式,就是我们事先在一个 Dockerfile
将项目及其依赖库编译测试打包好后,再将其拷贝到运行环境中,这种方式需要我们编写两个 Dockerfile
和一些编译脚本才能将其两个阶段自动整合起来,这种方式虽然可以很好地规避第一种方式存在的风险,但明显部署过程较复杂。
使用多阶段构建
为解决以上问题,Docker v17.05 开始支持多阶段构建 (multistage builds)。
使用多阶段构建我们就可以很容易解决前面提到的问题,并且只需要编写一个 Dockerfile
。
具体实践可以参考微服务实战中的 Dockerfile 多阶段构建教程。
其它制作镜像的方式
1、从 rootfs 压缩包导入
docker import [选项] <文件>|<URL>|- [<仓库名>[:<标签>]]
docker import http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz openvz/ubuntu:14.04
2、docker save 和 docker load
Docker 还提供了 docker save
和 docker load
命令,用以将镜像保存为一个 tar
文件, 然后传输到另一个位置上,再加载进来。(有了 Docker Registry 之后不再推荐这种方式)