1. 程式人生 > 其它 >Docker(44)- 初識 Dockerfile

Docker(44)- 初識 Dockerfile

Dockerfile

  • Dockerfile 是 Docker 中用於定義映象自動化構建流程的配置檔案
  • 在 Dockerfile 中,包含了構建映象過程中需要執行的命令和其他操作
  • 它可以明確設定 Docker 映象的製作過程,幫助我們在容器體系下能夠完成自動構構建

使用 Dockerfile 構建映象的步驟

  1. 編寫一個 dockerfile 檔案
  2. docker build 構建成為一個映象
  3. docker run 執行映象
  4. docker push 釋出映象(DockerHub 、阿里雲倉庫)

為什麼要用 Dockerfile

  • Dockerfile 是面向開發的,以後要釋出專案,做映象,就需要編寫 dockerfile 檔案
  • Docker 映象逐漸成企業交付的標準,必須要掌握!
  • DockerFile 構建映象檔案,定義了一切的步驟,原始碼
  • Dockerfile 的體積小,容易進行快速遷移部署
  • 環境構建流程記錄在 Dockerfile 中,能夠直觀的看到映象構建的順序和邏輯
  • Docker Images 通過 DockerFile 構建生成的映象,最終釋出和執行產品
  • Docker 容器,映象執行起來提供服務

Dockerfile 構建過程

  1. 每個保留關鍵字(指令)都是必須是大寫字母
  2. 執行從上到下順序
  3. #表示註釋
  4. 每一個指令都會建立提交一個新的映象,並提交

簡單的 Dockerfile 栗子

編寫 dockerfile 檔案

在任意目錄建立一個 dockerfile 檔案,輸入以下命令

# 構建一個基於ubuntu的docker定製映象
# 基礎映象
FROM ubuntu

# 映象作者
MAINTAINER my_name [email protected]

# 執行命令
## 換成國內的軟體源
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 

## 安裝nginx
RUN apt update >/dev/null 2>&1 RUN apt install nginx -y >/dev/null 2>&1 # 暴露對外埠 EXPOSE 80

執行 docker build

docker build --network=host -t ubuntu-nginx:v1 . 

映象的構建過程

[user@centos8 nginx]$ docker build --network=host -t ubuntu-nginx:v1 .
# 將上下文求傳送給Docker引擎
Sending build context to Docker daemon   2.56kB
# 下載依賴的映象
Step 1/7 : FROM ubuntu
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
# 生成映象 1d622ef86b13
 ---> 1d622ef86b13
Step 2/7 : MAINTAINER my_name [email protected]
# 執行容器 4eec6e3094f0,在容器內執行上面的這個命令,標記維護者資訊
 ---> Running in 4eec6e3094f0
# 移除臨時容器 4eec6e3094f0
Removing intermediate container 4eec6e3094f0
# 生成映象 6679d1c204e3
 ---> 6679d1c204e3
Step 3/7 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 執行容器84d38c20d8c4,在容器內執行上面的這個命令,更換軟體源記錄
 ---> Running in 84d38c20d8c4
# 移除臨時容器 84d38c20d8c4
Removing intermediate container 84d38c20d8c4
# 生成映象 83f29f7b055a
 ---> 83f29f7b055a
Step 4/7 : RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 執行容器 763e4493d93f, 在容器內執行上面的這個命令,更換軟體源記錄
 ---> Running in 763e4493d93f
# 移除臨時容器 763e4493d93f
Removing intermediate container 763e4493d93f
# 生成映象 6297f20605d9
 ---> 6297f20605d9
Step 5/7 : RUN apt update >/dev/null 2>&1
# 執行容器 2665a7e5a2e9,在容器內執行上面的這個命令, 更新軟體源快取
 ---> Running in 2665a7e5a2e9
# 移除臨時容器 2665a7e5a2e9
Removing intermediate container 2665a7e5a2e9
# 生成映象 fdfed940ca4d
 ---> fdfed940ca4d
Step 6/7 : RUN apt install nginx -y >/dev/null 2>&1
# 執行 容器 722a9a544643,在容器內執行上面的這個命令, 安裝nginx
 ---> Running in 722a9a544643
# 移除臨時容器 722a9a544643
Removing intermediate container 722a9a544643
# 生成映象 6ee76f7df9e5
 ---> 6ee76f7df9e5
Step 7/7 : EXPOSE 80
# 執行容器 a12ed3216ee0,在容器內執行上面的這個命令, 暴露80埠
 ---> Running in a12ed3216ee0
# 移除臨時容器 a12ed3216ee0
Removing intermediate container a12ed3216ee0
# 生成最終的映象 7cf64279ba98
 ---> 7cf64279ba98
Successfully built 7cf64279ba98
# 將這個映象標記命名 ubuntu-nginx 版本號v1
Successfully tagged ubuntu-nginx:v1

Dockerfile 就是將在檔案中書寫的構建指令,一層一層從 FROM 指定的基礎映象使用臨時容器過渡,逐層疊加起來最終生成目標映象

使用 docker history 檢視映象歷史

[user@centos8 nginx]$ docker history ubuntu-nginx:v1
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
7cf64279ba98        21 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B
6ee76f7df9e5        21 minutes ago      /bin/sh -c apt install nginx -y >/dev/null 259.2MB
fdfed940ca4d        21 minutes ago      /bin/sh -c apt update >/dev/null 2>&1           21.4MB
6297f20605d9        21 minutes ago      /bin/sh -c sed -i 's/security.ubuntu.com/mir…   2.76kB
83f29f7b055a        21 minutes ago      /bin/sh -c sed -i 's/archive.ubuntu.com/mirr…   2.76kB
6679d1c204e3        21 minutes ago      /bin/sh -c #(nop)  MAINTAINER my_name myemai…   0B
1d622ef86b13        2 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           2 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>           2 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   811B
<missing>           2 weeks ago         /bin/sh -c [ -z "$(apt-get indextargets)" ]     1.01MB
<missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:a58c8b447951f9e30…   72.8MB

Dockerfile 的結構

Dockerfile 主要包含四部分內容:

  1. 基礎映象資訊
  2. 維護者資訊
  3. 映象操作指令
  4. 容器啟動時指令

可以將 Dockerfile 理解為一個由上往下執行指令的指令碼檔案

當呼叫構建命令,通過 Dockerfile 構建映象時,Docker 會按照指令順序進行對應的操作

簡單的 Dockerfile 栗子二

FROM centos:latest
MAINTAINER polo

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end----"
CMD /bin/bash

執行 docker build

docker build -f test.dockerfile  -t test .

檢視映象和容器