①参数使用FROM:
指定基础镜像,所有构建的镜像都必须有一个基础镜像,且FROM 命令必须是 Dockerfile 的第一个命令
FROM[AS] 指定从一个镜像构建起一个新的镜像名字
FROM[:] [AS] 指定镜像的版本 Tag
示例:FROM mysql:5.0 AS database
MAINTAINER:
镜像维护人的信息
MAINTAINER
示例:MAINTAINER JarttoJartto@qq.com
RUN:
构建镜像时要执行的命令
RUN
示例:RUN [executable, param1, param2]
ADD:
将本地的文件添加复制到容器中去,压缩包会解压,可以访问网络上的文件,会自动下载
ADD
示例:ADD *.js /app 添加 js 文件到容器中的 app 目录下
COPY:
功能和 ADD 一样,只是复制,不会解压或者下载文件
CMD:
启动容器后执行的命令,和RUN 不一样,RUN 是在构建镜像是要运行的命令
当使用 docker run 运行容器的时候,这个可以在命令行被覆盖
示例:CMD [executable, param1, param2]
ENTRYPOINT:
也是执行命令,和CMD 一样,只是这个命令不会被命令行覆盖
ENTRYPOINT [executable, param1, param2]
示例:ENTRYPOINT [donnet, myapp.dll]
LABEL:为镜像添加元数据,key-value 形式
LABEL==...
示例:LABEL version=1.0 description=这是一个web应用
ENV:设置环境变量,有些容器运行时会需要某些环境变量
ENV一次设置一个环境变量
ENV===设置多个环境变量
示例:ENV JAVA_HOME /usr/java1.8/
EXPOSE:暴露对外的端口(容器内部程序的端口,虽然会和宿主机的一样,但是其实是两个端口)
EXPOSE
示例:EXPOSE 80
容器运行时,需要用 -p 映射外部端口才能访问到容器内的端口
VOLUME:指定数据持久化的目录,官方语言叫做挂载
VOLUME /var/log 指定容器中需要被挂载的目录,会把这个目录映射到宿主机的一个随机目录上,实现数据的持久化和同步
VOLUME [/var/log,/var/test.....] 指定容器中多个需要被挂载的目录,会把这些目录映射到宿主机的多个随机目录上,实现数据的持久化和同步
VOLUME /var/data var/log 指定容器中的 var/log 目录挂载到宿主机上的 /var/data 目录,这种形式可以手动指定宿主机上的目录
WORKDIR:设置工作目录,设置之后 ,RUN、CMD、COPY、ADD 的工作目录都会同步变更
WORKDIR
示例:WORKDIR /app/test
USER:指定运行命令时所使用的用户,为了安全和权限起见,根据要执行的命令选择不同用户
USER:[]
示例:USER test
ARG:设置构建镜像是要传递的参数
ARG[=]
ARG name=sss
更多操作,请移步官方使用文档[3]:
https://docs.docker.com/
最佳实践
在掌握 Docker 常规操作之后,我们很容易就可以打出自己想要的项目镜像。然而不同的操作打出的镜像也是千差万别。究竟是什么原因导致镜像差异,我们不妨继续探索。以下是在应用 Docker 过程中整理的最佳实践,请尽量遵循如下准则:
Require 明确:需要什么镜像。
步骤精简:变化较少的 Step 优先。
版本明确:镜像命名明确。
说明文档:整个镜像打包步骤可以重现。
总结
容器化技术必将是云时代不可或缺的技能之一,而Docker 只是沧海一粟。随之而来的还有集群容器管理 Kubernetes、Service Mesh 、Istio 等技术。打开 Docker 的大门,不断抽丝剥茧,逐层深入,你将感受到容器化的无穷魅力。