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

鏡像創(chuàng)建乏味耗時(shí)?為什么不用DockerFile

云計(jì)算
Dockerfile是為快速構(gòu)建Docker Image而設(shè)計(jì)的,它為構(gòu)建鏡像提供了簡(jiǎn)單的語(yǔ)法。Docker 會(huì)讀取當(dāng)前目錄下的命名為Dockerfile的純文本文件并執(zhí)行里面的指令構(gòu)建出一個(gè)Docker Image,這樣,在Docker中創(chuàng)建鏡像會(huì)更加簡(jiǎn)單,并且易用。本篇文章對(duì)DockerFile入門知識(shí)及在實(shí)踐過(guò)程中的使用技巧進(jìn)行綜合整理,希望能夠幫助您在使用Dockerfiles以及構(gòu)建鏡像時(shí)受益。

【編者的話】

Dockerfile是為快速構(gòu)建Docker Image而設(shè)計(jì)的,它為構(gòu)建鏡像提供了簡(jiǎn)單的語(yǔ)法。Docker 會(huì)讀取當(dāng)前目錄下的命名為Dockerfile的純文本文件并執(zhí)行里面的指令構(gòu)建出一個(gè)Docker Image,這樣,在Docker中創(chuàng)建鏡像會(huì)更加簡(jiǎn)單,并且易用。本篇文章對(duì)DockerFile入門知識(shí)及在實(shí)踐過(guò)程中的使用技巧進(jìn)行整合,希望能夠幫助您在使用Dockerfiles以及構(gòu)建鏡像時(shí)受益。

還記得我們介紹過(guò)的15個(gè)Docker命令嗎?那15個(gè)命令在手動(dòng)創(chuàng)建鏡像時(shí)會(huì)用到,它們涵蓋鏡像的創(chuàng)建、提交、搜索、pull和push的功能。

現(xiàn)在問(wèn)題來(lái)了,既然Docker能自動(dòng)創(chuàng)建鏡像,那為什么要選擇耗時(shí)而又乏味的方式來(lái)創(chuàng)建鏡像呢?

Docker為我們提供了Dockerfile來(lái)解決自動(dòng)化的問(wèn)題。在這篇文章中,我們將討論什么是Dockerfile,它能夠做到的事情以及DockerFile一些基本語(yǔ)法。

命令為易于自動(dòng)化

Dockerfile是包含創(chuàng)建鏡像所需要的全部指令。基于在DockerFile中的指令,我們可以使用Docker build命令來(lái)創(chuàng)建鏡像。通過(guò)減少鏡像和容器的創(chuàng)建過(guò)程來(lái)簡(jiǎn)化部署。

Dockerfiles支持支持的語(yǔ)法命令如下:

  1. INSTRUCTION argument 

指令不區(qū)分大小寫。但是,命名約定為全部大寫。

所有Dockerfile都必須以FROM命令開始。 FROM命令會(huì)指定鏡像基于哪個(gè)基礎(chǔ)鏡像創(chuàng)建,以及接下來(lái)的命令也會(huì)基于這個(gè)基礎(chǔ)鏡像(譯者注:CentOS和Ubuntu有些命令可是不一樣的)。FROM命令可以使用多次,表示會(huì)創(chuàng)建多個(gè)鏡像。具體語(yǔ)法如下:

  1. FROM <image name> 

例如:

  1. FROM ubuntu 

上面的指定告訴我們,新的鏡像將基于Ubuntu的鏡像來(lái)構(gòu)建。

繼FROM命令,DockefFile還提供了一些其它的命令以實(shí)現(xiàn)自動(dòng)化。在文本文件或Dockerfile文件中這些命令的順序就是它們被執(zhí)行的順序。

讓我們了解一下這些有趣的Dockerfile命令吧。

1. MAINTAINER:設(shè)置該鏡像的作者。語(yǔ)法如下:

  1. MAINTAINER <author name> 

2. RUN:在shell或者exec的環(huán)境下執(zhí)行的命令。RUN指令會(huì)在新創(chuàng)建的鏡像上添加新的層,接下來(lái)提交的結(jié)果用于在Dockerfile的下一條指令。語(yǔ)法如下:

  1. RUN 《command》 

3. ADD:復(fù)制文件指令,它有兩個(gè)參數(shù)<source>和<destination>。destination是容器內(nèi)的路徑。source可以是URL或者是啟動(dòng)配置上下文中的一個(gè)文件。語(yǔ)法如下:

  1. ADD 《src》 《destination》 

