摘要:用于配置當(dāng)前所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時(shí),所執(zhí)行的操作指令。運(yùn)行構(gòu)建命令構(gòu)建命令用于使用創(chuàng)建鏡像。
本文旨在用通俗的語言講述枯燥的知識(shí)
前面講到鏡像的構(gòu)建時(shí),講述的是用commit的方式構(gòu)建鏡像,而Dockerfile是另一種構(gòu)建鏡像的方式。
Dockerfile構(gòu)建鏡像是以基礎(chǔ)鏡像為基礎(chǔ)的,Dockerfile是一個(gè)文本文件,內(nèi)容是用戶編寫的一些docker指令,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。
Dockerfile的基本指令有十三個(gè),分別是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD
從前面的內(nèi)容可以看出,要構(gòu)建一個(gè)容器,需要做很多的工作,設(shè)置很多的配置,如果我們可以把每一層修改、安裝、構(gòu)建、操作的命令都寫入一個(gè)腳本,用這個(gè)腳本來構(gòu)建、定制鏡像,那么之前提及的無法重復(fù)的問題、鏡像構(gòu)建透明性的問題、體積的問題就都會(huì)解決。
這個(gè)腳本就是 Dockerfile。
因此學(xué)會(huì)用Dockerfile來構(gòu)建鏡像,是非常有必要的。學(xué)習(xí)Dockerfile之前,我們先來學(xué)習(xí)一些Dockerfile常用的指令。
1 Dockerfile常用指令文章提綱:
Dockerfile常用指令
Dockerfile的編寫
用Dockerfile構(gòu)建鏡像
彩蛋
類型 | 命令 |
---|---|
基礎(chǔ)鏡像信息 | FROM |
維護(hù)者信息 | MAINTAINER |
鏡像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器啟動(dòng)時(shí)執(zhí)行指令 | CMD、ENTRYPOINT |
1.1、FROM :指定基礎(chǔ)鏡像
所謂定制鏡像,那一定是以一個(gè)鏡像為基礎(chǔ),在其上進(jìn)行定制。就像我們之前運(yùn)行了一個(gè)nginx鏡像的容器,再進(jìn)行修改一樣,基礎(chǔ)鏡像是必須指定的。而FROM就是指定基礎(chǔ)鏡 像,因此一個(gè)Dockerfile中FROM是必備的指令,并且必須是第一條指令。
如:指定ubuntu的14版本作為基礎(chǔ)鏡像
FROM ubuntu:14
1.2、 RUN:執(zhí)行命令
RUN指令在新鏡像內(nèi)部執(zhí)行的命令,如:執(zhí)行某些動(dòng)作、安裝系統(tǒng)軟件、配置系統(tǒng)信息之類,
格式如下兩種:
1)shell格式:RUN< command > ,就像直接在命令行中輸入的命令一樣。
如在nginx里的默認(rèn)主頁中寫”hello“:
RUN echo "hello " >/etc/nginx/html/index.html
2)exec格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
如在新鏡像中用yum方式安裝nginx:
RUN ["yum","install","nginx"]
注:多行命令不要寫多個(gè)RUN,原因是Dockerfile中每一個(gè)指令都會(huì)建立一層.多少個(gè)RUN就構(gòu)建了多少層鏡像,會(huì)造成鏡像的臃腫、多層,不僅僅增加了構(gòu)件部署的時(shí)間,還容易出錯(cuò),RUN書寫時(shí)的換行符是
1.3、COPY:復(fù)制文件
COPY命令用于將宿主機(jī)器上的的文件復(fù)制到鏡像內(nèi),如果目的位置不存在,Docker會(huì)自動(dòng)創(chuàng)建。但宿主機(jī)器用要復(fù)制的目錄必須是和Dockerfile文件統(tǒng)計(jì)目錄下。
格式:
COPY [--chown=: ] <源路徑>... <目標(biāo)路徑> COPY [--chown= : ] ["<源路徑1>",... "<目標(biāo)路徑>"]
如把宿主機(jī)中的package.json文件復(fù)制到容器中/usr/src/app/目錄下:
COPY package.json /usr/src/app/
1.4、CMD:容器啟動(dòng)命令
CMD命令用于容器啟動(dòng)時(shí)需要執(zhí)行的命令,CMD在Dockerfile中只能出現(xiàn)一次,如果出現(xiàn)多個(gè),那么只有最后一個(gè)會(huì)有效。
其作用是在啟動(dòng)容器的時(shí)候提供一個(gè)默認(rèn)的命令項(xiàng)。如果用戶執(zhí)行docker run的時(shí)候提供了命令項(xiàng),就會(huì)覆蓋掉這個(gè)命令,沒提供就會(huì)使用構(gòu)建時(shí)的命令。
格式:
shell 格式:CMD <命令> exec 格式:CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]
如容器啟動(dòng)時(shí)進(jìn)入bash:
CMD /bin/bash
也可以用exec寫法:
CMD ["/bin/bash"]
1.5 MAINTAINER:指定作者
用來指定dockerfile的作者名稱和郵箱,主要作用是為了標(biāo)識(shí)軟件的所有者是誰。
語法:
MAINTAINER
如:
MAINTAINER autor_jiabuli 6766633@qq.com
1.6、EXPOSE:暴露端口
EXPOSE命名適用于設(shè)置容器對(duì)外映射的容器端口號(hào),如tomcat容器內(nèi)使用的端口8081,則用EXPOSE命令可以告訴外界該容器的8081端口對(duì)外,在構(gòu)建鏡像時(shí)
用docker run -p可以設(shè)置暴露的端口對(duì)宿主機(jī)器端口的映射。
語法:
EXPOSE <端口1> [<端口2>...]
如:
EXPOSE 8081
EXPOSE 8081 其實(shí)等價(jià)于 docker run -p 8081 當(dāng)需要把8081端口映射到宿主機(jī)中的某個(gè)端口(如8888)以便外界訪問時(shí),則可以用docker run -p 8888:8081
1.7、WORKDIR:配置工作目錄
WORKDIR命令是為RUN、CMD、ENTRYPOINT指令配置工作目錄。其效果類似于Linux命名中的cd命令,用于目錄的切換,但是和cd不一樣的是:如果切換到的目錄不存在,WORKDIR會(huì)為此創(chuàng)建目錄。
語法:
WORKDIR path
如需要在nginx目錄下創(chuàng)建一個(gè)hello.txt的文件:
##進(jìn)入/usr/local/nginx目錄下 WORKDIR /usr/local/nginx ##進(jìn)入/usr/local/nginx中的html目錄下 WORKDIR html ## 在html目錄下創(chuàng)建了一個(gè)hello.txt文件 RUN echo "hello" > hello.txt
1.8、ENTRYPOINT:容器啟動(dòng)執(zhí)行命名
ENTRYPOINT的作用和用法和CMD一模一樣,但是ENTRYPOINT有和CMD有2處不一樣:
CMD的命令會(huì)被docker run的命令覆蓋而ENTRYPOINT不會(huì)
CMD和ENTRYPOINT都存在時(shí),CMD的指令變成了ENTRYPOINT的參數(shù),并且此CMD提供的參數(shù)會(huì)被 docker run 后面的命令覆蓋
1.9、VOLUME
VOLUME用來創(chuàng)建一個(gè)可以從本地主機(jī)或其他容器掛載的掛載點(diǎn)。例如我們知道tomcat的webapps目錄是放web應(yīng)用程序代碼的地方,此時(shí)我們要把webapps目錄掛載為匿名卷,這樣任何寫入webapps中的心都不會(huì)被記錄到容器的存儲(chǔ)層,讓容器存儲(chǔ)層無狀態(tài)化。
格式:
VOLUME ["path"]
如創(chuàng)建tomcat的webapps目錄的一個(gè)掛載點(diǎn)
VOLUME /usr/local/tomcat/webapps
這樣,在運(yùn)行容器時(shí),也可以用過docker run -v來把匿名掛載點(diǎn)掛載都宿主機(jī)器上的某個(gè)目錄,如
docker run -d -v /home/tomcat_webapps:/usr/local/tomcat/webapps
1.10、 USER
USER命令用于指定當(dāng)前望下執(zhí)行的用戶,需要注意的是這個(gè)用戶必須是已經(jīng)存在,否則無法指定。它的用法和WORKDIR有點(diǎn)像,切換用戶。
格式:
USER daemon
1.11、ADD
作用和使用方法和COPY一模一樣,在此不重復(fù)講述。
1.12、ONBUILD
ONBUILD用于配置當(dāng)前所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時(shí),所執(zhí)行的操作指令。
意思就是:這個(gè)鏡像創(chuàng)建后,如果其它鏡像以這個(gè)鏡像為基礎(chǔ),會(huì)先執(zhí)行這個(gè)鏡像的ONBUILD命令
格式:
ONBUILD [INSTRUCTION]
1.13、ENV:設(shè)置環(huán)境變量
ENV命名用于設(shè)置容器的環(huán)境變量,這些變量以”key=value”的形式存在,在容器內(nèi)被腳本或者程序調(diào)用,容器運(yùn)行的時(shí)候這個(gè)變量也會(huì)保留。
格式:
1) 設(shè)置一個(gè): ENV
2) 設(shè)置多個(gè):ENV
如設(shè)置一個(gè)環(huán)境變量JAVA_HOME,接下來的命名就可以使用這個(gè)變量:
ENV JAVA_HOME /opt/jdk ENV PATH $PATH:$JAVA_HOME/bin
在使用ENV設(shè)置環(huán)境變量時(shí),有幾點(diǎn)需要注意:
1)具有傳遞性,也就是當(dāng)前鏡像被用作其它鏡像的基礎(chǔ)鏡像時(shí),新鏡像會(huì)擁有當(dāng)前這個(gè)基礎(chǔ)鏡像所有的環(huán)境變量
2)ENV定義的環(huán)境變量,可以在dockerfile被后面的所有指令(CMD除外)中使用,但不能被docker run 的命令參數(shù)引用
如:
ENV tomcat_home_name tomcat_7 RUN mkdir $tomcat_home_name
3)除了ENV之外,docker run -e 也可以設(shè)置環(huán)境變量傳入容器內(nèi)。
如:
docker run -d tomcat -e "tomcat_home_name=tomcat_7"
這樣我們進(jìn)入容器內(nèi)部用ENV可以看到tomcat_home_name這個(gè)環(huán)境變量。
2 Dockerfile的編寫我們先看一個(gè)例子
#在centos上安裝nginx FROM centos #標(biāo)明著作人的名稱和郵箱 MAINTAINER jiabuli 649917837@qq.com #測(cè)試一下網(wǎng)絡(luò)環(huán)境 RUN ping -c 1 www.baidu.com #安裝nginx必要的一些軟件 RUN yum -y install gcc make pcre-devel zlib-devel tar zlib #把nginx安裝包復(fù)制到/usr/src/目錄下 ADD nginx-1.15.8.tar.gz /usr/src/ #切換到/usr/src/nginx-1.15.8編譯并且安裝nginx RUN cd /usr/src/nginx-1.15.8 && mkdir /usr/local/nginx && ./configure --prefix=/usr/local/nginx && make && make install && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && nginx #刪除安裝nginx安裝目錄 RUN rm -rf /usr/src/nginx-nginx-1.15.8 #對(duì)外暴露80端口 EXPOSE 80 #啟動(dòng)nginx CMD ["nginx", "-g", "daemon off;"]
上面的注釋已經(jīng)講的非常清楚,其實(shí)不難發(fā)現(xiàn),上面的例子就是類似于在centos系統(tǒng)上安裝一個(gè)nginx的的一個(gè)過程,因此編寫Dockerfile構(gòu)建鏡像就和在Linux上安裝軟件的流程幾乎是一模一樣的。所以我們?cè)诰帉慏ockerfile來構(gòu)建鏡像時(shí),可以先思考在Linux上安裝該軟件的流程,再用Dockerfile提供的指令轉(zhuǎn)化到Dockerfile中即可。
3.用Dockerfile構(gòu)建鏡像用Dockerfile的核心在于編寫Dockerfile,但是編寫完之后我們需要知道怎么使用Dockerfile來構(gòu)建鏡像,下面以構(gòu)建nginx鏡像為例來簡要說明構(gòu)建流程
3.1 上傳安裝包
首先我們需要把要構(gòu)建的軟件安裝包上傳到服務(wù)器中,我們可以在服務(wù)器目錄上創(chuàng)建一個(gè)專門的文件夾,如:/var/nginx_build,然后把從nginx官網(wǎng)下載的nginx-1.15.8.tar.gz安裝包上傳到這個(gè)目錄里。
3.2 編寫Dockerfile
如何編寫nginx的Dockerfile上面已經(jīng)詳細(xì)介紹,現(xiàn)在我們只需把編寫好的Dockerfile上傳到/var/nginx_build目錄下,當(dāng)然你也可以在服務(wù)器上直接編寫Dockerfile,但是要記得一定保證Dockerfile文件和安裝包在一個(gè)目錄下。
3.3 運(yùn)行構(gòu)建命令構(gòu)建
docker build 命令用于使用 Dockerfile 創(chuàng)建鏡像。
格式:
docker build [OPTIONS] PATH | URL | -
OPTIONS有很多指令,下面列舉幾個(gè)常用的:
--build-arg=[] :設(shè)置鏡像創(chuàng)建時(shí)的變量;
-f :指定要使用的Dockerfile路徑;
--force-rm :設(shè)置鏡像過程中刪除中間容器;
--rm :設(shè)置鏡像成功后刪除中間容器;
--tag, -t:?鏡像的名字及標(biāo)簽,通常 name:tag 或者 name 格式;
因此我們構(gòu)建nginx可以用以下命令:
docker build -t nginx:v1.0 .
當(dāng)Dockerfile和當(dāng)前執(zhí)行命令的目錄不在同一個(gè)時(shí),我們也可以指定Dockerfile,如
docker build -f /var/nginx_build/Dockerfile .
執(zhí)行命名之后,會(huì)看到控制臺(tái)逐層輸出構(gòu)建內(nèi)容,直到輸出兩個(gè)Successfully即為構(gòu)建成功。
4. 彩蛋寫了很多篇docker的文章,為了方便開發(fā)者們學(xué)習(xí)和查閱docker的基礎(chǔ)知識(shí),我做了一份完整的docker基礎(chǔ)整理,發(fā)布在gitchat上面,有興趣的讀者可以加入一起學(xué)習(xí),我這里還有6個(gè)免費(fèi)名額,如有需要,可以加微信:sisi-ceo 索要。
覺得本文對(duì)你有幫助?請(qǐng)分享給更多人
關(guān)注「編程無界」,提升裝逼技能
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27679.html
摘要:如何用定制你自己的環(huán)境前言學(xué)習(xí)幾個(gè)月了,一直在論壇和群里潛水,一直都想寫點(diǎn)什么回報(bào)大家積極的知識(shí)分享。關(guān)于如何使用,可以參考上面的文章和官方文檔二小試牛刀,用構(gòu)建一個(gè)的環(huán)境并運(yùn)行程序首先來貼上我的先附上這個(gè)項(xiàng)目地址。 如何用Docker定制你自己的Beego環(huán)境 前言: 學(xué)習(xí)golang幾個(gè)月了,一直在論壇和qq群里潛水,一直都想寫點(diǎn)什么回報(bào)大家積極的知識(shí)分享。 前幾日在CSDN上...
摘要:安裝完成后,可以用以下命令查看下版本信息。另外,如果要?jiǎng)h除剛運(yùn)行的兩個(gè)容器,可以總結(jié)本文從數(shù)據(jù)持久化開始說起,淺談了和并附送如何用這兩種方式分別搭建環(huán)境,并在對(duì)比中展示了它們各自的特點(diǎn)。 上一文中提到,每次對(duì)容器做了改動(dòng),如果不把它 commit 成新的鏡像,在刪除容器后,數(shù)據(jù)也會(huì)丟失,有沒有什么更好的辦法來保存數(shù)據(jù)呢?使用數(shù)據(jù)卷就可以解決這個(gè)問題。 另外,相對(duì)于用 commit 容器...
摘要:聯(lián)調(diào)測(cè)試,無需依賴他人。針對(duì)以上問題,有兩種解決方法,一個(gè)是自己搭建私有服務(wù),另一個(gè)是用云服務(wù)的鏡像管理平臺(tái)如阿里云的容器鏡像服務(wù)。利用,先對(duì)阿里云的服務(wù)進(jìn)行登錄。推送后,就能在阿里云的倉庫上看到這個(gè)鏡像。 Docker簡述 Docker是一種OS虛擬化技術(shù),是一個(gè)開源的應(yīng)用容器引擎。它可以讓開發(fā)者將應(yīng)用打包到一個(gè)可移植的容器中,并且該容器可以運(yùn)行在幾乎所有l(wèi)inux系統(tǒng)中(Windo...
摘要:導(dǎo)讀本文系統(tǒng)性介紹安裝組件命令語法和應(yīng)用,通過上述介紹使我們已經(jīng)對(duì)基本操作有一定了解。二安裝本文以及以上版本為例來說明安裝底層對(duì)應(yīng)的是鏡像,不可寫的文件系統(tǒng),它的存儲(chǔ)方式比較多。根據(jù)規(guī)范產(chǎn)生和運(yùn)行容器的工具。 導(dǎo)讀:本文系統(tǒng)性介紹Docker安裝、Docker組件、Docker命令、Dockerfile語法和Docker應(yīng)用,通過上述介紹使我們已經(jīng)對(duì)docker基本操作有一定了解。一、...
摘要:此時(shí),可以構(gòu)建映像,并將其部署為容器。從執(zhí)行以下操作以上命令將使用文件中定義的端口,構(gòu)建對(duì)應(yīng)鏡像和部署成為容器。 showImg(https://segmentfault.com/img/remote/1460000010122752); 數(shù)人云之前分享了《如何用Docker實(shí)現(xiàn)PHP命令行程序的CI/CD》,詳細(xì)地介紹了整體過程中的思路以及以及注意事項(xiàng),今天帶來的文章將闡述怎樣部署一...
閱讀 2951·2021-11-25 09:43
閱讀 3327·2021-11-24 09:39
閱讀 2828·2021-09-22 15:59
閱讀 2174·2021-09-13 10:24
閱讀 509·2019-08-29 17:02
閱讀 2098·2019-08-29 13:23
閱讀 3057·2019-08-29 13:06
閱讀 3539·2019-08-29 13:04