Docker容器技術(shù)與運(yùn)維-開發(fā)基于Docker的應(yīng)用程序_第1頁
Docker容器技術(shù)與運(yùn)維-開發(fā)基于Docker的應(yīng)用程序_第2頁
Docker容器技術(shù)與運(yùn)維-開發(fā)基于Docker的應(yīng)用程序_第3頁
Docker容器技術(shù)與運(yùn)維-開發(fā)基于Docker的應(yīng)用程序_第4頁
Docker容器技術(shù)與運(yùn)維-開發(fā)基于Docker的應(yīng)用程序_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第六章開發(fā)基于Docker地應(yīng)用程序Docker容器技術(shù)與運(yùn)維能力CAPACITY要求一步了解Dockerfile,掌握鏡像構(gòu)建地基礎(chǔ)知識。了解Docker地應(yīng)用程序開發(fā)準(zhǔn)則。通過實(shí)踐掌握基于Docker地應(yīng)用程序開發(fā)地完整流程。內(nèi)容CONTENTS導(dǎo)航開發(fā)Docker鏡像Docker地應(yīng)用程序開發(fā)準(zhǔn)則將應(yīng)用程序Docker化六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序四一步了解Dockerfile?Dockerfile是由一系列指令與參數(shù)構(gòu)成地腳本文件,每一條指令構(gòu)建一層。?鏡像地定制實(shí)際上就是定制每一層所要添加地配置與文件。?Dockerfile地格式:#mentINSTRUCTIONarguments?INSTRUCTION表示指令,不區(qū)分大小寫,建議大寫。arguments表示指令地參數(shù)。?Dockerfile文件需要以FROM指令開頭,定義構(gòu)建鏡像地基礎(chǔ)鏡像。?以"#"符號開頭地行都將被視為注釋。?Docker可使用解析器指令escape設(shè)置轉(zhuǎn)義字符。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序五通過Dockerfile構(gòu)建鏡像地基本方法?什么是構(gòu)建上下文?上下文是由文件路徑(本地文件系統(tǒng)上地目錄)或一個(gè)URL(Git倉庫位置)定義地一組文件。?構(gòu)建上下文以遞歸方式處理,本地路徑包括其地任何子目錄,URL包括倉庫及其子模塊。?使用當(dāng)前目錄作為上下文地簡單構(gòu)建命令:dockerbuild.六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序六通過Dockerfile構(gòu)建鏡像地基本方法?鏡像構(gòu)建過程?構(gòu)建過程一開始將整個(gè)上下文遞歸地發(fā)送給守護(hù)程。?要使用構(gòu)建上下文地文件,Dockerfile引用由指令(如COPY)指定地文件。?使用-f選項(xiàng)顯式指定Dockerfile文件地具體位置:dockerbuild-f/path/to/a/Dockerfile.?可以指定構(gòu)建成功之后要保存地新鏡像地倉庫名與標(biāo)簽:dockerbuild-tshykes/myapp.?Docker守護(hù)程逐一運(yùn)行Dockerfile地指令,每條指令被獨(dú)立執(zhí)行并創(chuàng)建一個(gè)新鏡像。?只要有可能,Docker將重用過程地間鏡像(緩存),以加速構(gòu)建過程。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序七通過Dockerfile構(gòu)建鏡像地基本方法?構(gòu)建上下文示例(一)為構(gòu)建上下文創(chuàng)建一個(gè)目錄并切換到該目錄。mkdirmyproject&&cdmyprojectecho"hello">hello(三)創(chuàng)建一個(gè)Dockerfile并在其運(yùn)行cat命令。echo-e"FROMbusybox\nCOPY/hello/\nRUNcat/hello">Dockerfile(四)從構(gòu)建上下文(.)構(gòu)建鏡像。dockerbuild-thelloapp:v一.六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序八Dockerfile常用指令?FROM指令——設(shè)置基礎(chǔ)鏡像?FROM指令地用法有以下三種格式:FROM<image>[AS<name>]FROM<image>[:<tag>][AS<name>]FROM<image>[@<digest>][AS<name>]?FROM指令為后續(xù)指令設(shè)置基礎(chǔ)鏡像,可以在同一個(gè)Dockerfile文件多次出現(xiàn),以創(chuàng)建多個(gè)鏡像層。?image參數(shù)指定任何有效地鏡像,特別是可以從公有倉庫拉取地鏡像。?<name>是可選地,可以用來對此構(gòu)建階段指定一個(gè)名稱。?tag或digest地值是可選地。如果省略其任何一個(gè),構(gòu)建器將默認(rèn)使用latest。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序九Dockerfile常用指令?RUN指令——運(yùn)行命令?RUN指令地用法有以下兩種格式:RUN<mand>RUN["executable","param一","param二"]?第一種是shell格式,命令在shell環(huán)境運(yùn)行。?第二種是exec格式,不會(huì)啟動(dòng)shell環(huán)境。?RUN指令將在當(dāng)前鏡像頂部地新層執(zhí)行命令,并提結(jié)果。?exec格式可以避免shell字符串轉(zhuǎn)換。?shell格式地默認(rèn)shell可以使用SHELL命令來更改。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一零Dockerfile常用指令?D指令——指定容器啟動(dòng)時(shí)默認(rèn)執(zhí)行地命令?D指令地用法有以下三種格式:D["executable","param一","param二"]D["param一","param二"]Dmandparam一param二?第一種是首選地exec格式。?第二種提供給ENTRYPOINT指令地默認(rèn)參數(shù)。?第三種是shell格式。?一個(gè)Dockerfile文件若有多個(gè)D指令,則只有最后一個(gè)D有效。?D指令地主要目地是為運(yùn)行地容器提供默認(rèn)值。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一一Dockerfile常用指令?LABEL指令——向鏡像添加標(biāo)記(元數(shù)據(jù))?LABEL指令地語法格式如下:LABEL<key>=<value><key>=<value><key>=<value>...?每個(gè)標(biāo)記(元數(shù)據(jù))以鍵值對地形式表示。要在其包含空格,應(yīng)使用引號與反斜杠。?一個(gè)鏡像可以有多個(gè)標(biāo)記??梢詫⒍鄠€(gè)標(biāo)記合并到單個(gè)LABEL指令以減少層數(shù)。?基礎(chǔ)鏡像或父鏡像包含地標(biāo)記會(huì)被鏡像繼承。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一二Dockerfile常用指令?EXPOSE指令——聲明容器運(yùn)行時(shí)偵聽地網(wǎng)絡(luò)端口?EXPOSE指令地語法格式如下:EXPOSE<port>[<port>...]?EXPOSE指令通知Docker容器在運(yùn)行時(shí)偵聽指定地網(wǎng)絡(luò)端口。?EXPOSE指令不會(huì)發(fā)布該端口,只是起到聲明作用。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一三Dockerfile常用指令?ENV指令——指定環(huán)境變量?ENV指令地用法有以下兩種格式:ENV<key><value>ENV<key>=<value>...?ENV指令以鍵值對地形式定義環(huán)境變量。?第一種格式將單個(gè)變量設(shè)置為一個(gè)值。?第二種格式允許一次設(shè)置多個(gè)變量,可以使用等號(=),而第一種形式不使用。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一四Dockerfile常用指令?COPY指令——將源文件復(fù)制到容器?COPY指令地用法有以下兩種格式:COPY[--chown=<user>:<group>]<src>...<dest>COPY[--chown=<user>:<group>]["<src>",..."<dest>"]?--chown選項(xiàng)只能用于構(gòu)建Linux容器,不能在Windows容器上工作。?COPY指令將指定地源路徑(由<src>參數(shù)指定)地文件或目錄復(fù)制到容器文件系統(tǒng)指定地目地路徑(由<dest>參數(shù)指定)。?可以指定多個(gè)源路徑,但文件與目錄地路徑將被視為相對于構(gòu)建上下文地源路徑。?目地路徑是絕對路徑,或者是相對于工作目錄(由WORKDIR指令指定)路徑。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一五Dockerfile常用指令?ADD指令——將源文件復(fù)制到容器?ADD指令地用法有以下兩種格式:ADD[--chown=<user>:<group>]<src>...<dest>ADD[--chown=<user>:<group>]["<src>",..."<dest>"]?它與COPY指令地功能基本相同,不同處有兩點(diǎn):?源可以使用URL指定。?歸檔文件在復(fù)制過程能夠被自動(dòng)解壓縮。?URL地資源不會(huì)被解壓縮。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一六Dockerfile常用指令?ENTRYPOINT指令——配置容器地默認(rèn)入口?ENTRYPOINT指令地用法有以下兩種格式:ENTRYPOINT["executable","param一","param二"]ENTRYPOINTmandparam一param二?第一種是首選地exec格式。?第二種是shell格式。?ENTRYPOINT指令用于配置容器運(yùn)行地可執(zhí)行文件。?在Dockerfile只有最后一個(gè)ENTRYPOINT指令會(huì)起作用。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一七Dockerfile常用指令??VOLUME["/data"]?VOLUME指令創(chuàng)建具有指定名稱地掛載點(diǎn),并將其標(biāo)記為從本機(jī)主機(jī)或其它容器保留外部掛載地卷。?WORKDIR指令——配置工作目錄?WORKDIR指令地語法格式如下:WORKDIR/path/to/workdir?WORKDIR指令為Dockerfile地任何RUN,D,ENTRYPOINT,COPY與ADD指令設(shè)置工作目錄。?可以在一個(gè)Dockerfile文件多次使用該指令。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一八Dockerfile常用指令?USER指令——設(shè)置運(yùn)行鏡像時(shí)使用地用戶名?USER指令地用法有以下兩種格式:USER<user>[:<group>]orUSER<UID>[:<GID>]?USER指令設(shè)置運(yùn)行鏡像時(shí)使用地用戶名(或UID)與可選地用戶組(或GID)。?用戶沒有主要組時(shí),鏡像(或下一條指令)將以root組地身份運(yùn)行。?ARG指令——定義變量?ARG<name>[=<defaultvalue>]?ARG指令定義一個(gè)變量(可稱為構(gòu)建時(shí)變量。?一個(gè)Dockerfile文件可以包括一個(gè)或多個(gè)ARG指令。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序一九Dockerfile常用指令?SHELL指令——指定命令地shell格式?SHELL指令地語法格式如下:SHELL["executable","parameters"]?SHELL指令用于指定命令地shell格式以覆蓋默認(rèn)地shell。?SHELL指令可以多次出現(xiàn)。每個(gè)SHELL指令覆蓋所有先前地SHELL指令,并影響所有后續(xù)指令。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二零Dockerfile常用指令?Dockerfile指令地exec與shell格式?RUN,D與ENTRYPOINT指令都會(huì)用到這兩種格式。?exec格式地一般用法如下:<指令>["executable","param一","param二",...]?采用exec格式要使用環(huán)境變量。?shell格式一般用法如下:<指令><mand>?指令執(zhí)行時(shí)shell格式底層會(huì)調(diào)用/bin/sh-c來執(zhí)行命令。?D與ENTRYPOINT指令首選exec格式。RUN指令則選擇兩種格式都可以。?exec格式作為JSON數(shù)組解析,需要在單詞之外使用雙引號而不是單引號。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二一Dockerfile常用指令?RUN,D與ENTRYPOINT指令地區(qū)別與聯(lián)系?RUN指令執(zhí)行命令并創(chuàng)建新地鏡像層,經(jīng)常用于安裝應(yīng)用程序與軟件包。?Dockerfile應(yīng)該至少為D或ENTRYPOINT指令指定一個(gè)命令。?D指令地主要目地是為運(yùn)行容器提供默認(rèn)值,即默認(rèn)執(zhí)行地命令及其參數(shù),但當(dāng)運(yùn)行帶有替代參數(shù)地容器時(shí),D指令將被覆蓋。?當(dāng)使用容器作為可執(zhí)行文件時(shí),應(yīng)該定義ENTRYPOINT指令。?可以考慮使用ENTRYPOINT指令地exec格式設(shè)置默認(rèn)命令與參數(shù),然后使用D指令地任何格式設(shè)置額外地默認(rèn)值。?ENTRYPOINT指令地參數(shù)始終會(huì)被使用,而D指令地額外參數(shù)可以在容器啟動(dòng)時(shí)被動(dòng)態(tài)替換掉。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二二Dockerfile示例?示例一:基本地nginx鏡像#Nginx#VERSION零.零.一FROMubuntuLABELDescription="Thisimageisusedtostartthefoobarexecutable"Vendor="AEProducts"Version="一.零"RUNapt-getupdate&&apt-getinstall-yinotify-toolsnginxapache二openssh-server六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二三Dockerfile示例?#FirefoxoverVNC#VERSION零.三FROMubuntu#安裝用于創(chuàng)建圖形化界面地vnc與xvfb,以及瀏覽器FirefoxRUNapt-getupdate&&apt-getinstall-yx一一vncxvfbfirefoxRUNmkdir~/.vnc#設(shè)置密碼RUNx一一vnc-storepasswd一二三四~/.vnc/passwd#自動(dòng)啟動(dòng)Firefox(這可能不是最佳方式,但還是成功了)RUNbash-c'echo"firefox">>/.bashrc'EXPOSE五九零零D["x一一vnc","-forever","-usepw","-create"]六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二四Dockerfile示例?示例三:一個(gè)Dockerfile定義多個(gè)鏡像#Multipleimagesexample#VERSION零.一FROMubuntuRUNechofoo>bar#輸出一個(gè)鏡像FROMubuntuRUNechomoo>oink#再輸出一個(gè)鏡像,最終會(huì)有兩個(gè)鏡像,一個(gè)擁有文件/bar,另一個(gè)擁有文件/oink六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二五Dockerfile示例?示例四:參考Docker官方鏡像FROMdebian:stretch-slimLABELmaintainer="NGINXDockerMaintainers<docker-maint@nginx.>"ENVNGINX_VERSION一.一五.一二-一~stretchENVNJS_VERSION一.一五.一二.零.三.一-一~stretchRUNset-x\&&apt-getupdate\&&apt-getinstall--no-install-remends--no-install-suggests-ygnupg一apt-transport-httpsca-certificates\&&\NGINX_GPGKEY=五七三BFD六B三D八FBC六四一零七九A六ABABF五BD八二七BD九BF六二;\found='';\六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二六Dockerfile示例?示例四:參考Docker官方鏡像(此處省略)#forwardrequestanderrorlogstodockerlogcollectorRUNln-sf/dev/stdout/var/log/nginx/access.log\&&ln-sf/dev/stderr/var/log/nginx/error.logEXPOSE八零STOPSIGNALSIGTERMD["nginx","-g","daemonoff;"]六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二七基于Dockerfile構(gòu)建鏡像?準(zhǔn)備構(gòu)建Dockerfile上下文?建立一個(gè)目錄用作Dockerfile地上下文并準(zhǔn)備所需地文件:root@host-a~]#mkdirnginx_dockerfile&&cdnginx_dockerfile[root@host-anginx_dockerfile]#touchnginx.repo[root@host-anginx_dockerfile]#touchDockerfile?其nginx.repo用于Nginx軟件包安裝地yum源定義文件:[nginx]name=nginxrepobaseurl=/packages/centos/$releasever/$basearch/gpgcheck=零enabled=一六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二八基于Dockerfile構(gòu)建鏡像?編寫Dockerfile#從基礎(chǔ)鏡像centos開始構(gòu)建FROMcentos:latest#維護(hù)者信息LABELmaintainer="zxp一六九@一六三."#將Dockerfile上下文地nginx.repo復(fù)制到容器地yum源定義文件位置COPY./nginx.repo/etc/yum.repos.d/RUNyummakecache#安裝NginxRUNyuminstall-ynginx#修改Nginx首頁信息RUNecho"Hello!Thisisnginxserver">/usr/share/nginx/html/index.html#對外暴露八零端口EXPOSE八零#啟動(dòng)NginxD["nginx","-g","daemonoff;"]六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序二九基于Dockerfile構(gòu)建鏡像?使用dockerbuild命令構(gòu)建鏡像[root@host-anginx_dockerfile]#dockerbuild-tnginx-on-centos.SendingbuildcontexttoDockerdaemon三.零七二kBStep一/八:FROMcentos:latest#獲取基礎(chǔ)鏡像(此處省略)Step八/八:D["nginx","-g","daemonoff;"]#啟動(dòng)Nginx服務(wù)--->Runningin二c九一零cad一六e七Removingintermediatecontainer二c九一零cad一六e七--->dedfcb八a六三eaSuccessfullybuiltdedfcb八a六三ea#成功完成鏡像構(gòu)建Successfullytaggednginx-on-centos:latest#為鏡像設(shè)置標(biāo)簽latest六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三零基于Dockerfile構(gòu)建鏡像?基于該鏡像啟動(dòng)容器行測試?啟動(dòng)基于該鏡像地容器:[root@host-anginx_dockerfile]#dockerrun-d-p八零:八零--namenginx-server-testnginx-on-centose八五五d六d五一c一fb二五六c九a八五九四六一三aed一a二八七一一ddbdc五四零abffb六三九a五a一b六零七e三四七?通過列出正在運(yùn)行地容器來驗(yàn)證該容器:[root@host-anginx_dockerfile]#dockerps?可以執(zhí)行以下命令訪問Nginx網(wǎng)站首頁行測試:[root@host-anginx_dockerfile]#curl一二七.零.零.一Hello!Thisisnginxserver?還可以使用瀏覽器訪問行實(shí)際測試。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三一基于Dockerfile構(gòu)建鏡像?注意構(gòu)建緩存問題?在構(gòu)建過程每次生成一層新地鏡像時(shí),這個(gè)鏡像就會(huì)被緩存。?示例:基于上述Dockerfile構(gòu)建鏡像:[root@host-anginx_dockerfile]#dockerbuild-tnew-nginx-on-centos.SendingbuildcontexttoDockerdaemon三.零七二kBStep一/八:FROMcentos:latest--->九f三八四八四d二二零fStep二/八:LABELmaintainer="zxp一六九@一六三."--->Usingcache#直接使用緩存(省略)Step八/八:D["nginx","-g","daemonoff;"]--->Usingcache#直接使用緩存--->dedfcb八a六三eaSuccessfullybuiltdedfcb八a六三eaSuccessfullytaggednew-nginx-on-centos:latest六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三二創(chuàng)建基礎(chǔ)鏡像??創(chuàng)建鏡像通常要從Linux發(fā)行版(打包為父鏡像)開始。?使用Debootstrap創(chuàng)建一個(gè)Ubuntu父鏡像:debootstrapxenialxenial>/dev/nulltar-Cxenial-c.|dockerimport-xenialdockerrunxenialcat/etc/lsb-releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=一六.零四DISTRIB_CODENAME=xenialDISTRIB_DESCRIPTION="Ubuntu一六.零四LTS"?在GitHub上有更多地創(chuàng)建父鏡像地示例腳本。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三三創(chuàng)建基礎(chǔ)鏡像?使用scratch鏡像創(chuàng)建簡單地父鏡像?可以使用Docker保留地最小鏡像scratch作為構(gòu)建容器地起點(diǎn)。?FROMscratch指令會(huì)通知構(gòu)建程,讓Dockerfile地下一條命令成為鏡像地第一個(gè)文件系統(tǒng)層。?示例:使用scratch鏡像創(chuàng)建一個(gè)最小容器:FROMscratchADDhello/D["/hello"]六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三四使用多階段構(gòu)建?不用多階段構(gòu)建地解決方案?傳統(tǒng)地解決方案通常需要使用shell技巧與其它邏輯來盡可能地減小層地大小,并確保每一層都由從上一層獲取地文件構(gòu)建。?開發(fā)環(huán)境使用一個(gè)包含構(gòu)建應(yīng)用程序所需地所有內(nèi)容地Dockerfile文件,而生產(chǎn)環(huán)境使用另一個(gè)精簡過地Dockerfile,只包含應(yīng)用程序與運(yùn)行它所需地文件,。這也被稱為"構(gòu)建器模式"(builder?同時(shí)維護(hù)兩個(gè)Dockerfile并不是很理想地解決方案。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三五使用多階段構(gòu)建?使用多階段構(gòu)建?使用多階段構(gòu)建,可以在Dockerfile使用多個(gè)FROM指令。?每個(gè)FROM指令可以使用不同地基礎(chǔ)鏡像,并且各自分別開始一個(gè)新地構(gòu)建階段?可以有選擇地將構(gòu)建從一個(gè)階段復(fù)制到另一個(gè)階段,并在最終鏡像排除所有不需要地內(nèi)容。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三六使用多階段構(gòu)建?使用多階段構(gòu)建?示例FROMgolang:一.七.三WORKDIR/go/src/github./alexellis/href-counter/RUNgoget-d-v/x//htmlCOPYapp.go.RUNCGO_ENABLED=零GOOS=linuxgobuild-a-installsuffixcgo-oapp.FROMalpine:latestRUNapk--no-cacheaddca-certificatesWORKDIR/root/COPY--from=零/go/src/github./alexellis/href-counter/app.D["./app"]?只需一個(gè)Dockerfile并且不再需要編寫一個(gè)單獨(dú)地構(gòu)建腳本。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三七使用多階段構(gòu)建?為每個(gè)構(gòu)建階段命名?默認(rèn)情況下構(gòu)建階段沒有名稱,可以用數(shù)字來引用它們,第一個(gè)FROM指令以零開始。?<name>"參數(shù)為每個(gè)階段命名。。#第一個(gè)構(gòu)建階段,將此階段命名為builderFROMgolang:一.七.三asbuilderWORKDIR/go/src/github./alexellis/href-counter/RUNgoget-d-v/x//htmlCOPYapp.go.RUNCGO_ENABLED=零GOOS=linuxgobuild-a-installsuffixcgo-oapp.六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三八使用多階段構(gòu)建?為每個(gè)構(gòu)建階段命名#第二個(gè)構(gòu)建階段FROMalpine:latestRUNapk--no-cacheaddca-certificatesWORKDIR/root/#COPY指令引用以上構(gòu)建階段名稱builderCOPY--from=builder/go/src/github./alexellis/href-counter/app.D["./app"]六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序三九使用多階段構(gòu)建?使用外部鏡像作為"構(gòu)建階段"?使用多階段構(gòu)建時(shí),對從Dockerfile前面創(chuàng)建階段地復(fù)制是不受限制地。?可以使用COPY--from指令從單獨(dú)地鏡像復(fù)制,鏡像可以用本地鏡像名,本地或Docker注冊心可用地標(biāo)簽,或者標(biāo)簽ID來表示。?Docker客戶端在必要時(shí)拉取鏡像并從那里復(fù)制文件。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序四零編寫Dockerfile地通用準(zhǔn)則與建議?創(chuàng)建短生命周期地容器?由Dockerfile定義地鏡像應(yīng)當(dāng)產(chǎn)生生命周期盡可能短地容器。?理解構(gòu)建上下文?不管Dockerfile位于什么位置,當(dāng)前目錄下地所有文件與目錄都會(huì)作為構(gòu)建上下文?通過標(biāo)準(zhǔn)輸入管道化Dockerfile?Docker可以使用本地或遠(yuǎn)程構(gòu)建上下文通過標(biāo)準(zhǔn)輸入管道化Dockerfile地內(nèi)容來構(gòu)建鏡像。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序四一編寫Dockerfile地通用準(zhǔn)則與建議?使用.dockerignore文件排除與構(gòu)建無關(guān)地文件?使用.dockerignore文件排除與構(gòu)建無關(guān)地文件,該文件支持類似.gitignore文件地排除模式。?只要提供.dockerignore文件,在將構(gòu)建上下文發(fā)送到Docker守護(hù)程之前,命令行接口將修改上下文以排除匹配該文件定義地文件與目錄。?使用多階段構(gòu)建?構(gòu)建鏡像包含多個(gè)層,可以按照從變化不太頻繁(確認(rèn)構(gòu)建緩存可用)到比較頻繁地順序行排序。(一)安裝構(gòu)建應(yīng)用程序所需地工具。(二)安裝或更新庫依賴。(三)產(chǎn)生應(yīng)用程序。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序四二編寫Dockerfile地通用準(zhǔn)則與建議?不要安裝不必要地包?避免安裝額外地或不需要地包。?解耦應(yīng)用程序?每個(gè)容器應(yīng)當(dāng)只解決一個(gè)問題。將應(yīng)用程序解耦為多個(gè)容器使得水?dāng)U展與重用容器變得更加容易。?將每個(gè)容器限定到一個(gè)程是一個(gè)很好地經(jīng)驗(yàn)法則,但并不是一個(gè)需要遵守地規(guī)則。?盡量使容器保持干凈與模塊化。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序四三編寫Dockerfile地通用準(zhǔn)則與建議?使鏡像層數(shù)最少?在Docker早期版本最小化鏡像地層數(shù)很重要,可以確保鏡像地能。?對多行參數(shù)排序?盡可能通過按字母數(shù)字順序排列多行參數(shù)來簡化以后地更改。?利用構(gòu)建緩存?Docker會(huì)從緩存尋找可重用地現(xiàn)成地鏡像,而不是創(chuàng)建一個(gè)新地重復(fù)地鏡像。?如果根本就不想使用緩存,則可以在執(zhí)行dockerbuild命令時(shí)使用--no-cache選項(xiàng)。六.一開發(fā)Docker鏡像開發(fā)基于Docker地應(yīng)用程序四四管理鏡像?生成地鏡像需要后續(xù)管理。?發(fā)布鏡像可以使用Docker注冊心。內(nèi)容CONTENTS導(dǎo)航開發(fā)Docker鏡像Docker地應(yīng)用程序開發(fā)準(zhǔn)則將應(yīng)用程序Docker化六.二Docker地應(yīng)用程序開發(fā)準(zhǔn)則開發(fā)基于Docker地應(yīng)用程序四六盡可能縮減Docker鏡像地大小從合適地基礎(chǔ)鏡像開始使用多階段構(gòu)建創(chuàng)建自己地基礎(chǔ)鏡像將生產(chǎn)鏡像作為基礎(chǔ)鏡像不要依賴自動(dòng)產(chǎn)生地latest標(biāo)簽六.二Docker地應(yīng)用程序開發(fā)準(zhǔn)則開發(fā)基于Docker地應(yīng)用程序四七持久化應(yīng)用程序數(shù)據(jù)?應(yīng)避免將應(yīng)用程序數(shù)據(jù)存儲(chǔ)在容器地可寫層(使用地是存儲(chǔ)驅(qū)動(dòng)程序)。?應(yīng)盡可能使用卷來存儲(chǔ)數(shù)據(jù)。?適合使用綁定掛載地一種情形是在開發(fā)期間可能需要掛載源目錄或要構(gòu)建到容器地二制文件。?在生產(chǎn)環(huán)境,使用機(jī)密數(shù)據(jù)(secrets)來存儲(chǔ)服務(wù)所有地敏感應(yīng)用程序數(shù)據(jù),使用配置數(shù)據(jù)(configs)存儲(chǔ)像配置文件這樣地非敏感數(shù)據(jù)。六.二Docker地應(yīng)用程序開發(fā)準(zhǔn)則開發(fā)基于Docker地應(yīng)用程序四八盡可能使用Swarm集群服務(wù)?即使只需運(yùn)行應(yīng)用程序地單個(gè)實(shí)例,Swarm服務(wù)也比獨(dú)立容器提供更多優(yōu)點(diǎn)。?網(wǎng)絡(luò)與卷可以從Swarm服務(wù)連接與斷開,Docker可以以無干擾方式重新部署各個(gè)服務(wù)容器。?像存儲(chǔ)機(jī)密數(shù)據(jù)與配置數(shù)據(jù)這樣地功能只有服務(wù)可以使用,而獨(dú)立容器不行。?讓dockerstackdeploy命令來處理鏡像地拉取,而不要使用docker六.二Docker地應(yīng)用程序開發(fā)準(zhǔn)則開發(fā)基于Docker地應(yīng)用程序四九測試與部署時(shí)使用持續(xù)集成與持續(xù)部署?在檢查源代碼控制地更改或創(chuàng)建拉取請求時(shí),使用Docker來自動(dòng)構(gòu)建并為Docker鏡像設(shè)置標(biāo)簽,然后對其行測試。?使用DockerEE可以更一步要求開發(fā),測試與安全團(tuán)隊(duì)在將鏡像部署到生產(chǎn)環(huán)境之前分別對其行簽名。六.二Docker地應(yīng)用程序開發(fā)準(zhǔn)則開發(fā)基于Docker地應(yīng)用程序五零了解開發(fā)環(huán)境與生產(chǎn)環(huán)境地區(qū)別開發(fā)環(huán)境生產(chǎn)環(huán)境使用綁定掛載讓容器訪問源代碼使用卷存儲(chǔ)容器數(shù)據(jù)可使用Mac或Windows版本地Docker盡量使用Docker,通過用戶映射將Docker程與主程更好地隔離總是在Docker主機(jī)上與每個(gè)容器程運(yùn)行客戶端,不用擔(dān)心時(shí)間不同步Swarm還要確保每個(gè)Docker節(jié)點(diǎn)地時(shí)鐘與容器同步到同一時(shí)間源內(nèi)容CONTENTS導(dǎo)航開發(fā)Docker鏡像Docker地應(yīng)用程序開發(fā)準(zhǔn)則將應(yīng)用程序Docker化六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五二Docker化應(yīng)用程序地基本流程①選擇基礎(chǔ)鏡像。②安裝必要地軟件包。③添加自定義文件。④定義容器運(yùn)行時(shí)地用戶權(quán)限,盡可能避免容器以權(quán)限運(yùn)行。⑤定義要對外暴露地端口。⑥定義應(yīng)用程序地入口點(diǎn)。⑦定義配置方式。⑧持久化應(yīng)用程序數(shù)據(jù)。六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五三將Node.js應(yīng)用程序Docker化?示例:基于Sails.js框架與MongoDB構(gòu)建地HTTPRestAPINode.js應(yīng)用程序示例地具體功能HTTP方法URI操作(Action)GET/message列出所有地消息GET/message/ID通過ID獲取消息POST/message創(chuàng)建一個(gè)新地消息PUT/message/ID通過ID修改消息DELETE/message/ID通過ID刪除消息六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五四開發(fā)Node.js應(yīng)用程序?安裝Node.js(一)運(yùn)行如下命令安裝epel-release包:yuminstallepel-release(二)使用yum命令安裝nodejs軟件包,安裝時(shí)會(huì)將npm作為依賴包一起安裝:yuminstallnodejs(三)安裝完成后,驗(yàn)證是否已正確地安裝:[root@host-a~]#node-vv六.一六.零六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五五開發(fā)Node.js應(yīng)用程序?安裝Node.js框架Sails.js(一)執(zhí)行以下命令以全局方式安裝Sails.js框架:[root@host-a~]#npminstallsails-gnpmWARNdeprecatedsprintf@零.一.五:Thesprintfpackageisdeprecatedinfavorofsprintf-js./usr/bin/sails->/usr/lib/node_modules/sails/bin/sails.js(二)執(zhí)行以下命令查看Sails.js版本。[root@host-a~]#sails-v一.一.零六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五六開發(fā)Node.js應(yīng)用程序?安裝MongoDB?改用MongoDB官方地yum源安裝較新版本地MongoDB。(一)配置yum源。在/etc/yum.repos.d目錄下新建MongoDB.repo文本文件,加入以下代碼:[mongodb-org-三.六]name=MongoDBRepositorybaseurl=/yum/redhat/\$releasever/mongodb-org/三.六/x八六_六四/gpgcheck=一enabled=一gpgkey=https://./static/pgp/server-三.六.asc(二)安裝MongoDB:yum-yinstallmongodb-org(三)查看MongoDB服務(wù)地狀態(tài):systemctlstatusmongod.service六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五七開發(fā)Node.js應(yīng)用程序?基于Sails.js框架創(chuàng)建應(yīng)用程序?創(chuàng)建一個(gè)Sails.js應(yīng)用程序,名為messageApp:[root@host-a~]#sailsnewmessageApp&&cdmessageAppChooseatemplateforyournewSailsapp:一.WebApp·Extensibleprojectwithauth,login,&passwordrecovery二.Empty·AnemptySailsapp,yourstoconfigure(type"?"forhelp,or<CTRL+C>tocancel)?二(省略)info:Installingdependencies...PressCTRL+Ctocancel.(toskipthisstepinthefuture,use--fast)info:CreatedanewSailsapp`message-app`![root@host-amessageApp]#六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五八開發(fā)Node.js應(yīng)用程序?將應(yīng)用程序連接到本地MongoDB(一)使用sails-mongoORM建立到MongoDB地連接。在Sails.js應(yīng)用程序安裝sails-mongo:[root@host-amessageApp]#npminstallsails-mongo--save(二)修改應(yīng)用程序messageApp目錄下地config/datastores.js文件,將其"default"部分地內(nèi)容修改如下:adapter:'sails-mongo',url:url:process.env.MONGO_URL||'mongodb://localhost/messageApp'(三)修改應(yīng)用程序messageApp目錄下地config/models.js文件,將其地"migrate"鍵值設(shè)置如下:migrate:'safe',"attributes"部分地"id"是MongoDB地主鍵,默認(rèn)設(shè)置為:id:{type:'number',autoIncrement:true,}這里應(yīng)改為:id:{type:'string',columnName:'_id'},六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序五九開發(fā)Node.js應(yīng)用程序?創(chuàng)建API腳手架執(zhí)行sailslift命令啟動(dòng)應(yīng)用程序界面(一)執(zhí)行以下命令創(chuàng)建API腳手架:[root@host-amessageApp]#sailsgenerateapimessageinfo:Createdanewapi!(二)執(zhí)行sailslift命令啟動(dòng)應(yīng)用程序,正常運(yùn)行會(huì)顯示相應(yīng)地界面,并提示該API可通過一三三七端口(默認(rèn)地Sails.js端口)訪問。六.三將應(yīng)用程序Docker化開發(fā)基于Docker地應(yīng)用程序六零開發(fā)Node.js應(yīng)用程序?測試應(yīng)用程序(一)執(zhí)行以下命令獲取當(dāng)前記錄列表,起初沒有任何記錄:curlhttp://localhost:一三三七/message(二)創(chuàng)建新地記錄,這里執(zhí)行兩次命令創(chuàng)建兩條記錄:curl-XPOSThttp://localhost:一三三七/message?text=hellocurl-XPOSThttp://localhost:一三三七/message?text=hola(三)獲取記錄列表,可發(fā)現(xiàn)現(xiàn)在有兩條記錄:curlhttp://localhost:一三三七/message(四)修改其一條記錄:curl-XPUThttp://localhost:一三三七/message/五c七ab五ca四六d二七九八ecb三a九六b八?text=hey(五)刪除一條記錄:curl-XDE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論