您好,登錄后才能下訂單哦!
這篇文章主要講解了“Docker容器下部署Git的步驟”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Docker容器下部署Git的步驟”吧!
老辦法
我實(shí)在沒(méi)辦法在本地模擬一個(gè)完全真實(shí)的環(huán)境,但是我們只要看一下啟動(dòng)一臺(tái)虛擬機(jī)使用的時(shí)間:
$time vagrant up Bringing machine 'default' up with 'virtualbox' provider... [default] Importing base box 'squeeze64-ruby193'... ... [default] Booting VM... [default] Waiting for VM to boot. This can take a few minutes. ... 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):
root@precise64:~# docker run rails 2013-08-26 20:21:14,600 CRIT Supervisor running as root (no user in config file) 2013-08-26 20:21:14,603 WARN Included extra file "/srv/docker-rails/Supervisorfile" during parsing 2013-08-26 20:21:14,736 INFO RPC interface 'supervisor' initialized 2013-08-26 20:21:14,740 CRIT Server 'unix_http_server' running without any HTTP authentication checking 2013-08-26 20:21:14,754 INFO supervisord started with pid 1 2013-08-26 20:21:15,783 INFO spawned: 'rails' with pid 10 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è)痛苦的活兒??纯礊镽uby安裝依賴吧:
$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 Reading package lists... Building dependency tree... The following extra packages will be installed: .... Setting up libalgorithm-merge-perl (0.08-2) ... Processing triggers for libc-bin ... ldconfig deferred processing now taking place real 1m22.470s
然后,你想裝了NodeJS的依賴,但是忘了給apt添加源了:
$apt-get install -y nodejs ... 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ā)生什么:
FROM ubuntu:12.04
RUN apt-get update
## MYSQL
RUN apt-get install -y -q mysql-client libmysqlclient-dev
## RUBY
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
root@precise64:/# time docker build -t="dlite/appserver" . Uploading context 92160 bytes Step 1 : FROM ubuntu:12.04 ---> 8dbd9e392a96 Step 2 : RUN apt-get update ---> Using cache ---> b55e9ee7b959 Step 3 : RUN apt-get install -y -q mysql-client libmysqlclient-dev ---> Using cache ---> dc92be6158b0 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 ---> Using cache ---> 7038022227c0 Successfully built 7038022227c0 real 0m0.848s
部署鏡像, 別更新基礎(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鏡像的。
root@precise64:/# time docker build -t="dlite/appserver-memcached" . Uploading context 92160 bytes Step 1 : FROM appserver ---> 8dbd9e392a96 Step 2 : RUN apt-get update ---> Using cache ---> b55e9ee7b959 Step 3 : RUN apt-get install -y -q memcached ---> Running in 2a2a689daee3 Reading package lists... Building dependency tree... ... Starting memcached: memcached. Processing triggers for libc-bin ... ldconfig deferred processing now taking place ---> 2a2a689daee3 Successfully built 2a2a689daee3 real 0m13.289s user 0m0.132s
只要13秒就能安裝好Memcached,這是因?yàn)橹暗腄ockerfile被緩存了,我愛(ài)這種速度的感覺(jué)。
我會(huì)上傳和提交這些:
root@precise64:/# time docker push dlite/appserver-memcached The push refers to a repository [dlite/appserver-memcached] (len: 1) Processing checksums Sending image list Pushing repository dlite/appserver-memcached (1 tags) Pushing 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c Image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c already pushed, skipping ... Pushing tags for rev [ad8f8a3809afcf0e2cff1af93a8c29275a847609b05b20f7b6d2a5cbd32ff0d8] on {https://registry-1.docker.io/v1/repositories/dlite/appserver-memcached/tags/latest} real 0m28.710s
在生產(chǎn)環(huán)境中的機(jī)器上,我把鏡像下載下來(lái):
root@prod:/# time docker pull dlite/appserver-memcached Pulling repository dlite/appserver-memcached Pulling image ad8f8a3809afcf0e2cff1af93a8c29275a847609b05b20f7b6d2a5cbd32ff0d8 (latest) from dlite/appserver-memcached real 0m15.749s
只用了15秒就獲得了dlite/appserver-memachedimage。注意那個(gè)鏡像只有10MB大小,使用app服務(wù)器鏡像作為基礎(chǔ)鏡像:
root@precise64:~# docker images REPOSITORY TAG ID CREATED SIZE appserver latest 7038022227c0 3 days ago 78.66 MB (virtual 427.9 MB) 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ī)器通信?
感謝各位的閱讀,以上就是“Docker容器下部署Git的步驟”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Docker容器下部署Git的步驟這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。