国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何用Dockerfile構(gòu)建鏡像

genefy / 3434人閱讀

摘要:用于配置當(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常用的指令。

文章提綱:

Dockerfile常用指令

Dockerfile的編寫

用Dockerfile構(gòu)建鏡像

彩蛋

1 Dockerfile常用指令
類型 命令
基礎(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

相關(guān)文章

  • 何用Docker定制你自己的Beego環(huán)境

    摘要:如何用定制你自己的環(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上...

    alaege 評(píng)論0 收藏0
  • Docker 入門(二):從實(shí)例來看 Dockerfile 和 Compose

    摘要:安裝完成后,可以用以下命令查看下版本信息。另外,如果要?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 容器...

    xingqiba 評(píng)論0 收藏0
  • 都9102年了,還不會(huì)Docker?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

    摘要:聯(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...

    sf_wangchong 評(píng)論0 收藏0
  • 容器化-Docker實(shí)戰(zhàn)

    摘要:導(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基本操作有一定了解。一、...

    tuantuan 評(píng)論0 收藏0
  • 輕松搞定|將PHP和Couchbase應(yīng)用部署為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),今天帶來的文章將闡述怎樣部署一...

    X1nFLY 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<