Less Interests
More Interest
DockerFile是什么
DockerFile是用來構(gòu)建Docker鏡像的構(gòu)建文件朵夏,是由一系列命令和參數(shù)構(gòu)成的腳本碉京。
構(gòu)建一個鏡像
- 編寫Dockerfile文件
- docker build
- docker run
從dockerhub上可以看到DockerFile文件
以centos6.8為例
FROM scratch
MAINTAINER The CentOS Project <cloud-ops@centos.org>
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="2016-06-02"
# Default command
CMD ["/bin/bash"]
DockerFile構(gòu)建過程解析
1.DockerFile內(nèi)容基礎(chǔ)知識
- 每條保留字指令都必須為大寫且后面要跟隨至少一個參數(shù)(FROM ADD..)
- 指令按照從上到下起意,順序執(zhí)行
- .#代表注釋
- 每條指令都會創(chuàng)建一個新的鏡像層酥宴,并對鏡像進(jìn)行提交
2.Docker執(zhí)行DockerFile的大致流程
- docker從基礎(chǔ)鏡像運(yùn)行一個容器
- 執(zhí)行一條指令并對容器進(jìn)行修改
- 執(zhí)行類似docker commit的操作提交一個新的鏡像層
- 基于剛提交的鏡像運(yùn)行一個新的容器
- 執(zhí)行dockerfile中的下一條指令直到所有的指令都執(zhí)行完
從應(yīng)用軟件的角度來看锅论,Dockerfile倾哺,Docker鏡像,Docker容器分別代表軟件的三個不同階段:
?? - DockerFile是軟件的原材料
?? - Docker鏡像是軟件的交付品
?? - Docker容器則是軟件的運(yùn)行態(tài)
Dockerfile面向開發(fā)寇荧,Docker鏡像為交付標(biāo)準(zhǔn)举庶,Docker容器則是部署和運(yùn)維
DockerFile體系結(jié)構(gòu)(保留字指令)
- FROM:基礎(chǔ)鏡像,當(dāng)前鏡像是基于那個鏡像的
- MAINTAINER:鏡像維護(hù)者的姓名和郵箱地址
- RUN:容器構(gòu)建時需要運(yùn)行的容器
- EXPOSE:當(dāng)前容器對外暴露的端口號
- WORKDIR:指定在創(chuàng)建容器后揩抡,終端默認(rèn)登錄的工作目錄户侥,未指定則在根目錄
- ENV:用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量
??ENV MY_PATH=/user/mytest,WORKDIR $MY_PATH,默認(rèn)的登錄工作目錄就是/user/mytest- ADD:將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像并且自動處理URL和解壓tar壓縮包
- COPY:類似ADD峦嗤,拷貝文件和目錄到鏡像
??COPY src dest
??COPY ["src","dest"]- VOLUME:容器數(shù)據(jù)卷蕊唐,用于數(shù)據(jù)保存和持久化工作
- CMD:指定一個容器啟動時要運(yùn)行的命令
??CMD <命令>
??CMD ["可執(zhí)行文件","參數(shù)1","參數(shù)2"]
DockerFile中可以有多個CMD指令烁设,但是只有最后一個生效- ENTRYPOINT:指定一個容器啟動時要運(yùn)行的命令替梨,和CMD一樣,但是不會替換装黑,追加
- ONBUILD:當(dāng)構(gòu)建一個被繼承的DockerFile時運(yùn)行命令副瀑,父鏡像在被子鏡像繼承后父鏡像的onbuild被促發(fā)
案例
- Base鏡像(scratch):Docker Hub中99%的鏡像都是通過在base鏡像中安裝和配置需要的軟件構(gòu)建出來的
自定義鏡像mycentos
??1.編寫
???A.Hub默認(rèn)centos鏡像
???B.編寫DockerFile文件
FROM centos
ENV mypath /tmp
WORKDOR $mypath
RUN yum -y install vim
Run yum -y install net-tools
EXPOSE 80
CMD /bin/bash
???C.mycentos內(nèi)容DockerFile
??2.構(gòu)建:docker build -t 新鏡像名字:TAG .
??3.運(yùn)行:docker run -it 新鏡像名稱:TAG
??4.列出鏡像的變更歷史:docker history