有時候從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
4.使用新鏡像運行容器 docker run --name tom -p 8080:8080 -d huaan/tomcat:v1.0
react
什麼是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數組
1、準備 1.把你的springboot項目打包成可執行jar包 2.把jar包上傳到Linux服務器tomcat
2、構建 1.在jar包路徑下建立Dockerfile文件vi Dockerfilespringboot
FROM java:8 #做者 MAINTAINER huaan
ADD luban.jar /luban.jar
EXPOSE 80
ENTRYPOINT [「java」,"-jar","/luban.jar"]
2.使用docker build命令構建鏡像,基本語法 docker build -t huaan/mypro:v1 .
`docker build -t huaan/mypro:v1 .
3、運行 運行本身的SpringBoot鏡像 docker run --name pro -p 80:80 -d 鏡像名:TAG
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 ["",...""]
注意:若是你的路徑中有空白字符,一般會使用第二種格式規則: 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要當心,由於新構建過程當中的上下文在缺乏指定的源文件的時候會失敗