4. CMD:提供了容器默認(rèn)的執(zhí)行命令。 Dockerfile只允許CMD指令使用一次。 使用多個(gè)CMD會(huì)抵消之前所有的,只有最后一個(gè)生效。 CMD有三種形式:

  1. CMD ["executable","param1","param2"
  2. CMD ["param1","param2"
  3. CMD command param1 param2 

5. EXPOSE:指定容器在運(yùn)行時(shí)監(jiān)聽的端口。語(yǔ)法如下:

  1. EXPOSE <port>; 

6. ENTRYPOINT:配置容器一個(gè)可執(zhí)行的命令,這意味著在每次使用鏡像創(chuàng)建容器時(shí)一個(gè)特定的應(yīng)用程序可以被設(shè)置為默認(rèn)程序。同時(shí)也意味著該鏡像每次被調(diào)用時(shí)僅能運(yùn)行指定的應(yīng)用。類似于CMD,Docker只允許一個(gè)ENTRYPOINT,多個(gè)ENTRYPOINT會(huì)抵消之前所有的,只執(zhí)行最后的ENTRYPOINT指令。語(yǔ)法如下:

  1. ENTRYPOINT [‘executable’, ‘param1’,’param2’] 
  2. ENTRYPOINT command param1 param2 

7. WORKDIR:指定RUN、CMD與ENTRYPOINT命令的工作目錄。語(yǔ)法如下:

  1. WORKDIR /path/to/workdir 

8. ENV:設(shè)置環(huán)境變量。它們使用鍵值對(duì),并增加運(yùn)行的程序的靈活性。語(yǔ)法如下:

  1. ENV <key> <value> 

9. USER:鏡像正在運(yùn)行時(shí)設(shè)置一個(gè)UID。語(yǔ)法如下:

  1. USER <uid> 

10. VOLUME:授權(quán)訪問(wèn)從容器內(nèi)到主機(jī)上的目錄。語(yǔ)法如下:

  1. VOLUME ['/data'

#p#

DockerFile最佳實(shí)踐

正如任何使用的應(yīng)用程序,總會(huì)有遵循的最佳實(shí)踐。Dockerfiles為構(gòu)建鏡像提供了簡(jiǎn)單的語(yǔ)法。下面我們來(lái)看看在緩存、標(biāo)簽、端口以及CMD與ENTRYPOINT這些方面,一些使用dockerfile的提示與技巧。

1:使用緩存

Dockerfile的每條指令都會(huì)將更改提交到新的鏡像,該鏡像將被用于下一個(gè)指令的基礎(chǔ)鏡像。如果一個(gè)鏡像存在相同的父類鏡像和指令(除了ADD)Docker將會(huì)使用鏡像而不是執(zhí)行該指令,即緩存。

為了有效地利用緩存,你需要保持你的Dockerfiles一致,并且改建在末尾添加。我所有的Dockerfiles開始于以下五行:

  1. FROM ubuntu 
  2.  
  3. MAINTAINER Michael Crosby <michael@crosbymichael.com> 
  4.  
  5. RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list 
  6.  
  7. RUN apt-get update 
  8.  
  9. RUN apt-get upgrade -y 

更改MAINTAINER指令會(huì)使Docker強(qiáng)制執(zhí)行RUN指令來(lái)更新apt,而不是使用緩存。

保持常用的Dockerfile指令在頂部來(lái)利用緩存。

2:使用標(biāo)簽

除非你正在用Docker做實(shí)驗(yàn),否則你應(yīng)當(dāng)通過(guò)-t選項(xiàng)來(lái)docker build新的鏡像以便于標(biāo)記構(gòu)建的鏡像。一個(gè)簡(jiǎn)單的可讀標(biāo)簽將幫助您管理每個(gè)創(chuàng)建的鏡像。

docker build -t=&quot;crosbymichael/sentry&quot; .

始終通過(guò)-t標(biāo)記來(lái)構(gòu)建鏡像。

3:公開端口

兩個(gè)Docker的核心概念是可重復(fù)和可移植。鏡像應(yīng)該能運(yùn)行在任何主機(jī)上并且能運(yùn)行盡可能多的次數(shù)。在Dockerfiles中您有能力映射私有和公有端口,但是你永遠(yuǎn)不要在Dockerfile中映射公有端口。通過(guò)映射公有端口到主機(jī)上,你將只能運(yùn)行一個(gè)容器化應(yīng)用程序?qū)嵗?/p>

  1. private and public mapping 
  2. EXPOSE 80:8080 
  3.  
  4. private only 
  5. EXPOSE 80 

如果鏡像的消費(fèi)者關(guān)心容器公有映射了哪個(gè)公有端口,他們可以在運(yùn)行鏡像時(shí)設(shè)置-p選項(xiàng),否則,Docker會(huì)給容器自動(dòng)分配端口。

切勿在Dockerfile映射公有端口。

4:CMD與ENTRYPOINT的語(yǔ)法

無(wú)論CMD還是ENTRYPOINT都是直線前進(jìn)的,但他們有一個(gè)隱藏的錯(cuò)誤“功能”,如果你不知道的話他們可能會(huì)觸發(fā)問(wèn)題。這些指令支持的兩種不同的語(yǔ)法。

  1. CMD /bin/echo 
  2. #or 
  3. CMD ["/bin/echo"

這看起來(lái)好像沒什么問(wèn)題,但深入細(xì)節(jié)里的魔鬼會(huì)將你絆倒。如果你使用第二個(gè)語(yǔ)法:CMD(或ENTRYPOINT)是一個(gè)數(shù)組,它執(zhí)行的命令完全像你期望的那樣。如果使用第一種語(yǔ)法,Docker會(huì)在你的命令前面加上/bin/sh -c。我記得一直都是這樣。

如果你不知道Docker修改了CMD命令,在命令前加上/bin/sh -c可能會(huì)導(dǎo)致一些意想不到的問(wèn)題以及不容易理解的功能。因此,在使用這兩個(gè)指令你應(yīng)當(dāng)總是使用數(shù)組語(yǔ)法,因?yàn)閮烧叨紩?huì)確切地執(zhí)行你打算執(zhí)行的命令。

使用CMD和ENTRYPOINT時(shí),請(qǐng)務(wù)必使用數(shù)組語(yǔ)法。

5. CMD和ENTRYPOINT 聯(lián)合使用更好

以防你不知道ENTRYPOINT使您的容器化應(yīng)用程序運(yùn)行得像一個(gè)二進(jìn)制文件,您可以在docker run期間給ENTRYPOINT參數(shù)傳遞,而不是擔(dān)心它被覆蓋(跟CMD不同)。當(dāng)與CMD一起使用時(shí)ENTRYPOINT表現(xiàn)會(huì)更好。讓我們來(lái)研究一下我的Rethinkdb Dockerfile,看看如何使用它。

  1. #Dockerfile for Rethinkdb 
  2. #http://www.rethinkdb.com/ 
  3.  
  4. FROM ubuntu 
  5.  
  6. MAINTAINER Michael Crosby <michael@crosbymichael.com> 
  7.  
  8. RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list 
  9. RUN apt-get update 
  10. RUN apt-get upgrade -y 
  11.  
  12. RUN apt-get install -y python-software-properties 
  13. RUN add-apt-repository ppa:rethinkdb/ppa 
  14. RUN apt-get update 
  15. RUN apt-get install -y rethinkdb 
  16.  
  17. #Rethinkdb process 
  18. EXPOSE 28015 
  19. #Rethinkdb admin console 
  20. EXPOSE 8080 
  21.  
  22. #Create the /rethinkdb_data dir structure 
  23. RUN /usr/bin/rethinkdb create 
  24.  
  25. ENTRYPOINT ["/usr/bin/rethinkdb"
  26.  
  27. CMD ["--help"

這是獲得容器化Rethinkdb全部所需。在頂部我們有標(biāo)準(zhǔn)的5行來(lái)確保基礎(chǔ)鏡像是最新的,端口的公開等等......隨著ENTRYPOINT的設(shè)置,我們知道每當(dāng)這個(gè)鏡像運(yùn)行,在docker run過(guò)程中傳遞的所有參數(shù)將成為ENTRYPOINT(/usr/bin/rethinkdb)的參數(shù)。

在Dockerfile中我還設(shè)置了一個(gè)默認(rèn)CMD參數(shù)--help。這樣做是為了docker run期間如果沒有參數(shù)的傳遞,rethinkdb將會(huì)給用戶顯示默認(rèn)的幫助文檔。這是你所期望的與rethinkdb交互有著相同的功能。

  1. docker run crosbymichael/rethinkdb 

輸出

  1. Running 'rethinkdb' will create a new data directory or use an existing one, 
  2. and serve as a RethinkDB cluster node. 
  3. File path options: 
  4. -d [ --directory ] path specify directory to store data and metadata 
  5. --io-threads n how many simultaneous I/O operations can happen 
  6. at the same time 
  7.  
  8. Machine name options: 
  9. -n [ --machine-name ] arg the name for this machine (as will appear in 
  10. the metadata). If not specified, it will be 
  11. randomly chosen from a short list of names. 
  12.  
  13. Network options: 
  14. --bind {all | addr} add the address of a local interface to listen 
  15. on when accepting connections; loopback 
  16. addresses are enabled by default 
  17. --cluster-port port port for receiving connections from other nodes 
  18. --driver-port port port for rethinkdb protocol client drivers 
  19. -o [ --port-offset ] offset all ports used locally will have this value 
  20. added 
  21. -j [ --join ] host:port host and port of a rethinkdb node to connect to 
  22. ................. 

現(xiàn)在,讓我們帶上--bind all參數(shù)來(lái)運(yùn)行容器。

  1. docker run crosbymichael/rethinkdb --bind all 

輸出

  1. info: Running rethinkdb 1.7.1-0ubuntu1~precise (GCC 4.6.3)... 
  2. info: Running on Linux 3.2.0-45-virtual x86_64 
  3. info: Loading data from directory /rethinkdb_data 
  4. warn: Could not turn off filesystem caching for database file: "/rethinkdb_data/metadata" (Is the file located on a filesystem that doesn't support direct I/O (e.g. some encrypted or journaled file systems)?) This can cause performance problems. 
  5. warn: Could not turn off filesystem caching for database file: "/rethinkdb_data/auth_metadata" (Is the file located on a filesystem that doesn't support direct I/O (e.g. some encrypted or journaled file systems)?) This can cause performance problems. 
  6. info: Listening for intracluster connections on port 29015 
  7. info: Listening for client driver connections on port 28015 
  8. info: Listening for administrative HTTP connections on port 8080 
  9. info: Listening on addresses: 127.0.0.1172.16.42.13 
  10. info: Server ready 
  11. info: Someone asked for the nonwhitelisted file /js/handlebars.runtime-1.0.0.beta.6.js, if this should be accessible add it to the whitelist. 

就這樣,一個(gè)全面的可以訪問(wèn)db和管理控制臺(tái)的Rethinkdb實(shí)例就運(yùn)行起來(lái)了,你可以用與鏡像交互一樣的方式來(lái)與其交互。它功能非常強(qiáng)大但是簡(jiǎn)單小巧。當(dāng)然,我喜歡簡(jiǎn)單。

CMD和ENTRYPOINT 結(jié)合在一起使用更好。

我希望這篇文章可以使您在使用Dockerfiles以及構(gòu)建鏡像時(shí)受益。展望未來(lái),我相信Dockerfiles會(huì)成為Docker的重要一部分:簡(jiǎn)單而且使用方便無(wú)論你是消費(fèi)或是生產(chǎn)鏡像。我打算投入更多的時(shí)間來(lái)提供一個(gè)完整的,功能強(qiáng)大,但簡(jiǎn)單的解決方案來(lái)使用Dockerfile構(gòu)建Docker鏡像。

本文整理自文章:http://dockerone.com/article/103 & http://dockerone.com/article/131

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

2020-09-25 08:10:55

Rust系統(tǒng)編程

2023-06-06 09:03:06

InnodbMySQL

2020-06-19 14:55:11

Kubernetes容器技術(shù)

2019-03-11 08:36:11

Python代碼Flask

2021-05-06 06:53:39

DockerGoogleFacebook

2022-08-04 18:30:59

DockerfileDocker 鏡像Linux

2019-05-15 08:29:56

Web面板運(yùn)維

2009-12-14 18:27:21

Linux操作系統(tǒng)

2018-11-16 05:00:35

網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)安全網(wǎng)絡(luò)威脅

2020-07-08 09:30:29

Python編程語(yǔ)言終止符

2009-07-07 17:18:57

Facelets介紹JSP與Facelet

2020-08-07 14:24:34

諾基亞安卓塞班系統(tǒng)

2025-03-25 07:10:00

開發(fā)前端JavaScript

2024-11-04 09:26:42

RESTJavaAPI

2018-10-11 15:51:32

ChromeGoogle瀏覽器

2024-07-19 10:03:29

2024-01-31 08:15:40

Git服務(wù)器GitLab

2022-05-25 08:00:00

開發(fā)微服務(wù)企業(yè)

2025-04-08 07:30:00

前端開發(fā)JavaScript

2022-08-11 08:31:25

QQQQ等級(jí)馬化騰
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产国语精品 | 国产高清视频 | 日本精品国产 | 91亚洲国产成人久久精品网站 | 一级毛片成人免费看a | 精品国产一区二区三区在线观看 | 国产91综合| 日本手机在线 | 亚洲高清在线免费观看 | 日日干日日操 | 久久久久久久久久一区 | 91一区二区 | 91传媒在线观看 | 中文字幕免费视频 | 久久男人| 综合五月 | 99色在线视频 | 97久久精品午夜一区二区 | 99久久婷婷国产综合精品首页 | 欧美一级大黄 | 中日韩欧美一级片 | 蜜桃毛片 | 亚洲精品一区二区三区蜜桃久 | 国产亚洲久 | 久久久久国产精品 | 欧美一区二区三区免费在线观看 | 九九亚洲 | 夜久久 | 日韩网站在线观看 | 伊人爽 | 久久视频免费观看 | 欧美激情精品久久久久 | 中文字幕高清在线 | 天天玩天天干天天操 | 成人免费网站视频 | 在线观看亚洲精品视频 | caoporn视频| 一区二视频 | 毛片网站在线观看视频 | 亚洲精品久久久久久久久久久 | 国产成人精品一区二区三区四区 |