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

Docker—Git部署

開(kāi)發(fā) 前端
我一直聽(tīng)說(shuō)Docker是個(gè)很棒的新事物,但是我一直提不起興趣,直到我遇到一個(gè)切實(shí)的問(wèn)題: 如果通過(guò)Docker來(lái)部署 Scout ,這么做會(huì)輕松一些嗎?

我一直聽(tīng)說(shuō)Docker是個(gè)很棒的新事物,但是我一直提不起興趣,直到我遇到一個(gè)切實(shí)的問(wèn)題: 如果通過(guò)Docker來(lái)部署 Scout ,這么做會(huì)輕松一些嗎?

下面我將分三部分來(lái)闡述。

哇哦, 有效的模擬生產(chǎn)環(huán)境的方法

真實(shí)生產(chǎn)環(huán)境中有16臺(tái)服務(wù)器。如果我嘗試用虛擬機(jī)去模擬的話,每個(gè)VirtualBox實(shí)例***能有512MB內(nèi)存。這樣的內(nèi)存需求是我筆記本內(nèi)存的兩倍大。此外VirtualBox還有許多限制,比如使用單獨(dú)的系統(tǒng)內(nèi)核和文件系統(tǒng)。但是這些限制對(duì)于Docker都不算個(gè)事,Docker的containers是共享一個(gè)宿主機(jī)器的系統(tǒng)的,甚至可能是同一個(gè)程序和庫(kù)。一臺(tái)Docker宿主機(jī)器上運(yùn)行數(shù)百個(gè)containers也不是什么問(wèn)題。

老辦法

我實(shí)在沒(méi)辦法在本地模擬一個(gè)完全真實(shí)的環(huán)境,但是我們只要看一下啟動(dòng)一臺(tái)虛擬機(jī)使用的時(shí)間:

  1. $time vagrant up 
  2. Bringing machine 'default' up with 'virtualbox' provider... 
  3. [default] Importing base box 'squeeze64-ruby193'... 
  4. ... 
  5. [default] Booting VM... 
  6. [default] Waiting for VM to boot. This can take a few minutes. 
  7. ... 
  8.  
  9. real  1m32.052s 

啟動(dòng)一個(gè)鏡像超過(guò)了一分半鐘。那我要簡(jiǎn)單修改下配置怎么辦啊?那我要驗(yàn)證下可行性呢,那是不是又得重啟?又是一分半鐘了啊。

這分明就是個(gè)殘酷的懲罰嘛。

使用Docker

Docker到底有多么輕量級(jí)? 當(dāng)你在Docker container中運(yùn)行個(gè)進(jìn)程時(shí),你甚至都可能忘記這個(gè)進(jìn)程竟然不是直接運(yùn)行在主機(jī)上的。在下面的例子中,我運(yùn)行一個(gè)叫“rails”的鏡像在Docker container中,那里是個(gè)Rails App (Dockerfile):

  1. root@precise64:~# docker run rails 
  2. 2013-08-26 20:21:14,600 CRIT Supervisor running as root (no user in config file) 
  3. 2013-08-26 20:21:14,603 WARN Included extra file "/srv/docker-rails/Supervisorfile" during parsing 
  4. 2013-08-26 20:21:14,736 INFO RPC interface 'supervisor' initialized 
  5. 2013-08-26 20:21:14,740 CRIT Server 'unix_http_server' running without any HTTP authentication checking 
  6. 2013-08-26 20:21:14,754 INFO supervisord started with pid 1 
  7. 2013-08-26 20:21:15,783 INFO spawned: 'rails' with pid 10 
  8. 2013-08-26 20:21:16,841 INFO success: rails entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 

開(kāi)始container和啟動(dòng)supervisor (這是負(fù)責(zé)開(kāi)始Rails app的)一個(gè)只用了2秒

簡(jiǎn)而言之,Docker絕對(duì)勝任在你的開(kāi)發(fā)電腦上虛擬出一個(gè)完整的生產(chǎn)環(huán)境,而且很快。既然這么簡(jiǎn)單,來(lái),開(kāi)動(dòng)起來(lái)吧:我要徹底測(cè)試一下

構(gòu)建鏡像如此方便快捷 - 緩存萬(wàn)歲!

老方法

