DockerFile基礎知識

weixin_33935777發表於2018-10-21

1.基礎知識

  • 每條保留字指令都必須為大寫字母且後面要跟至少一個引數(即不能只寫關鍵字然後不跟引數)
  • 指令按照從上到下,順序執行
  • 是註釋的意思

  • 每條指令都會建立一個新的映象層,並對映象進行提交

2.執行dockefile的大致流程

  • docker從基礎映象中執行一個容器
  • 執行一條指令並對容器做出修改
  • 執行類似docker commit的操作提交一個新的映象層
  • docker再基於剛提交的映象執行一個新容器
  • 執行dockerfile中的下一條指令直到所有指令都執行完成

3.指令介紹

  • FROM:基礎映象,當前新的映象是基於哪個已經存在的鏡象的
  • MAINTAINER:映象作者及其郵箱
  • RUN:容器構建時需要執行的命令
  • EXPOSE:暴露映象的埠號
  • WORKDIR:指定在建立容器後,終端預設登入進來的工作目錄,一個落腳點
  • ENV:用來在構建映象過程中設定環境變數
  • ADD:將宿主機目錄下的檔案拷貝進映象且ADD命令會自動處理URL和解壓tar壓縮包
  • COPY:跟ADD類似,拷貝檔案和目錄到映象中
  • VOLUME:容器資料卷,用於資料儲存和持久化工作
  • CMD:指定一個容器啟動時要執行的命令,dockefile可以有多個cmd指令,但只有最後一個生效,cmd會被docker run之後的引數替換
  • ENTRYPOINT:指定一個容器啟動時要執行的命令,和CMD的目的一樣,都是在指定容器啟動程式及引數
  • ONBUILD:當構建一個被繼承的dockefile時執行命令,父映象在被子繼承後父映象的onbuild被觸發

4.案例

4.1 Base映象

<b>scratch</b>: Docker中99%的映象都是通過在base映象中安裝配置構建成的

4.2 編寫dockefile檔案

# 命令列
flynngod@flynngod:~/FlynnGod/Code/DockerDir$ cat Dockerfile 
# 基於哪個映象製作的新映象
# 如果是空的映象,則寫scratch
FROM python
# 作者資訊
MAINTAINER MoonMonsters qxinhai@yeah.net
# 設定環境變數
ENV MAIN_PATH /usr/local
# 當啟動容器時,在shell終端中預設進入的目錄
WORKDIR $MAIN_PATH
# 執行命令
RUN pip install flask
# 容器暴露給宿主機的埠
EXPOSE 80
# CMD命令,從上往下依次執行
CMD echo $MAIN_PATH
CMD echo "build success..."
# 列印pip版本
CMD echo pip -V
# 列印python版本
CMD echo python -V
當啟動容器時,預設開啟shell終端
CMD /bin/bash

4.3 執行dockerfile檔案,建立映象

[圖片上傳失敗...(image-ee8b95-1540119959172)]
具體解釋:
(1)編譯映象命令,-t後面的是生成的映象的名稱以及TAG;有個問題有點在意,編譯的路徑需要是目錄名稱,然後自動在該目錄下尋找Dockfile名稱的檔案自動編譯。
(2)編譯步驟,就是在Dockefile檔案中的程式碼順序。
(3)會執行pip install flask命令,然後從網上或者快取中下載,由於之前測試過了,所以這步中它自動從快取中載入了。
(4)編譯成功提示。
(5)使用docker images檢視已經建立好的映象。

4.4 由映象建立容器

flynngod@flynngod:~/FlynnGod/Code/DockerDir$ docker run -it --name=mypython customer_python:v2
root@e6e67c899b38:/usr/local# python
Python 3.7.0 (default, Oct 16 2018, 07:10:55) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
# flask確實已經下載完成
>>> flask.__version__
'1.0.2'