## 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 jdk-8u171-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.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/apache-tomcat-8.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/spring-web.war:/usr/local/apache-tomcat-8.5.30/webapps/spring- web.war \ -
-d itany/tomcat:1.0
```