# dockerfile

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

# 官网 (opens new window)

构建三步骤

  • 编写Dockerfile文件
  • docker build命令构建镜像
  • docker run依镜像运行容器实例

# 命令

# FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
语法:FROM 镜像名:标签名

FROM centos:7

# MAINTAINER

镜像维护者的姓名和邮箱地址

# RUN

容器构建时需要运行的命令 两种格式

# shell

  1. RUN yum -y install vim
  2. RUN echo $HELLOWORLD > a.txxt RUN shell格式

# exec

exec 格式

# EXPOSE

当前容器对外暴露出的端口
暴露80端口

EXPOSE 80

# WORKDIR

指定在创建容器后,终端默认登陆的进来工作目录,如果目录不存在则自动创建 用法:WORKDIR 目录

WORKDIR /a

# USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

# ENV

用来在构建镜像过程中设置环境变量
用法:ENV 变量名 = "变量值"

ENV DIR="/root"

演示案例:

  1. dockerfile
FROM centos:7
ENV HELLOWORLD="helloworld"
CMD echo $HELLOWORLD
  1. 部署,构建,运行,替换命令
docker build -t env_test:1.1 -f helloword .  

docker run env_test:1.0

docker run -e HELLOWORLD=123  env_test:1.1

# ADD

在构建镜像时,将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
用法:ADD 原路径 目标路径
注:在本地ADD进入的tar压缩包,是会自动解压,但是通过网络流下载的tar包,是不会自动解压的

# COPY

类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

# VOLUME

容器数据卷,用于数据保存和持久化工作

# CMD

  • Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
  • 它和前面RUN命令的区别
    • CMD是在docker run 时运行。
    • RUN是在 docker build时运行。

语法:CMD["命令1","参数1","参数2"]

CMD ["echo","HELLO WORLD"]

# 注意点:

  1. CMD["命令1","参数1","参数2"] 这种方式不会解析环境变量,要想解析使用这种语法
    CMD["sh","-c","echo $HOME"]
  2. CMD echo $HOME $HOME 是环境变量,这种方式可以解析

# ENTRYPOINT

也是用来指定一个容器启动时要运行的命令
类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
命令格式:ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成
ENTRYPOINT 案例

# 快速入门

# 使用 dockerfile 创建hello world,并运行打印

  1. 创建dockerfile(不需要一定叫doclerfile)
vim helloword
  1. 写入命令
FROM centos:7
CMD ["echo","HELLO WORLD"]

  1. 构建 注意有个。,。的意思表示当前路径
  • -t:启动之后的容器名称
  • -f: 指定dockerfile
docker build -t hello:1.0 -f helloword .
  1. 运行 页面打印出helloworld
 docker run hello:1.0