# dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
# 官网 (opens new window)
构建三步骤
- 编写Dockerfile文件
- docker build命令构建镜像
- docker run依镜像运行容器实例
# 命令
# FROM
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
语法:FROM 镜像名:标签名
FROM centos:7
# MAINTAINER
镜像维护者的姓名和邮箱地址
# RUN
容器构建时需要运行的命令 两种格式
# shell
- RUN yum -y install vim
- RUN echo $HELLOWORLD > a.txxt
# exec
# EXPOSE
当前容器对外暴露出的端口
暴露80端口
EXPOSE 80
# WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,如果目录不存在则自动创建 用法:WORKDIR 目录
WORKDIR /a
# USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是root
# ENV
用来在构建镜像过程中设置环境变量
用法:ENV 变量名 = "变量值"
ENV DIR="/root"
演示案例:
- dockerfile
FROM centos:7
ENV HELLOWORLD="helloworld"
CMD echo $HELLOWORLD
- 部署,构建,运行,替换命令
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"]
# 注意点:
CMD["命令1","参数1","参数2"]
这种方式不会解析环境变量,要想解析使用这种语法
CMD["sh","-c","echo $HOME"]
CMD echo $HOME
$HOME 是环境变量,这种方式可以解析
# ENTRYPOINT
也是用来指定一个容器启动时要运行的命令
类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
命令格式:ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成
# 快速入门
# 使用 dockerfile 创建hello world,并运行打印
- 创建dockerfile(不需要一定叫doclerfile)
vim helloword
- 写入命令
FROM centos:7
CMD ["echo","HELLO WORLD"]
- 构建 注意有个。,。的意思表示当前路径
- -t:启动之后的容器名称
- -f: 指定dockerfile
docker build -t hello:1.0 -f helloword .
- 运行 页面打印出helloworld
docker run hello:1.0