1.基礎(chǔ)知識
- 每條保留字指令都必須為大寫字母且后面要跟至少一個參數(shù)(即不能只寫關(guān)鍵字然后不跟參數(shù))
- 指令按照從上到下,順序執(zhí)行
-
是注釋的意思
- 每條指令都會創(chuàng)建一個新的鏡像層,并對鏡像進(jìn)行提交
2.執(zhí)行dockefile的大致流程
- docker從基礎(chǔ)鏡像中運(yùn)行一個容器
- 執(zhí)行一條指令并對容器做出修改
- 執(zhí)行類似docker commit的操作提交一個新的鏡像層
- docker再基于剛提交的鏡像運(yùn)行一個新容器
- 執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
3.指令介紹
- FROM:基礎(chǔ)鏡像,當(dāng)前新的鏡像是基于哪個已經(jīng)存在的鏡象的
- MAINTAINER:鏡像作者及其郵箱
- RUN:容器構(gòu)建時需要執(zhí)行的命令
- EXPOSE:暴露鏡像的端口號
- WORKDIR:指定在創(chuàng)建容器后,終端默認(rèn)登錄進(jìn)來的工作目錄,一個落腳點
- ENV:用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量
- ADD:將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像且ADD命令會自動處理URL和解壓tar壓縮包
- COPY:跟ADD類似,拷貝文件和目錄到鏡像中
- VOLUME:容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
- CMD:指定一個容器啟動時要執(zhí)行的命令,dockefile可以有多個cmd指令,但只有最后一個生效,cmd會被docker run之后的參數(shù)替換
- ENTRYPOINT:指定一個容器啟動時要執(zhí)行的命令,和CMD的目的一樣,都是在指定容器啟動程序及參數(shù)
- ONBUILD:當(dāng)構(gòu)建一個被繼承的dockefile時運(yùn)行命令,父鏡像在被子繼承后父鏡像的onbuild被觸發(fā)
4.案例
4.1 Base鏡像
<b>scratch</b>: Docker中99%的鏡像都是通過在base鏡像中安裝配置構(gòu)建成的
4.2 編寫dockefile文件
# 命令行
flynngod@flynngod:~/FlynnGod/Code/DockerDir$ cat Dockerfile
# 基于哪個鏡像制作的新鏡像
# 如果是空的鏡像,則寫scratch
FROM python
# 作者信息
MAINTAINER MoonMonsters qxinhai@yeah.net
# 設(shè)置環(huán)境變量
ENV MAIN_PATH /usr/local
# 當(dāng)啟動容器時,在shell終端中默認(rèn)進(jìn)入的目錄
WORKDIR $MAIN_PATH
# 執(zhí)行命令
RUN pip install flask
# 容器暴露給宿主機(jī)的端口
EXPOSE 80
# CMD命令,從上往下依次執(zhí)行
CMD echo $MAIN_PATH
CMD echo "build success..."
# 打印pip版本
CMD echo pip -V
# 打印python版本
CMD echo python -V
當(dāng)啟動容器時,默認(rèn)打開shell終端
CMD /bin/bash
4.3 執(zhí)行dockerfile文件,創(chuàng)建鏡像
[圖片上傳失敗...(image-ee8b95-1540119959172)]
具體解釋:
(1)編譯鏡像命令,-t后面的是生成的鏡像的名稱以及TAG;有個問題有點在意,編譯的路徑需要是目錄名稱,然后自動在該目錄下尋找Dockfile名稱的文件自動編譯。
(2)編譯步驟,就是在Dockefile文件中的代碼順序。
(3)會執(zhí)行pip install flask命令,然后從網(wǎng)上或者緩存中下載,由于之前測試過了,所以這步中它自動從緩存中加載了。
(4)編譯成功提示。
(5)使用docker images查看已經(jīng)創(chuàng)建好的鏡像。
4.4 由鏡像創(chuàng)建容器
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確實已經(jīng)下載完成
>>> flask.__version__
'1.0.2'