1. 在/usr/local/docker 目錄下創(chuàng)建目錄 xxx 例如 yb
2. 拉取基礎(chǔ)鏡像 :例如 需要定制jetty鏡像 則先拉取jetty (比tomcat更輕量的servlet容器)
3. 在 yb 目錄下 vi Dockerfile
Dockerfile 是一個(gè)文本文件,其內(nèi)包含了一條條的指令(Instruction),每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。每一條Dockerfile指令就是創(chuàng)建一個(gè)分層(鏡像構(gòu)建時(shí),會(huì)一層層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會(huì)再發(fā)生改變,后一層上的任何改變只發(fā)生在自己這一層)
編寫(xiě)指令 例如:
FROM jetty
WORKDIR /var/lib/jetty/webapps
RUN mkdir ROOT
WORKDIR /var/lib/jetty/webapps/ROOT
COPY myshop.zip /var/lib/jetty/webapps/ROOT
RUN unzip myshop.zip
WORKDIR /var/lib/jetty
FROM jetty ----定制的鏡像來(lái)源于 jetty 鏡像 相當(dāng)于繼承
WORKDIR /var/lib/jetty/webapps ----進(jìn)入到 /var/lib/jetty/webapps 工作目錄(不能用 cd 不然下面的 RUN 不是在上面的目錄運(yùn)行。因?yàn)槊恳粭l指令就是創(chuàng)建一個(gè)分層 而cd 不會(huì)創(chuàng)建分層 下面的分層沒(méi)有) 注意:jetty的工作目錄是/var/lib/jetty/ 具體看docker倉(cāng)庫(kù)搜索jetty介紹
RUN mkdir ROOT ----在上一個(gè)分層的基礎(chǔ)上創(chuàng)建目錄ROOT (但還是在/var/lib/jetty/webapps目錄)
WORKDIR /var/lib/jetty/webapps/ROOT----進(jìn)入 /var/lib/jetty/webapps 目錄
COPY myshop.zip /var/lib/jetty/webapps/ROOT-----將上下文目錄下的myshop.zip 拷貝到/var/lib/jetty/webapps/ROOT 目錄下(可以用.代表當(dāng)前目錄)
WORKDIR /var/lib/jetty ------重新回到 /var/lib/jetty 目錄 因?yàn)閖etty 在這個(gè)目錄才會(huì)運(yùn)行成功(跟tomcat相似 /usr/local/tomcat)
上述指令 相當(dāng)于在鏡像中 添加了 ROOT 目錄 以及 部署了項(xiàng)目----以后由該鏡像創(chuàng)建的容器都具有這些 進(jìn)入到容器的目錄也會(huì)是/usr/local/jetty目錄。
4. 將需要上傳到鏡像的文件拷貝到 /usr/local/docker/yb 目錄下(因?yàn)閯?chuàng)建鏡像的時(shí)候 ==docker build 命令將路徑下(/yb目錄)的所有內(nèi)容打包,然后上傳給 Docker 引擎。這樣 Docker 引擎收到這個(gè)上下文包后,展開(kāi)就會(huì)獲得構(gòu)建鏡像所需的一切文件,即/yb目錄下的就稱(chēng)為上下文==) COPY xx 代表復(fù)制上下文路徑的 xx
[ADD 命令 先拷貝后自動(dòng)壓縮 (盡量不用 有時(shí)候會(huì)出錯(cuò) 了解就行)]
5. 創(chuàng)建鏡像 : docker build -t 鏡像名 . (. 代表上下文, yb目錄下的所有文件) 例如 docker build -t gg
當(dāng)存在構(gòu)建的鏡像時(shí) 再一次運(yùn)行構(gòu)建 如果Dockerfile中修改較大 且新構(gòu)建的鏡像名與存在的一致 則新構(gòu)建的鏡像名會(huì)覆蓋存在的 存在的鏡像會(huì)變?yōu)樘摂M鏡像 <none> ,當(dāng)改動(dòng)不大時(shí) 會(huì)直接覆蓋存在的鏡像(將存在的鏡像當(dāng)做緩存一般 相同的分層不需要重新構(gòu)建)
6. 運(yùn)行鏡像中部署的項(xiàng)目 docker run -p 8080:8080 --yueba -d Build_images_Name(當(dāng)然還得先運(yùn)行mysql容器) 例如 docker run -p 8080:8080 --yueba -d gg
Dockfile編輯的時(shí)候每次出現(xiàn)Dockfile關(guān)鍵字就是創(chuàng)建了一層(分層存儲(chǔ)) 下一層具有上一層的東西,在Dockerfile用cd 進(jìn)入目錄 再RUN 目錄指令 不會(huì)生效 RUN這一層的工作目錄不具有cd的目錄
CMD指令與 ENTRYPOINT 指令的區(qū)別:
差異1:CMD指令指定的容器啟動(dòng)時(shí)命令可以被docker run指定的命令覆蓋,而ENTRYPOINT指令指定的命令不能被覆蓋,而是將docker run指定的參數(shù)當(dāng)做ENTRYPOINT指定命令的參數(shù)
差異2:CMD指令可以為ENTRYPOINT指令設(shè)置默認(rèn)參數(shù),而且可以被docker run指定的參數(shù)覆蓋