使用Dockerfile構建鏡像

Docker生成鏡像的兩種方式

有時候從Docker鏡像倉庫中下載的鏡像不能知足要求,咱們能夠基於一個基礎鏡像構建一個本身的鏡像html

兩種方式:java

1.更新鏡像:使用docker commit命令
2.構建鏡像:使用docker build命令,須要建立Dockerfile文件

更新鏡像

先使用基礎鏡像建立一個容器,而後對容器內容進行更改,而後使用docker commit命令提交爲一個新的鏡像(以tomcat爲例)。

1.根據基礎鏡像,建立容器react

docker run --name mytomcat -p 80:8080 -d tomcat

2. 修改容器內容web

docker exec -it mytomcat /bin/bash
cd webapps/ROOT
rm -f index.jsp
echo hello world > index.html
exit

3.提交爲新鏡像spring

docker commit -m="描述消息" -a="做者"容器ID或容器名
鏡像名:TAG# 例:
# docker commit -m="修改了首頁" -a="華安" mytomcat huaan/tomcat:v1.0

4.使用新鏡像運行容器docker

docker run --name tom -p 8080:8080 -d
huaan/tomcat:v1.0

使用Dockerfile構建鏡像

什麼是Dockerfile?shell

Dockerfile is nothing but the source code for building Docker images數組

  1.Docker can build images automatically by reading the instructions from a Dockerfiletomcat

  2.A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an imagespringboot

  3.Using docker build users can create an  automated build that executes several command- line instructions in succession

  dockerfile

Dockerfile格式

1、Format:

     1.#Comment

     2.INSTRUCTION arguments

2、The instruction isnot case-sensitive 

      However,convention is for them to be UPPERCASE to distinguish them from arguments more easily

3、Docker runs instructions in a Dockerfile in order

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服務器

2、構建

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 .
# -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  <image>
FROM  <image>:<tag>
FROM  <image>@<digest>

 

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  <src>...<dest>
COPY  ["<src>",..."<dest>"]
# <src>:要複製的源文件或者目錄,可使用通配符
# <dest>:目標路徑,即正在建立的image的文件系統路徑;建議<dest>使用絕對路徑,不然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>

在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等)所調用,調用格式:$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要當心,由於新構建過程當中的上下文在缺乏指定的源文件的時候會失敗

相關文章
相關標籤/搜索