邯鄲建設網站軟考十大最靠譜it培訓機構
Dockerfile
- 1. 構建過程解析
- 2. Dockerfile常用保留字指令
- 3. 案例
- 3.1. 自定義鏡像mycentosjava8
- 3.2. 虛懸鏡像
- 4. Docker微服務實戰(zhàn)
dockerfile是用來構建docker鏡像的文本文件,是由一條條構建鏡像所需的指令和參數(shù)構成的腳本。
dockerfile定義了進程需要的一切東西,涉及的內容包括執(zhí)行代碼或者是文件、環(huán)境變量、依賴包、運行時環(huán)境、動態(tài)鏈接庫、操作系統(tǒng)的發(fā)行版、服務進程和內核進程(當應用進程需要和系統(tǒng)服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;
官網:https://docs.docker.com/engine/reference/builder/
UnionFS(聯(lián)合文件系統(tǒng)): Unin文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下(unite several directories into a sindle virtual flesystem)。 Union文件系統(tǒng)是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
1. 構建過程解析
構建三步驟:
- 編寫dockerfile文件
- docker build命令構建鏡像
- docker run依鏡像運行容器實例
基礎知識:
- 每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數(shù)
像圖中這種ADD,ENV,COPY等就叫保留字指令
- 指令按照從上到下,順序執(zhí)行
- #表示注釋
- 每條指令都會創(chuàng)建一個新的鏡像層并對鏡像進行提交
docker 執(zhí)行 dockerfile 的大致流程:
- docker從基礎鏡像運行一個容器
- 執(zhí)行一條指令修改容器
- 執(zhí)行類似docker commit的操作提交一個新的鏡像層
- docker再基于剛提交的鏡像運行一個新容器
- 執(zhí)行dockerfile中的下一條指令直到所有指令執(zhí)行完成
- docker commit 提交容器副本使之成為一個新的鏡像:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要創(chuàng)建的目標鏡像名:[標簽名]
使用dockerfile構建docker鏡像,再用鏡像生成容器
2. Dockerfile常用保留字指令
參考tomcat8的Dockerfile入門 https://github.com/docker-library/tomcat/blob/master/9.0/jdk8/corretto-al2/Dockerfile
- FROM
基礎鏡像,當前新鏡像是基于哪個鏡像的,指定一個已經存在的鏡像作為模板,第一條必須是from
如.
- MAINTAINER
鏡像維護者的姓名和郵箱地址
- RUN
容器構建時需要運行的命令,在 docker build時運行
有兩種格式:
- shell格式
RUN <命令行命令>
命令行命令等同于在終端操作的shell命令
例: RUN yum -y install vim
- exec格式
RUN [“可執(zhí)行文件”,“參數(shù)1",“參數(shù)2”]
例:RUN [“./test.php”,“dev”,“offline”] ,等價于 RUN ./test.php dev offline
如.
- EXPOSE
當前容器對外暴露出的端口
- WORKDIR
指定在創(chuàng)建容器后,終端默認登錄進來的工作目錄,一個落腳點
如上圖這個/,就是默認的工作目錄
如.
- USER
指定該鏡像以什么樣的用戶去執(zhí)行,如果都不指定,默認是root
- ENV
用來在構建鏡像過程中設置環(huán)境變量
ENV MY_PATH /usr/mytest
這個環(huán)境變量可以在后續(xù)的任何RUN指令中使用,如同在命令前指定了環(huán)境變量前綴一樣,也可以在其他指令中直接使用這些環(huán)境變量
例:WORKDIR $MY_PATH 指定了登錄后的默認工作目錄為/usr/mytest
如.
- VOLUME
容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
- ADD
將宿主機目錄下的文件拷貝進鏡像且會自動處理URL和解壓tar壓縮包
相比于COPY命令多了個解壓功能
- CMD
指定容器啟動后的要干的事情,與RUN的區(qū)別是CMD時在docker run時運行
CMD指令的格式和RUN相似,也是兩種格式:
- shell格式:CMD <命令>
- exec格式:CMD [“可執(zhí)行文件”,“參數(shù)1",“參數(shù)2” …]
- 參數(shù)列表模式:CMD [“參數(shù)1",“參數(shù)2” …] 在指定了ENTRYPOINT指令后,用CMD指定具體的參數(shù)
Dockerfile中可以有多個CMD指令,但只有最后一個生效,CMD會被docker run之后的參數(shù)替換
如.
- ENTRYPOINT
格式:ENTRYPOINT [“”,“”,“”,…]
也是用來指定一個容器啟動時要運行的命令
類似于CMD指令,但是ENTRYPOINT不會被docker run 后面的命令覆蓋,而且這些命令行參數(shù)會被當作參數(shù)送給ENTRYPOINT指令指定的程序
ENTRYPOINT可以和CMD一起用,一般是變參才會使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參。
當指定了ENTRYPOINT后,CMD的含義就發(fā)生了變化,不再是直接運行其命令而是將CMD的內容作為參數(shù)傳遞給ENTRYPOINT指令,他兩個組合會變成"<ENTRYPOINT>"<CMD>"
3. 案例
3.1. 自定義鏡像mycentosjava8
centos7鏡像具備vim+ifconfig+jdk8
- 創(chuàng)建文件夾myfile,將jdk壓縮包傳到當前目錄下
jdk壓縮包要與Dockerfile文件在同一目錄下
- 創(chuàng)建Dockerfile文件,編輯內容]
Dockerfile文件中的D一定是大寫
FROM centos:7
MAINTAINER zy<2351950143@qq.com>ENV MYPATH /usr/local
WORKDIR $MYPATH#安裝vim編輯器
RUN yum -y install vim
#安裝ifconfig命令查看網絡IP
RUN yum -y install net-tools
#安裝java8及l(fā)ib庫
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把jdk-8u341-linux-x64.tar.gz添加到容器中,安裝包必須要和Dockerfile文件在同一位置
ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/
#配置java環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
- 構建鏡像
最后有一個點別忘了
docker build -t centosjava8:1.0 .
構建完成:
查看創(chuàng)建的鏡像:
- 運行鏡像
docker run -it 鏡像ID /bin/bash
3.2. 虛懸鏡像
倉庫名和版本號都為none的就是虛懸鏡像
查看所有的虛懸鏡像
docker image ls -f dangling=true
刪除所有虛懸鏡像
docker image prune
4. Docker微服務實戰(zhàn)
- 新建一個普通微服務模塊
端口為6001,只有一些簡單的接口
本機測試沒問題
打包并把他放進虛擬機目錄里
- 通過dockerfile發(fā)布微服務部署到docker容器
編寫Dockerfile文件:
# 基礎鏡像使用java
FROM java:8
# 作者
MAINTAINER zy
# VOLUME 指定臨時文件目錄為/tmp,在主機/var/lib/docker目錄下創(chuàng)建了一個臨時文件并鏈接到容器的/tmp
VOLUME /tmp
# 將jar包添加到容器中并更名為zy_docker.jar
ADD docker_test-0.0.1-SNAPSHOT.jar zy_docker.jar
# 運行jar包
RUN bash -c 'touch /zy_docker.jar'
ENTRYPOINT ["java","-jar","/zy_docker.jar"]
# 暴露6001端口
EXPOSE 6001
構建:
別忘了最后的點
docker build -t zy_docker:1.1 .
運行容器:
docker run -d -p 6001:6001 661bf8447553
測試: