使用Dockerfile構建映象
有時候從Docker映象倉庫中下載的映象不能滿足要求,我們可以基於一個基礎映象構建一個自己的映象 兩種方式: 1.更新映象:使用 docker commit
命令 2.構建映象:使用 docker build
命令,需要建立Dockerfile檔案
更新映象
先使用基礎映象建立一個容器,然後對容器內容進行更改,然後使用 docker commit
命令提交為一個新的映象(以tomcat為例)。 1.根據基礎映象,建立容器 docker run --name mytomcat -p 80:8080 -d tomcat
2. 修改容器內容 docker exec -it mytomcat /bin/bash cd webapps/ROOT rm -f index.jsp echo hello world > index.html exit
3.提交為新映象 `docker commit -m=“描述訊息” -a="作者"容器ID或容器名 映象名:TAG# 例:
docker commit -m=“修改了首頁” -a=“華安” mytomcat huaan/tomcat:v1.0`
4.使用新映象執行容器 docker run --name tom -p 8080:8080 -d huaan/tomcat:v1.0
使用Dockerfile構建映象
什麼是Dockerfile? Dockerfile is nothing but the source code for building Docker images 1.Docker can build images automatically by reading the instructions from a Dockerfile 2.A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image 3.Using docker build users can create an automated build that executes several command- line instructions in succession dockerfile
Dockerfile格式 一、Format: 1.#Comment 2.INSTRUCTION arguments
二、The instruction isnot case-sensitive However,convention is for them to be UPPERCASE to distinguish them from arguments more easily
三、Docker runs instructions in a Dockerfile in order
四、The first instruction must be ‘FROM’ in order to specify the Base Image from which you are building
使用Dockerfile構建SpringBoot應用映象
一、準備 1.把你的springboot專案打包成可執行jar包 2.把jar包上傳到Linux伺服器
二、構建 1.在jar包路徑下建立Dockerfile檔案vi Dockerfile
指定基礎映象,本地沒有會從dockerHub pull下來
FROM java:8 #作者 MAINTAINER huaan
把可執行jar包複製到基礎映象的根目錄下
ADD luban.jar /luban.jar
映象要暴露的埠,如要使用埠,在執行docker run命令時使用-p生效
EXPOSE 80
在映象執行為容器後執行的命令
ENTRYPOINT [“java”,"-jar","/luban.jar"]
2.使用docker build命令構建映象,基本語法 docker build -t huaan/mypro:v1 .
`docker build -t huaan/mypro:v1 .
-f指定Dockerfile檔案的路徑
-t指定映象名字和TAG
.指當前目錄,這裡實際上需要一個上下文路徑實際上需要一個上下文路徑`
三、執行 執行自己的SpringBoot映象 docker run --name pro -p 80:80 -d 映象名:TAG
Dockerfile常用指令
1.FROM FROM指令是最重要的一個並且必須為Dockerfile檔案開篇的第一個非註釋行,用於為映象檔案構建過程指定基礎映象,後續的指令運行於此基礎映象提供的執行環境 這個基礎映象可以是任何可用映象,預設情況下docker build會從本地倉庫找指定的映象檔案,如果不存在就會從Docker Hub上拉取 語法:
FROMFROM: FROM@
2.MAINTAINER(depreacted) Dockerfile的製作者提供的本人詳細資訊 Dockerfile不限制MAINTAINER出現的位置,但是推薦放到FROM指令之後 語法: MAINTAINER <name>
name可以是任何文字資訊,一般用作者名稱或者郵箱
3.LABEL 給映象指定各種元資料 語法: LABEL <key>=<value> <key>=<value> <key>=<value>...
一個Dockerfile可以寫多個LABEL,但是不推薦這麼做,Dockerfile每一條指令都會生成一層映象,如果LABEL太長可以使用\符號換行。構建的映象會繼承基礎映象的LABEL,並且會去掉重複的,但如果值不同,則後面的值會覆蓋前面的值。
4.COPY 用於從宿主機複製檔案到建立的新映象檔案 語法: `COPY ... COPY ["",...""]
:要複製的原始檔或者目錄,可以使用萬用字元
:目標路徑,即正在建立的image的檔案系統路徑;建議使用絕對路徑,否則COPY指令則以WORKDIR為其起始路徑`
注意:如果你的路徑中有空白字元,通常會使用第二種格式規則: 1. <src>
必須是build上下文中的路徑,不能是其父目錄中的檔案 2.如果 <src>
是目錄,則其內部檔案或子目錄會被遞迴複製,但 <src>
目錄自身不會被複制 3.如果指定了多個 <src>
,或 <src>
中使用了萬用字元,則 <dest>
必須是一個目錄,則必須以/符號結尾. 4.如果 <dest>
不存在,將會被自動建立,包括其父目錄路徑
5.ADD 基本用法和COPY指令一樣,ADD支援使用TAR檔案和URL路徑語法: ADD <src>...<dest> ADD ["<src>",..."<dest>"]
規則: 1.和COPY規則相同 2.如果 <src>
為URL並且 <dest>
沒有以/結尾,則 <src>
指定的檔案將被下載到 <dest>
3.如果 <src>
是一個本地系統上壓縮格式的tar檔案,它會展開成一個目錄;但是通過URL獲取的tar檔案不會自動展開 4.如 <src>
有多個,直接或間接使用了萬用字元指定多個資源,則 <dest>
必須是目錄並且以/結尾
6.WORKDIR 用於為Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工作目錄,只會影響當前WORKDIR之後的指令。 語法: WORKDIR <dirpath>
1 在Dockerfile檔案中,WORKDIR可以出現多次,路徑可以是相對路徑,但是它是相對於前一個WORKDIR指令指定的路徑 另外,WORKDIR可以是ENV指定定義的變數
7.VOLUME 用來建立掛載點,可以掛載宿主機上的卷或者其他容器上的卷 語法: VOLUME <mountpoint> VOLUME ["<mountpoint>"]
不能指定宿主機當中的目錄,宿主機掛載的目錄是自動生成的
8.EXPOSE 用於給容器開啟指定要監聽的埠以實現和外部通訊 語法: EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
<protocol>
用於指定傳輸層協議,可以是TCP或者UDP,預設是TCP協議EXPOSE可以一次性指定多個埠,例如: EXPOSE 80/tcp
80/udp`
9.ENV 用來給映象定義所需要的環境變數,並且可以被Dockerfile檔案中位於其後的其他指令(如ENV、ADD、COPY等)所呼叫,呼叫格式:variablename或者{variable_name} 語法: ENV <key> <value> ENV <key>=<value>...
第一種格式中, <key>
之後的所有內容都會被視為 <value>
的組成部分,所以一次只能設定一個變數 第二種格式可以一次設定多個變數,如果 <value>
當中有空格可以使用\進行轉義或者對 <value>
加引號進行標識;另外\也可以用來續行
10.ARG 用法同ENV 語法: ARG <name>[=<default value>]
指定一個變數,可以在docker build建立映象的時候,使用 --build-arg <varname>=<value>
來指定引數
11.RUN 用來指定docker build過程中執行指定的命令 語法: RUN <command> RUN ["<executable>","<param1>","<param2>"]
第一種格式裡面的引數一般是一個shell命令,以/bin/sh -c來執行它 第二種格式中的引數是一個JSON格式的陣列,當中 <executable>
是要執行的命令,後面是傳遞給命令的選項或者引數;但是這種格式不會用 /bin/sh -c
來發起,所以常見的shell操作像變數替換和萬用字元替換不會進行;如果你執行的命令依賴shell特性,可以替換成型別以下的格式 RUN ["/bin/bash","-c","<executable>","<param1>"]
12.CMD 容器啟動時執行的命令 語法: CMD <command> CMD ["<executable>","<param1>","<param2>"] CMD ["<param1>","<param2>"]
前兩種語法和RUN相同 第三種語法用於為ENTRYPOINT指令提供預設引數 RUN和CMD區別: 1.RUN指令運行於映象檔案構建過程中,CMD則運行於基於Dockerfile構建出的新映象檔案啟動為一個容器的時候 2.CMD指令的主要目的在於給啟動的容器指定預設要執行的程式,且在執行結束後,容器也將終止;不過,CMD命令可以被docker run的命令列選項給覆蓋 3.Dockerfile中可以存在多個CMD指令,但是隻有最後一個會生效
13.ENTRYPOINT 類似於CMD指令功能,用於給容器指定預設執行程式 語法: ENTRYPOINT<command> ENTRYPOINT["<executable>","<param1>","<param2>"]
和CMD不同的是ENTRYPOINT啟動的程式不會被docker run命令指定的引數所覆蓋,而且,這些命令列引數會被當做引數傳遞給ENTRYPOINT指定的程式(但是,docker run命令的–entrypoint引數可以覆蓋ENTRYPOINT) docker run命令傳入的引數會覆蓋CMD指令的內容並且附加到ENTRYPOINT命令最後作為其引數使用 同樣,Dockerfile中可以存在多個ENTRYPOINT指令,但是隻有最後一個會生效 Dockerfile中如果既有CMD又有ENTRYPOINT,並且CMD是一個完整可執行命令,那麼誰在最後誰生效
14.ONBUILD 用來在Dockerfile中定義一個觸發器 語法: ONBUILD <instruction>
Dockerfile用來構建映象檔案,映象檔案也可以當成是基礎映象被另外一個Dockerfile用作FROM指令的引數 在後面這個Dockerfile中的FROM指令在構建過程中被執行的時候,會觸發基礎映象裡面的ONBUILD指令 ONBUILD不能自我巢狀,ONBUILD不會觸發FROM和MAINTAINER指令 在ONBUILD指令中使用ADD和COPY要小心,因為新構建過程中的上下文在缺少指定的原始檔的時候會失敗