天天看點

Docker學習筆記4 -- Dockerfile

Dockerfile自定義鏡像

常見的鏡像在DockerHub就能找到,但是我們自己寫的項目就必須自己建構鏡像了。

而要自定義鏡像,就必須先了解鏡像的結構才行。

鏡像結構

鏡像是将應用程式及其需要的系統函數庫、環境、配置、依賴打包而成。

我們以MySQL為例,來看看鏡像的組成結構:

簡單來說,鏡像就是在系統函數庫、運作環境基礎上,添加應用程式檔案、配置檔案、依賴檔案等組合,然後編寫好啟動腳本打包在一起形成的檔案。

我們要建構鏡像,其實就是實作上述打包的過程。

Dockerfile文法

建構自定義的鏡像時,并不需要一個個檔案去拷貝,打包。

我們隻需要告訴Docker,我們的鏡像的組成,需要哪些BaseImage、需要拷貝什麼檔案、需要安裝什麼依賴、啟動腳本是什麼,将來Docker會幫助我們建構鏡像。

而描述上述資訊的檔案就是Dockerfile檔案。

Dockerfile就是一個文本檔案,其中包含一個個的指令(Instruction),用指令來說明要執行什麼操作來建構鏡像。每一個指令都會形成一層Layer。是以每一條指令的内容,就是描述該層應當如何建構。

Docker學習筆記4 -- Dockerfile

更新詳細文法說明,請參考官網文檔: 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 .