成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Dockerfile構(gòu)建docker image

云計(jì)算
dockerfile是為快速構(gòu)建docker image而設(shè)計(jì)的,當(dāng)你使用docker build 命令的時(shí)候,docker 會(huì)讀取當(dāng)前目錄下的命名為Dockerfile(首字母大寫)的純文本文件并執(zhí)行里面的指令構(gòu)建出一個(gè)docker image。這種方法會(huì)更加自動(dòng)化,更加方便快捷,而且功能也更強(qiáng)

dockerfile是為快速構(gòu)建docker image而設(shè)計(jì)的,當(dāng)你使用docker build 命令的時(shí)候,docker 會(huì)讀取當(dāng)前目錄下的命名為Dockerfile(首字母大寫)的純文本文件并執(zhí)行里面的指令構(gòu)建出一個(gè)docker image。

而另一種構(gòu)建docker iamge 的方法是pull一些基礎(chǔ)鏡像下來(lái)啟動(dòng)成容器,然后進(jìn)入容器內(nèi)安裝各種需要的程序以及配置好需要的環(huán)境,最后commit成一個(gè)鏡像。但是相比之 Dockerfile的方法會(huì)更加自動(dòng)化,更加方便快捷,而且功能也更強(qiáng)大。(Docker build方法底層里也是在基礎(chǔ)鏡像下啟動(dòng)容器然后commit的,但是這些不需要我們手動(dòng)去commit以及rm,都是自動(dòng)化的。)

 

======(注:以下大部分內(nèi)容均參考自官方文檔)

首先,是關(guān)于構(gòu)建docker image的一些優(yōu)化建議

我們希望構(gòu)建出的image對(duì)應(yīng)的容器應(yīng)該是可以在服務(wù)群中暫停(解耦性)并且快速替換,這要求容器可以在極短的時(shí)間內(nèi)完成啟動(dòng)并配置運(yùn)行起來(lái)。

優(yōu)化手段:

 

使用.dockerignore文件 .

dockerignore文件的設(shè)計(jì)是為了在docker build的過(guò)程中排除不需要用到的文件以及目錄,目的是為了docker build這個(gè)過(guò)程可以盡可能地快速高效以及構(gòu)建出來(lái)的image沒有多余的“垃圾”。

 

不要安裝不必要的程序包

我們希望構(gòu)建出來(lái)的image盡可以的輕小、依賴性小以及構(gòu)建過(guò)程盡可能地快。這就需要你在構(gòu)建的時(shí)候不要安裝不必要的程序,例如,一個(gè)存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù)容器不需要安裝文本編輯器。

 

單一容器只運(yùn)行單一的服務(wù)

大部分情況下一個(gè)容器只建議運(yùn)行一個(gè)服務(wù),這樣的好處在于:減小耦合度、利于容器復(fù)用以及提高容器的橫向可擴(kuò)展性。如果服務(wù)之間是需要聯(lián)系的,就應(yīng)該把服務(wù)放在不現(xiàn)的容器內(nèi),然后用container linking來(lái)關(guān)聯(lián)這些容器以達(dá)到目的。

 

最小化鏡像層數(shù)(layers)

關(guān)于鏡像層數(shù)(layers)的概念請(qǐng)參考:docker鏡像與容器存儲(chǔ)結(jié)構(gòu)分析http://www.programfish.com/blog/?p=9

把鏡像層數(shù)減到最少可能加快容器的啟動(dòng)速度,但是這里也要權(quán)衡另一個(gè)問(wèn)題:dockerfile的可讀性。你可以把一個(gè)dockerfile寫得很 復(fù)雜以達(dá)到構(gòu)建出最小層數(shù)的鏡像,但同時(shí)你的dockerfile可讀性也降低了。所以我們要在鏡像層數(shù)和dockerfile可讀性之間做出讓步與妥 協(xié)。

 

對(duì)多行參數(shù)進(jìn)行排序(一般按字母順序)

對(duì)參數(shù)排序可以方便以后修改更新這些參數(shù)以及確保不會(huì)重復(fù)重復(fù)輸入了某些參數(shù)。例如官方的一個(gè)例子是:

  1. RUN apt-get update && apt-get install -y \ 
  2. bzr \ 
  3. cvs \ 
  4. git \ 
  5. mercurial \ 
  6. Subversion 

把要安裝的程序包名按字母排序可以方便管理。

 

構(gòu)建的時(shí)候使用cache

Docker build期間docker會(huì)按你提供的dockerfile文件里面的指令按順序逐條執(zhí)行。Docker在首先檢查每一條指令的時(shí)候會(huì)去cache里搜 查是否有執(zhí)行過(guò)這條指令并且可以復(fù)用的鏡像,如果沒有再去構(gòu)造一個(gè)新的鏡像。這是默認(rèn)的情況,如果你指定不要這個(gè)過(guò)程可以在docker build里用如下參數(shù):

  1. –no-cache=true 

