## 1、简介
Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本
Dockerfile从FROM命令开始,紧接着各种命令、参数等,最终会生成一个新的镜像
使用Dockerfile构建镜像的步骤:
a、编写Dockerfile文件
b、使用docker build构建镜像
c、使用docker run运行容器
## 2、用法
### 2.1、语法规则
* 指令必须要大写,且后面必须跟参数
* 第一条指令必须是FROM,指定Base Image 基础镜像
* 指令按从上往下的顺序,依次执行
* 每条指定都会创建一个新的镜像层并提交
* # 表示注释
### 2.2、常用指令
| 指令 | 解释 |
| --- | --- |
| FROM | 指定基础镜像,即当前新镜像是基于哪个镜像的 |
| MAINTAINER | 指定作者 |
| RUN | 指定构建过程中要运行的命令 |
| ENV | 设置环境变量 |
| WORKDIR | 指定默认的工作目录,即进入容器后默认进入的目录 |
| VOLUME | 创建挂载点,也称容器数据卷,用于数据共享和持久化 |
| CMD | 指定容器启动时要运行的命令,与RUN不同的是,这些命令不是在镜像构建过程中执行的 |
| ENTRYPOINT | 指定容器启动时要运行的命令,与CMD有区别 |
| COPY | 拷贝文件/目录到镜像中 |
| ADD | 拷贝文件到镜像中,且会自动解压缩 |
| EXPOSE | 指定对外暴露的端口 |
## 3、案例
### 3.1 自定义centos镜像# 1.编写Dockerfile文件
```
vi Dockerfile2
FROM centos
MAINTAINER yuanke.com
ENV MYPATH /usr/local/centos
RUN mkdir -p $MYPATH
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install wget
# 创建挂载点,无法指定宿主机上对应的目录,是自动生成的
VOLUME ["/data1","/data2"]
CMD ["/bin/bash"]
# 2.使用docker build构建镜像
docker build -f Dockerfile2 -t itany/centos:v1 .
# 3.使用docker run运行容器
docker run -it b25b1dad795c
# 查看镜像的变更历史
docker history b25b1dad795c
# 验证挂载点:
/var/lib/docker/volumes/0b001b4cc8db1ebbbb4c537c17a5c44adb700fb0e1b941bc82cc717c4ae196f 6/_data
/var/lib/docker/volumes/f020f5a5664bf68312be9f49a640f27ecfb49990b231aaf3d0eb7cb723fa0dd d/_data
```
CMD和ENTRYPOINT的区别:
* CMD
在Dockerfile中可以有多个CMD指令,但只有最后一条指令生效,所以一般只有一条CMD指令
CMD指令在被docker run之后的参数覆盖
```
vi aaa
FROM centos
CMD ["/bin/ls"]
CMD ["/bin/bash"]
docker build -f aaa -t itany/aaa .
docker run -it itany/aaa docker run it itany/aaa /bin/pwd
```
* ENTRYPOINT
docker run之后的参数会被作为ENTRYPOINT指令的参数,组合形成新的命令
```
vi bbb
FROM centos
ENTRYPOINT ["/bin/ls","/usr/local"]
docker build -f bbb -t itany/bbb .
docker run -it itany/bbb
docker run -it itany/bbb -l # ls /usr/local -l
```
### 3.2、自定义tomcat镜像
```
# 准备工作
# 1.编写Dockerfile文件
vi Dockerfile
FROM centos MAINTAINER yuanke@163.com
# 拷贝文件,文件必须与Dockerfile在同一目录下
COPY teacher.txt /usr/local
ADD jdk8u171linuxx64.tar.gz /usr/local
ADD apachetomcat8.5.30.tar.gz /usr/local
# 配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH .:$JAVA_HOME/lib
ENV CATALINA_HOME /usr/local/apachetomcat8.5.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
WORKDIR $CATALINA_HOME RUN
yum -y install vim
EXPOSE 8080
CMD ["catalina.sh", "run"]
# 2.使用docker build构建镜像
docker build t itany/tomcat:1.0 .
# 3.使用docker run运行容器
docker run \
--name mytomcat \
-p 8080:8080 \
-v /my/tomcat/webapps/springweb.war:/usr/local/apachetomcat8.5.30/webapps/spring web.war \
-d itany/tomcat:1.0
```