使用Dockerfile構建鏡像

有時候從Docker鏡像倉庫中下載的鏡像不能知足要求,咱們能夠基於一個基礎鏡像構建一個本身的鏡像 兩種方式: 1.更新鏡像:使用docker commit命令 2.構建鏡像:使用docker build命令,須要建立Dockerfile文件html

更新鏡像

先使用基礎鏡像建立一個容器,而後對容器內容進行更改,而後使用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# 例:java

docker commit -m=「修改了首頁」 -a=「華安」 mytomcat huaan/tomcat:v1.0`

4.使用新鏡像運行容器 docker run --name tom -p 8080:8080 -d huaan/tomcat:v1.0react

使用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 dockerfileweb

Dockerfile格式 1、Format: 1.#Comment 2.INSTRUCTION argumentsspring

2、The instruction isnot case-sensitive However,convention is for them to be UPPERCASE to distinguish them from arguments more easilydocker

3、Docker runs instructions in a Dockerfile in ordershell

4、The first instruction must be ‘FROM’ in order to specify the Base Image from which you are building數組

使用Dockerfile構建SpringBoot應用鏡像

1、準備 1.把你的springboot項目打包成可執行jar包 2.把jar包上傳到Linux服務器tomcat

2、構建 1.在jar包路徑下建立Dockerfile文件vi Dockerfilespringboot

指定基礎鏡像,本地沒有會從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

.指當前目錄,這裏實際上須要一個上下文路徑實際上須要一個上下文路徑`

3、運行 運行本身的SpringBoot鏡像 docker run --name pro -p 80:80 -d 鏡像名:TAG

Dockerfile經常使用指令

1.FROM FROM指令是最重要的一個而且必須爲Dockerfile文件開篇的第一個非註釋行,用於爲鏡像文件構建過程指定基礎鏡像,後續的指令運行於此基礎鏡像提供的運行環境 這個基礎鏡像能夠是任何可用鏡像,默認狀況下docker build會從本地倉庫找指定的鏡像文件,若是不存在就會從Docker Hub上拉取 語法:

FROM FROM : 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/tcp80/udp`

9.ENV 用來給鏡像定義所須要的環境變量,而且能夠被Dockerfile文件中位於其後的其餘指令(如ENV、ADD、COPY等)所調用,調用格式:variablename或者 variable_name或者{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要當心,由於新構建過程當中的上下文在缺乏指定的源文件的時候會失敗

相關文章
相關標籤/搜索