如果你想把從空鏡像到一個(gè)功能鏡像的構(gòu)建過(guò)程腳本化(例如:在Ubuntu上怎么安裝一個(gè)Rails stack),要是你不是經(jīng)常干這事,那么正確獲得所有的流,這絕對(duì)會(huì)是個(gè)痛苦的活兒。看看為Ruby安裝依賴吧:

  1. $time apt-get install -y -q ruby1.9.1 ruby1.9.1-dev rubygems1.9.1 irb1.9.1 build-essential libopenssl-ruby1.9.1 libssl-dev zlib1g-dev 
  2. Reading package lists... 
  3. Building dependency tree... 
  4. The following extra packages will be installed: 
  5. .... 
  6. Setting up libalgorithm-merge-perl (0.08-2) ... 
  7. Processing triggers for libc-bin ... 
  8. ldconfig deferred processing now taking place 
  9.  
  10. real 1m22.470s 

然后,你想裝了NodeJS的依賴,但是忘了給apt添加源了:

  1. $apt-get install -y nodejs 
  2. ... 
  3. E: Unable to locate package nodejs 

解決了源的問(wèn)題后,你得確認(rèn)你的腳本在新鏡像中會(huì)不會(huì)有問(wèn)題。那么你需要重裝Ruby,好吧,又要浪費(fèi)82秒了。正是神煩。

使用Docker

在Docker中,是把構(gòu)建鏡像的步驟放到Dockerfile. Dockerfiles是非常容易閱讀的,因?yàn)槟愀静恍枰獙W(xué)習(xí)DSL - 這就是些你輸入時(shí)記錄下來(lái)的基本命令。***次安裝Ruby會(huì)有點(diǎn)麻煩,但是讓我們看看,通過(guò)Dockerfile來(lái)構(gòu)建余下的鏡像會(huì)發(fā)生什么:

  1. FROM ubuntu:12.04 
  2. RUN apt-get update 
  3.  
  4. ## MYSQL 
  5. RUN apt-get install -y -q mysql-client libmysqlclient-dev 
  6.  
  7. ## RUBY 
  8. RUN apt-get install -y -q ruby1.9.1 ruby1.9.1-dev rubygems1.9.1 irb1.9.1 build-essential libopenssl-ruby1.9.1 libssl-dev zlib1g-dev
  1. root@precise64:/# time docker build -t="dlite/appserver" . 
  2. Uploading context 92160 bytes 
  3. Step 1 : FROM ubuntu:12.04 
  4.  ---> 8dbd9e392a96 
  5. Step 2 : RUN apt-get update 
  6.  ---> Using cache 
  7.  ---> b55e9ee7b959 
  8. Step 3 : RUN apt-get install -y -q mysql-client libmysqlclient-dev 
  9.  ---> Using cache 
  10.  ---> dc92be6158b0 
  11. Step 4 : RUN apt-get install -y -q ruby1.9.1 ruby1.9.1-dev rubygems1.9.1 irb1.9.1 build-essential libopenssl-ruby1.9.1 libssl-dev zlib1g-dev 
  12.  ---> Using cache 
  13.  ---> 7038022227c0 
  14. Successfully built 7038022227c0 
  15.  
  16. real    0m0.848s 

#p#

部署鏡像, 別更新基礎(chǔ)環(huán)境

老辦法

像許多其他部署一樣,Scout也使用長(zhǎng)期運(yùn)行的虛擬機(jī)。我們通過(guò)Puppet來(lái)更新基礎(chǔ)環(huán)境,但是, 這經(jīng)常比我們想象得要痛苦:

  • 如果我們要更新stack, Puppet將運(yùn)行虛擬機(jī)然后更新。這將花費(fèi)很長(zhǎng)時(shí)間-即使只是一小部分的stack需要更新,但是Puppet仍然會(huì)檢查全部。
  • 部署過(guò)程中也可能有問(wèn)題。如果我們正在安裝Memcached,突然網(wǎng)絡(luò)中斷了一小下,那么apt-get install memcached的指令可能就會(huì)無(wú)效了。
  • 回滾主要變化,這也時(shí)常不是想象中那么順利(像更新Ruby版本).

這些都是Puppet's的毛病 - 像Puppet或者Chef這樣的工具是非常重要,特別當(dāng)你有著一些長(zhǎng)時(shí)間運(yùn)行的虛擬機(jī),這些虛擬機(jī)可能隨著時(shí)間的推移出現(xiàn)不一致的情況,那么這些工具就更重要了。

使用Docker

部署鏡像 - 不用修改存在的虛擬機(jī)。你可以100%確保,本地運(yùn)行什么,相應(yīng)的生產(chǎn)環(huán)境就會(huì)運(yùn)行什么。

