使用docker简单来说就三步:1.构建镜像、2.获取镜像、3.基于镜像启动容器。大多数人工作中可能只会用到两步,但真正学会docker第一步也是必不可少的!
构建镜像离不开
Dockerfile
,本文就来解析Dockerfile
中各种指令的作用。提示:本文基于本人使用经验编写,如有错误欢迎指正,附【官方Dockerfile参考文档】!
之前写过一个简单的实例,可以参考:Dockerfile构建Springboot镜像
基础作用:添加镜像的一些自定义说明,如:作者、时间、镜像描述等等一些自己觉得有必要的东西。
示例
示例中的key是自定义的,如如果你觉得
author.name
没必要,完全可以改成author
,这是完全自定义的。
# 作者名
LABEL author.name="DingDangDog"
# 作者邮箱
LABEL author.email="[email protected]"
# 项目名
LABEL project.name="cashbook-server"
# 项目版本
LABEL project.version="0.0.1"
# 项目描述
LABEL project.description="this project is cashbook's server"
基础作用:以某个镜像为基础,构建自定义镜像。如:FROM openjdk:8-jdk
:以openjdk
镜像的8-jdk
版本为基础。
高级使用:有时我们会发现一个Dockerfile
文件中有个多个FROM
指令,这既是高阶使用。使用多FROM指令可以完成多阶段编译,每一条FROM
指令都是一个构建阶段,多条FROM
就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中产生的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。
基础作用:设置环境变量。可以在编译时就设置一些环境变量的默认值,在镜像内部的容器中可以读到这些环境变量值,如现在大多数前端node项目使用的process.env.***
。
拓展:环境变量在启动容器的命令中也可以指定,并会覆盖构建脚本Dockerfile
中的默认值。如:docker run --env env=dev -d -p 8888:8080 balance
,其中--env env=dev
就是设置环境变量env
的值为dev
。
sh
脚本,常见用法是安装一些三方工具包,以拓展镜像支持的功能。如:以一个基本的linux镜像为基础,可以使用RUN
指令安装node
,使其具有node
环境,并支持node
相关指令。ADD
指令有重合部分。ENTRYPOINT [ "node", "./dist/main.js" ]
20M
,构建出来的镜像却有500M+
,这是因为镜像内不止有你放进去的jar
包,还包含jdk
等众多运行所需环境,甚至还有一些不必要的环境,这就需要你精通Docker
后再来优化了(或者使用其他优化过的基础镜像
)。