Docker查找cache的過(guò)程:

首先在cache里從base image(詳見:docker鏡像與容器存儲(chǔ)結(jié)構(gòu)分析http://www.programfish.com/blog/?p=9)起,docker會(huì)比較dockerfile里的下一條指令與這個(gè)base image的每一個(gè)子鏡像的構(gòu)建指令是否匹配,如果匹配則命中,否則cache標(biāo)為無(wú)效。

對(duì)于一般指令這樣簡(jiǎn)單比較就足夠了,但是有些精確的指令要求更詳細(xì)精確的比較或者說(shuō)明。 (add和copy指令見官方文檔https://docs.docker.com/articles/dockerfile_best-practices/) 一旦cache在dockerifle里某一條指令檢查時(shí)被標(biāo)為無(wú)效,執(zhí)行這個(gè)dockerfile以后的指令就不再使用cache。

 

Dockerfile主要指令簡(jiǎn)介:

 

FROM  

dockerfile里的第一條指令,后面跟有效的鏡像名(如果該鏡像你的本地倉(cāng)庫(kù)沒有則會(huì)從遠(yuǎn)程倉(cāng)庫(kù)Pull取)。后面的指令在些鏡像中執(zhí)行。

  1. FROM <image>:<tag> 
  2. MAINTAINER 
  3. MAINTAINER <name> 作者信息 

 

RUN

后跟要執(zhí)行的linux命令,每一條RUN指令(可能會(huì)有多條linux命令)會(huì)在當(dāng)前容器最上面的可讀寫層執(zhí)行并且提交成一個(gè)新的鏡像層,接下來(lái)的指令會(huì)在這個(gè)新的鏡像層里執(zhí)行。

 

  1. RUN <command> (the command is run in a shell – /bin/sh -c – shell form) 
  2. RUN ["executable""param1""param2"] (exec form) 

注意下面的情況:  

不要在一條RUN指令里單一使用apt-get update命令,這樣可能會(huì)導(dǎo)致以后的apt-get install 安裝出錯(cuò)。

避免使用RUN apt-get upgrade 或者dist-upgrade,這樣有些重要的軟件包可能更新失敗,如果你確實(shí)想要更新某個(gè)包A,使用apt-get install install -y A 。這樣會(huì)自動(dòng)更新這個(gè)軟件包。

更多請(qǐng)參考官方文檔。

 

CMD

CMD指令指定你制作出來(lái)的鏡像在啟動(dòng)成容器時(shí)運(yùn)行命令的默認(rèn)的參數(shù)。

CMD有三種寫法:

  1. CMD ["executable","param1","param2"] (exec form, this is the preferred form)  
  2. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)  
  3. CMD command param1 param2 (shell form)  

第一種是可執(zhí)行文件加參數(shù),第二種是作為ENTRYPOINT的參數(shù),第三種是作為”/bin/sh -c”的參數(shù)。

這里CMD與ENTRYPOINT的區(qū)別強(qiáng)烈推薦你去看 論docker CMD與ENTRYPOINT的大區(qū)別 http://www.cnblogs.com/programfish/p/4101884.html 這篇文章。看完你就懂了。

 

ENTRYPOINT

ENTRYPOINT字面意思指定容器的進(jìn)入點(diǎn)。可以把你的容器制作成類似可執(zhí)行文件的用法。這個(gè)指令會(huì)覆蓋它前面的CMD指令,而多個(gè) ENTRYPOINT指令只有最后一個(gè)生效(后面覆蓋前面)。同時(shí)你也可以在在啟動(dòng)container 的時(shí)候指定–entrypoint參數(shù)來(lái)覆蓋dockerfile里的ENTRYPOINT。詳見官方文檔。

例如我用了這樣的指令制作鏡像名叫echotest:

  1. ENTRYPOINT ["/bin/echo"

然后之后這樣運(yùn)行:

  1. docker run -it echotest “this is a echo” 

實(shí)際上是平時(shí)這樣的命令:

  1. docker run -it echotest /bin/echo “this is a echo” 

這樣你應(yīng)該明白了吧。 這樣一個(gè)容器的行為就很類似一個(gè)可執(zhí)行文件了。 這里CMD與ENTRYPOINT的區(qū)別強(qiáng)烈推薦你去看 論docker CMD與ENTRYPOINT的大區(qū)別 http://www.cnblogs.com/programfish/p/4101884.html 這篇文章。看完你就懂了。

EXPOSE

EXPOSE指定容器對(duì)外暴露的端口號(hào)。

 

ENV

指定環(huán)境變量的值,例如你要確保CMD[“nginx”]能成功啟動(dòng),你應(yīng)該用ENV PATH /usr/local/nginx/bin:$PATH設(shè)定環(huán)境變量。另外你可以設(shè)定另外一些變量用于RUN命令里以便于dockerfile文件的維護(hù):

  1. ENV PG_MAJOR 9.3 
  2. ENV PG_VERSION 9.3.4 
  3. RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && … 
  4. ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH 

這樣多次出現(xiàn)版本號(hào)就可以通過(guò)一個(gè)變量來(lái)管理方便維護(hù)。

 

  1. VOLUME    
  2. VOLUME ["path"] 創(chuàng)建指定的掛載點(diǎn)。 
  3. WORKDIR  

進(jìn)入指定目錄工作。

其它指令詳情見官方文檔:https://docs.docker.com/reference/builder/

 

這里引用官方的一個(gè)dockerfile例子:

  1. # Nginx 
  2. # VERSION 0.0.1 
  3. FROM ubuntu 
  4. MAINTAINER Victor Vieux <victor@docker.com> 
  5. RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server 
  6. # Firefox over VNC 
  7. # VERSION 0.3 
  8. FROM ubuntu 
  9. # Install vnc, xvfb in order to create a ‘fake’ display and firefox 
  10. RUN apt-get update && apt-get install -y x11vnc xvfb firefox 
  11. RUN mkdir ~/.vnc 
  12. # Setup a password 
  13. RUN x11vnc -storepasswd 1234 ~/.vnc/passwd 
  14. # Autostart firefox (might not be the best way, but it does the trick) 
  15. RUN bash -c ‘echo “firefox” >> /.bashrc ‘ 
  16. EXPOSE 5900 
  17. CMD ["x11vnc""-forever" , "-usepw""-create" ] 
  18. # Multiple images example 
  19. #VERSION 0.1 
  20. FROM ubuntu 
  21. RUN echo foo > bar 
  22. # Will output something like ===> 907ad6c2736f 
  23. FROM ubuntu 
  24. RUN echo moo > oink 
  25. # Will output something like ===> 695d7793cbe4 
  26. # You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with 
  27. # /oink. 

 

#號(hào)為注釋符,這里一個(gè)dockerfile構(gòu)建4個(gè)鏡像。

寫好Dockerfile文件后就可以在該目錄下運(yùn)行docker build . 命令了(可以用 -t 參數(shù)指定tag)。

原文出自:http://www.cnblogs.com/programfish/p/4104365.html

責(zé)任編輯:Ophira 來(lái)源: 博客園
相關(guān)推薦

2016-07-01 14:43:32

DockerServerless

2023-06-08 07:37:42

Docker容器

2019-10-21 11:43:00

DockerGradleJava

2021-04-28 10:30:46

BuildKitDockerfileLinux

2024-05-06 08:07:01

Spring項(xiàng)目Java

2018-04-20 15:24:55

DockerfileDocker鏡像

2018-04-24 15:15:51

Dockerfile命令Docker

2020-10-18 08:51:18

Spring Boot

2022-05-26 08:31:41

分層機(jī)制優(yōu)化

2015-07-15 11:31:49

Docker云服務(wù)鏡像構(gòu)建

2023-11-09 14:44:27

Docker鏡像容器

2022-05-25 16:48:25

數(shù)據(jù)卷Docker

2022-10-14 07:07:46

架構(gòu)

2023-09-12 08:03:49

容器鏡像

2016-12-07 09:27:11

KNIME大數(shù)據(jù)網(wǎng)絡(luò)

2020-11-03 16:42:46

容器Dockerfile技術(shù)

2021-05-13 23:54:12

DockerDockerfile鏡像

2023-08-04 08:20:56

DockerfileDocker工具

2024-03-06 18:11:06

Docker鏡像技術(shù)

2019-07-29 08:00:18

文件容器Docker Comp
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产不卡一区 | 亚洲精品字幕 | 一区二区三区在线 | 中文字幕亚洲精品 | 天天看天天干 | 岛国av一区二区 | 欧美日韩专区 | 成人性视频免费网站 | 天天操天天拍 | 一区中文字幕 | 日日夜夜免费精品视频 | 国产成人免费视频网站视频社区 | 久久综合一区二区三区 | 国产丝袜一区二区三区免费视频 | 天天操夜夜操 | 国产一伦一伦一伦 | 91精品国产综合久久精品图片 | 欧美高清成人 | 欧美日韩在线一区二区 | 最大av在线| 999精品在线 | 成人av免费 | 成人二区 | 日韩精品一区在线观看 | 91麻豆精品国产91久久久久久 | 夜夜爽99久久国产综合精品女不卡 | 亚洲一区二区免费视频 | www.色综合| www.操.com| 久久久久亚洲精品 | av中文字幕在线观看 | 国产一区二区免费电影 | 美女一级毛片 | 欧美中文一区 | 国产精品美女久久久久久久久久久 | 亚洲网址在线观看 | 欧美在线一区二区三区 | 九色av | 宅男噜噜噜66一区二区 | 国产精品久久久免费 | 九九久久精品 |