但是鏡像很大,對(duì)嗎?不要整個(gè)Docker-記住containers不是運(yùn)行在自己的操作系統(tǒng)上的,還有我們使用的是聯(lián)合文件系統(tǒng)。當(dāng)我們對(duì)于鏡像做出改變時(shí),我們只需要在上面添加新的層。

例如,我們安裝Memcached在app服務(wù)器上。我們構(gòu)建了一個(gè)新的鏡像。我會(huì)標(biāo)注asdlite/appserver-memcached,dliteis是我的index.docker.io用戶名,這是基于dite/appserver鏡像的。

  1. root@precise64:/# time docker build -t="dlite/appserver-memcached" . 
  2. Uploading context 92160 bytes 
  3. Step 1 : FROM appserver 
  4.  ---> 8dbd9e392a96 
  5. Step 2 : RUN apt-get update 
  6.  ---> Using cache 
  7.  ---> b55e9ee7b959 
  8. Step 3 : RUN apt-get install -y -q memcached 
  9.  ---> Running in 2a2a689daee3 
  10. Reading package lists... 
  11. Building dependency tree... 
  12. ... 
  13. Starting memcached: memcached. 
  14. Processing triggers for libc-bin ... 
  15. ldconfig deferred processing now taking place 
  16.  ---> 2a2a689daee3 
  17. Successfully built 2a2a689daee3 
  18.  
  19. real    0m13.289s 
  20. user    0m0.132s 

只要13秒就能安裝好Memcached,這是因?yàn)橹暗腄ockerfile被緩存了,我愛(ài)這種速度的感覺(jué)。

我會(huì)上傳和提交這些:

  1. root@precise64:/# time docker push dlite/appserver-memcached 
  2. The push refers to a repository [dlite/appserver-memcached] (len: 1) 
  3. Processing checksums 
  4. Sending image list 
  5. Pushing repository dlite/appserver-memcached (1 tags) 
  6. Pushing 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c 
  7. Image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c already pushed, skipping 
  8. ... 
  9. Pushing tags for rev [ad8f8a3809afcf0e2cff1af93a8c29275a847609b05b20f7b6d2a5cbd32ff0d8] on {https://registry-1.docker.io/v1/repositories/dlite/appserver-memcached/tags/latest} 
  10.  
  11. real    0m28.710s 

在生產(chǎn)環(huán)境中的機(jī)器上,我把鏡像下載下來(lái):

  1. root@prod:/# time docker pull dlite/appserver-memcached 
  2. Pulling repository dlite/appserver-memcached 
  3. Pulling image ad8f8a3809afcf0e2cff1af93a8c29275a847609b05b20f7b6d2a5cbd32ff0d8 (latest) from dlite/appserver-memcached 
  4.  
  5. real    0m15.749s 

只用了15秒就獲得了dlite/appserver-memachedimage。注意那個(gè)鏡像只有10MB大小,使用app服務(wù)器鏡像作為基礎(chǔ)鏡像:

  1. root@precise64:~# docker images 
  2. REPOSITORY            TAG                 ID                  CREATED             SIZE 
  3. appserver             latest              7038022227c0        3 days ago          78.66 MB (virtual 427.9 MB) 
  4. appserver-memcached   latest              77dc850dcccc        16 minutes ago      10.19 MB (virtual 438.1 MB) 

我們沒(méi)有必要將整個(gè)Memcached鏡像都下載下來(lái), 只要將Memcached鏡像中的改變添加到dlite/appserver鏡像中。

絕大多數(shù)時(shí)間,我們做出的改變會(huì)小得多。所以下載一個(gè)新鏡像會(huì)更快。

這些會(huì)有很大的作用:

  • 開(kāi)始新的Docker containers是非常快的
  • 上傳+下載新的Docker鏡像要輕量級(jí)的

并非要改變現(xiàn)在運(yùn)行的虛擬機(jī),我們只是開(kāi)始新的containers,停止舊的containers.

的確震驚! 這意味著我不需要擔(dān)心一致性問(wèn)題 - 我們不會(huì)修改運(yùn)行的虛擬機(jī),只是開(kāi)始新的containers。這意味著可以輕松回滾!Memcached失敗了?停止運(yùn)行 dlite/appserver-memcached的container,開(kāi)始一個(gè)新container運(yùn)行dlite/appserver鏡像。

不足之處

在短暫的containers上工作,這會(huì)導(dǎo)致一系列新問(wèn)題- 分布式配置 / 協(xié)調(diào)和服務(wù)發(fā)現(xiàn):

  • 當(dāng)一個(gè)新的app服務(wù)器containers開(kāi)始后,我們改如何更新HAProxy配置?
  • 當(dāng)一個(gè)新的數(shù)據(jù)庫(kù)container開(kāi)始后,app服務(wù)器應(yīng)該如何與數(shù)據(jù)container來(lái)通信?
  • 如何跨越Docker宿主機(jī)器通信?

即將發(fā)布的Flynn.io,那會(huì)使用etcd,將會(huì)有幫助。但是,在小規(guī)模部署的時(shí)候沒(méi)必要擔(dān)心這些。

總結(jié)一下: Docker來(lái)部署Git來(lái)開(kāi)發(fā)

當(dāng)開(kāi)發(fā)應(yīng)用的時(shí)候,開(kāi)發(fā)者可以利用Git的性能和靈活性。Git鼓勵(lì)嘗試,不會(huì)因?yàn)槟愠鲥e(cuò)而懲罰你:在一個(gè)分支開(kāi)始試驗(yàn),如果失敗了,只要git rebase或者git reset回復(fù)一下。開(kāi)始一個(gè)分支非常簡(jiǎn)單,上傳也很快速。 

