從本文開始,咱們將介紹docker的另外一個技術點:dockerfile.我們來看看DockerFile相關的知識點,我們將怎麼學習?
1:DockerFile是什麼?
2:DockerFile構建過程解析
3:常用的保留字指令
4:案例及小總結。如下圖:
dockerFile是什麼?
DockerFile是用來構建Docker鏡像的文本文件。是由一條條構建鏡像所需要的指令和參數構成的腳本。
dockerFile工作圖:
構建步驟:
編寫DockerFile文件>>docker build命令構建鏡像>>docker run 鏡像運行
DcokerFile構建過程
1:DockerFile內容基礎知識
a、每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
b、指令按照從上到下的順序執行
c、#表示註釋
d、每條指令都會創建一個新的鏡像層並對鏡像進行提交
Dcoker執行DockerFile的大致流程
1:docker從基礎鏡像運行一個容器
2:執行一條指令並對容器做出修改
3:執行類似docker commit的操作提交一個新的鏡像層
4:docker再基於剛提交的鏡像運行一個新容器
5:執行dockerFile中的下一條執行直到所有指令都執行完成。
DockerFile、Docker鏡像與Docker容器之間的關係:
從應用軟件的角度來看,這三者分別代表了軟件的三個不同階段:
Dockerfile:是軟件的原材料;
Docker鏡像:是軟件的交付產品;
Docker容器則可以認爲是軟件鏡像的運行狀態,也就是依照鏡像運行的容器實例。
DockerFile是面向開發,Docker鏡像成爲交付的標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當了docker體系的基石。
DockerFile:需要定義餓Dockerfile,Dockerfile定義二了進程需要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時候環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程等等;
Docker鏡像,在用Dockerfile定義一個文件之後,docker build時候會產生一個Docker鏡像,當運行Docker鏡像時會真正開始提供服務;
Docker容器,容器是直接提供服務的。
接着,咱們來講解DockerFile常用的保留指令。常用的指令如下圖:
參數說明:
參數 |
說明 |
備註 |
FROM |
基礎鏡像。當前新鏡像是基於哪個鏡像的,指定一個已經存在的鏡像作爲模板。第一條必須是from |
出現位置:一般都是在dockerfile的第一行。 當前鏡像哪個基礎鏡像 |
MAINTAINER |
鏡像維護者的姓名和郵箱地址 |
|
RUN |
shell格式: RUN<命令行命令> #<命令行命令>等同於,在終端操作的shell命令。 例如:RUN yum -y install vim exec格式: RUN["可執行文件","參數1","參數2"] #例如: #RUN ["./test.php","dev","offline"] 等價於 RUN ./test.php dev offline |
|
EXPOSE |
當前容器隊尾暴露出的端口 |
|
WORKDIR |
指定在創建容器後,終端默認登錄的進入工作目錄。一個落腳點 |
例如: docker -it ubuntu bash 進入後,pwd.可以發現是 / 的 |
USER |
指定該鏡像以什麼樣的用戶去執行。如果不指定,默認是root |
|
ENV |
用來在構建鏡像過程中設置的環境變量 |
|
ADD |
將宿主機目錄下的文件拷貝進鏡像且會自動處理url和解壓tar壓縮包 |
|
COPY |
類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中<源路徑>的文件/目錄 複製到新的一層鏡像內的<目標路徑> |
|
VOLUME |
容器數據卷,用於數據保存和持久化工作 |
|
CMD |
見下文CMD命令 |
CMD和RUN命令的區別: CMD是在docker run時候運行的 RUN是在docker build是運行的 |
ENTRYPOINT |
見下文的ENTRYPOIN命令 |
CMD命令:
指定容器啓動後要乾的事情。
CMD啓動容器命令
CMD指令和RUN指令像是。也是兩種格式:shell 和exec.
注意:
Dockerfile中可以有多個cmd指令,但只有最後一個生效,CMD會被docker run之後的參數替換。可以參考官網Tomcat的dockerfile演示講解:
CMD會被docker run之後的參數替換演示:
我們啓動tomcat:
docker run -it -p 8080:8080 鏡像id
這種啓動後,訪問可以正常的。因爲這種啓動後,直接就是使用了tomcat的dockerfile中的
CMD["catalina.sh","run"]的
如果我們使用以下命令:
docker run -it -p 8080:8080 鏡像id /bin/bash
這個時候,通過瀏覽器訪問,就不行了。爲什麼呢?
因爲CMD會被docker run之後的參數替換
也就是dockerfile中的CMD["catalina.sh","run"]被替換成了CMD["/bin/bash","run"]了。/bin/bash替換了catalina.sh。這樣相當於tomcat沒啓動
CMD和RUN命令的區別:
CMD是在docker run時候運行的
RUN是在docker build是運行的
ENTRYPOINT命令
ENTRYPOINT命令格式:
總結:
大家好,我是凱哥Java(kaigejava),樂於分享,每日更新技術文章,歡迎大家關注“凱哥Java”,及時瞭解更多。讓我們一起學Java。也歡迎大家有事沒事就來和凱哥聊聊~~~
結束語
如操作有問題歡迎去 我的 個人博客(www.kaigejava.com)留言或者 微信公衆號(凱哥Java)留言交流哦。
本系列教程直通車
直通車,本系列教程已發佈文章,快速到達,《Docker學習系列》教程已經發布的內容如下:
【圖文教程】Windows11下安裝Docker Desktop
【填坑】在windows系統下安裝Docker Desktop後遷移鏡像位置
【Docker學習系列】Docker學習1-docker安裝
【Docker學習系列】Docker學習2-docker設置鏡像加速器
【Docker學習系列】Docker學習3-docker的run命令幹了什麼?docker爲什麼比虛擬機快?
【Docker學習系列】Docker學習2-常用命令之啓動命令和鏡像命令
【Docker學習系列】Docker學習系列3:常用命令之容器命令
【Docker學習系列】Docker學習4-常用命令之重要的容器命令
【Docker教程系列】Docker學習5-Docker鏡像理解
【Docker教程系列】Docker學習6-Docker鏡像commit操作案例
【Docker學習教程系列】7-如何將本地的Docker鏡像發佈到阿里雲
【Docker學習教程系列】8-如何將本地的Docker鏡像發佈到私服?
「Docker學習系列教程」10-Docker容器數據卷案例
docker高級篇1-dockeran安裝mysql主從複製
docker高級篇第二章-分佈式存儲之實戰案例:3主3從redis集羣擴容配置
docker高級篇第二章-分佈式存儲之實戰案例:主從容錯切換遷移案例
Docker高級:Redis集羣實戰!4主4從縮容到3主3從,怎麼處理?