1. FROM
1.1. 指令
FROM <镜像名称>
1.2. 描述
Dockerfile 构建镜像是以一个镜像为基础,在其上进行定制修改后产生的一个符合需求的新镜像。FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
最基础的镜像就是操作系统镜像。在操作系统镜像的基础上安装配置需要的组件服务,有非常灵活的定制化空间。在 Docker Hub 常用的基础镜像例如:ubuntu、debian、centos、fedora、alpine 、busybox 等。这里 apline 和 busybox 是非常小的一个操作系统发行版,原始大小几 M,在某些场景下非常的适合。
开发环境或服务运行环境的镜像。一些方便开发、构建、运行各种语言应用的镜像,如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。一般情况下,官方定制的环境镜像都是比较精简的,有需要时建议优先使用官方发布的基础镜像。
提供服务功能的服务镜像。如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;可以直接用来运行一定的服务,便于开发调试。注意,一些数据库服务例如 MySQL 镜像本身是没有高可用的,在生产环境中使用时需要进行改造。
除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如 swarm、etcd 等。
对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。
1.3. 示例
FROM centos