有時候從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?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
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
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要當心,由於新構建過程當中的上下文在缺乏指定的源文件的時候會失敗