Docker鼓勵(lì)對(duì)于操作的試驗(yàn)。Containers的啟動(dòng)非常快速。 構(gòu)建鏡像簡(jiǎn)簡(jiǎn)單單,使用另一個(gè)鏡像作為基礎(chǔ)鏡像也非常容易。部署整個(gè)鏡像非常快速。***,回滾輕輕松松。

快速+靈活= 部署即將成為令人愉快的事。

原文鏈接:http://www.oschina.net/translate/docker-git-for-deployment

譯文鏈接:http://www.oschina.net/translate/docker-git-for-deployment

責(zé)任編輯:陳四芳 來(lái)源: 開(kāi)源中國(guó)編譯
相關(guān)推薦

2021-07-19 06:02:56

DockerGitLab 14.0開(kāi)源

2023-08-08 10:23:34

2022-07-29 15:19:27

Dockersudo權(quán)限

2024-10-28 15:40:26

2017-03-31 14:25:19

手動(dòng)docker swar集群

2019-07-01 09:33:58

DockerNginx操作系統(tǒng)

2014-12-26 10:06:48

Docker容器代碼部署

2023-01-10 08:37:45

Docker開(kāi)發(fā)架構(gòu)

2013-07-26 11:28:08

Git

2017-05-04 09:01:45

達(dá)觀數(shù)據(jù)Docker部署

2017-05-23 15:53:52

docker服務(wù)容器

2019-12-05 10:40:41

DockerMySQL數(shù)據(jù)庫(kù)

2020-10-30 10:49:37

DockerGPULinux

2015-12-30 13:58:00

DockerGit開(kāi)發(fā)環(huán)境

2022-07-13 15:43:02

Docker后端api

2023-09-08 08:14:14

2022-07-12 17:24:48

NginxDocker

2023-08-29 15:17:40

Docker容器架構(gòu)

2022-05-26 15:02:35

Docker容器云原生

2015-08-20 10:42:17

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久精品久久久久久 | 日韩精品一区二区三区在线播放 | 99久久精品国产毛片 | 很黄很污的网站 | 91网站在线看 | 亚洲一区在线日韩在线深爱 | 国产精品美女久久久久久免费 | 欧美一区二区三区在线观看 | 一区二区亚洲 | 国产精品久久久 | 久久久av | 午夜精品久久久久久久久久久久 | 国产精品久久久久久238 | 免费在线看黄 | 国产精品一区二区视频 | 精品伊人久久 | 狠狠色狠狠色综合日日92 | 国产精品久久久久久av公交车 | 日本激情视频中文字幕 | 国产成人精品在线播放 | 成人av电影天堂 | 欧美涩| 亚洲第一成人影院 | 色婷婷亚洲国产女人的天堂 | 欧洲一级毛片 | 韩国av一区二区 | 久久精品久久综合 | 精品国产一区二区三区久久 | 国产精品免费在线 | 91久久看片| 国产午夜三级一区二区三 | 日本不卡一区 | 欧美激情亚洲激情 | 武道仙尊动漫在线观看 | 免费观看日韩精品 | 国产激情片在线观看 | 久久久国产精品视频 | 毛片毛片毛片毛片毛片 | 婷婷五月色综合 | 在线观看视频福利 | 中文字幕一区二区三区在线乱码 |