Dockerfile自定義鏡像
常見的鏡像在DockerHub就能找到,但是我們自己寫的項目就必須自己建構鏡像了。
而要自定義鏡像,就必須先了解鏡像的結構才行。
鏡像結構
鏡像是将應用程式及其需要的系統函數庫、環境、配置、依賴打包而成。
我們以MySQL為例,來看看鏡像的組成結構:
簡單來說,鏡像就是在系統函數庫、運作環境基礎上,添加應用程式檔案、配置檔案、依賴檔案等組合,然後編寫好啟動腳本打包在一起形成的檔案。
我們要建構鏡像,其實就是實作上述打包的過程。
Dockerfile文法
建構自定義的鏡像時,并不需要一個個檔案去拷貝,打包。
我們隻需要告訴Docker,我們的鏡像的組成,需要哪些BaseImage、需要拷貝什麼檔案、需要安裝什麼依賴、啟動腳本是什麼,将來Docker會幫助我們建構鏡像。
而描述上述資訊的檔案就是Dockerfile檔案。
Dockerfile就是一個文本檔案,其中包含一個個的指令(Instruction),用指令來說明要執行什麼操作來建構鏡像。每一個指令都會形成一層Layer。是以每一條指令的内容,就是描述該層應當如何建構。

更新詳細文法說明,請參考官網文檔: https://docs.docker.com/engine/reference/builder
案例1
基于tomcat建立一個鏡像,裡面要有一個index.html,并寫入Hello Docker。
1、在主控端建立一空白目錄:
mkdir -p /usr/local/docker/demo1
2、在該目錄下,建立一檔案Dockerfile:
vim Dockerfile
3、其内容為:
FROM tomcat //指定tomcat最新版本鏡像
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html
這個Dockerfile很簡單,一共就兩行。涉及到了兩條指令,FROM和RUN。
4、建構鏡像
docker build -t demo1 .
-t :指定要建立的目标鏡像名
. :點代表Dockerfile檔案所在目錄,也就是目前目錄,可以指定Dockerfile的絕對路徑。
5、運作鏡像所在容器
docker run --rm --name demo1-8080 -p 8080:8080 -d demo1
通路浏覽器即可成功該問。
案例2
案例:基于上一個鏡像(基于tomcat)将ROOT内多餘的檔案都删除。隻保留index.html
1 基于如上修改Dockerfile
FROM tomcat //指定tomcat最新版本鏡像
WORKDIR /usr/local/tomcat/webapps/ROOT/ //切換到該目錄下
RUN rm -rf * //将目前目錄的檔案都删掉
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html
WORKDIR 用來切換工作目錄的。而不是用RUN。
2、 建構鏡像
docker build –t 鏡像名 . //Dockerfile上下文路徑
案例3
案例:基于上一個鏡像(基于tomcat)外部複制一個檔案(圖檔),并複制到容器中并能通路。
FROM tomcat //指定tomcat最新版本鏡像
WORKDIR /usr/local/tomcat/webapps/ROOT/ //切換到該目錄下
RUN rm -rf * //将目前目錄的檔案都删掉
COPY 1.png /usr/local/tomcat/webapps/ROOT/
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html
docker build –t 鏡像名 . //Dockerfile上下文路徑
案例4
使用docker部署springboot項目,首先将jar包複制到一個檔案夾裡邊。
1 cd到該目錄下
2 建立Dockerfile檔案
vim Dockerfile
FROM java:8
VOLUME /tmp
ADD boot-0.0.1-SNAPSHOT.jar exam.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/exam.jar"]
docker build -t bootdemo .