本文摘自: docker 高級進階
前面幾篇詳細(xì)的介紹了,docker的一些基本內(nèi)容和知識. 這里, 我們來實踐一下,在正式環(huán)境中,docker是怎么搭建的.
在開始之前,說一些docker運行時的基本原理.
docker最大的特點就是虛擬化, 通過VM來獲得底層的操作權(quán)限,并且利用自身的進程構(gòu)建了一個龐大的集群系統(tǒng), 相當(dāng)于,一個docker下面,我們可以連接上不同的電腦. 但實際上, 他們都可以虛擬化在一個docker daemon里面.
在實踐開發(fā)中,我們需要100%的掌握Volume以及EXPOSE等網(wǎng)絡(luò)接口命令的用法. 因為, 這是multi-docker交互的必備. 而且, 使用container的時候, 開啟某一個進程時,不能設(shè)置為background. 因為docker, 只會檢查子進程是否處于active狀態(tài),如果你一旦退出container,那么他下面的background jobs 也就go die了.
Ps: 這里翻譯了一下docker books 里面的例子--搭建Jekyll 和 Apache
這里,先簡單說一些jekyll的原理,jekyll就是一個html的生成工具, 用來將你靜態(tài)的文件自動生成為一個靜態(tài)博客所需要的內(nèi)容.
# jekyll 運行命令 // 自動將子目錄下的文件解析并且編譯為/var/www/html jekyll build --destination=/var/www/html
這里,我就直接放dockerfile了.
FROM ubuntu:14.04 MAINTAINER James TurnbullRUN apt-get -yqq update # 這里下載ruby, 并編譯nodeJS, 因為jekyll需要 RUN apt-get -yqq install ruby ruby-dev make nodejs # 下載jekyll RUN gem install --no-rdoc --no-ri jekyll -v 2.5.3 # 將該container下的/data共享 VOLUME /data # 將該container下的/var/www/html共享 VOLUME /var/www/html # 設(shè)置當(dāng)前工作目錄 WORKDIR /data # 當(dāng)在RUN的時候自動運行的命令 ENTRYPOINT [ "jekyll", "build", "--destination=/var/www/html" ]
上面理解起來不難, 顯示下載環(huán)境,然后將文件共享,最后設(shè)置運行命令.
關(guān)鍵想說一下VOLUME的內(nèi)容, 前面已經(jīng)提到過, docker daemon 運行時, 會自動調(diào)起一個環(huán)境,相當(dāng)于有一塊獨立的內(nèi)存。 使用VOLUME共享一個目錄,則該目錄則會被所有在docker運行下的container共享.(就是其他的container可以獲得你的數(shù)據(jù)了)
ok, 我們接下來來看一下Apache docker 的搭建.同樣, 放一份dockerfile就夠了.
FROM ubuntu:14.04 # 下載Apache RUN apt-get -yqq update RUN apt-get -yqq install apache2 # 設(shè)置同享盤 VOLUME [ "/var/www/html" ] # 這我就不說了 WORKDIR /var/www/html # 設(shè)置一些列Apache2需要配置的文件 ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR EXPOSE 80 # 設(shè)置默認(rèn)命令 apache2 -D FOREGROUND ENTRYPOINT [ "/usr/sbin/apache2" ] CMD ["-D", "FOREGROUND"]
這里,再次注意一下VOLUME這條命令. 可以看到后面的/var/www/html和上面jekyll設(shè)置的是一樣的. 這樣的意義就是,我的這個container設(shè)置的共享文件的目錄和jekyll是一致的.這里先不說有什么用. 我們放到后面來看看。
現(xiàn)在,上面兩個image都已經(jīng)準(zhǔn)備好了. 該run這兩個image。run的過程為:
第一步: 先run jekyll, 讓其先編譯好靜態(tài)博客所需要的文件.
第二步: 運行Apache2, 提供對外服務(wù)的接口
運行jekyll運行還是docker run命令.
# 注意下面的-v參數(shù). // 將/home/james/james_blog的文件,共享到/data/目錄下 docker run -v /home/james/james_blog:/data/ --name james_blog jimmy/jekyll
上面唯一特別的地方就在于 -v這個參數(shù), 在image文章里面,我提到過. 這個flag就是用來代表將外部的文件建立與內(nèi)容container的聯(lián)系,并且,container的操作完全反映到外部對應(yīng)的文件.
其中/home/james/james_blog目錄下就是jekyll的文件. 這里提供一份:(FROM docker books)
git clone https://github.com/jamtur01/james_blog.git
現(xiàn)在,靜待jekyll編譯完成,然后你就可以run Apache2
運行Apache2同樣也是使用run
# 注意--volumes-from 這個參數(shù) docker run -d -P --volumes-from james_blog jamtur01/apache
關(guān)于--volumes-from,可以參考我寫的另外,一篇image博文. 他可以用來將一個container中共享的VOLUMES共享到另外一個container中.
如果,順利的話,那這個博客就已經(jīng)搭建好了. 最后我們在看看docker實際暴露到外部的端口, 然后就可以訪問了.
docker port jimmy/Apache2 80 0.0.0.0:33221 // 最后訪問你的本機ip:33221即可 198.124.10.239:33221blog update
上面幾步已經(jīng)講清楚怎么從0到1搭建一個靜態(tài)blog. 但,問題是,如果后續(xù)我們要更新怎么呢?
很簡單,重新編譯jekyll即可--就是重啟container...
docker start james_blog # 檢測一下logs記錄 docker logs james_blogVOLUMES的備份
當(dāng)你的blog運行一段時間,可能會擔(dān)心某一天數(shù)據(jù)沒了... 那么很重要的一步就是做備份了. 在docker里面對VOLUMES備份,灰常簡單.
# 在運行的Apache2 container中運行 // 將當(dāng)前目錄: /var/www/html 共享到/backup里面. // 使用tar進行壓縮,然后生成備份文件 docker run --rm --volumes-from james_blog -v $(pwd):/backup ubuntu tar cvf /backup/james_blog_backup.tar /var/www/html # 使用ls查看 $ ls *.tar >>> james_blog_backup.tar
說一下里面需要注意的幾個點吧:
重點一:
其中--rm的參數(shù)的作用是神馬? --rm這個flag表示當(dāng)運行完container之后,就立即刪除.
重點二:
為什么退出之后,在當(dāng)前目錄會存在*.tar文件?
這是因為,你在備份的時候,指定了共享目錄,你在container中對目錄做的改動都會反映到外部.
ok, 現(xiàn)在大部分內(nèi)容差不多已經(jīng)結(jié)束了. 最后,再補充一點關(guān)于docker VOLUMES的知識.
docker 之 VOLUMESdokcer 構(gòu)建VOLUMES的機制有點特殊, 實際上你在dockerfile里面新定義的VOLUMES都會映射到/var/lib/docker/volumes下面. 并且,docker會永久的保存. 即使,你已經(jīng)退出該container.
我們可以通過docker inspect 來檢查我們的某個container共享的文件夾放在哪個位置.
# sample 是指定的container name docker inspect -f "{{ range .Mounts }}{{.}}{{end}}" samplelink container間通信
link是在docker run 時,手動指定的命令. 這個命令,我們也可以認(rèn)為是用來作為container間的通信, 但這同network, volume有著他獨特的地方. link 實際上也是host通信, 不過, 相比顯示創(chuàng)建PORT來說, 這個更方便,也更靈活. 因為他會內(nèi)建port 并且抽象的使用name來進行通信.
我們按照demo來,講解.
首先創(chuàng)建一個dockerfile -- link_child
FROM ubuntu:latest MAINTAINER jimmy "[email protected]" ENV REFRESH second WORKDIR /var EXPOSE 3669 ENTRYPOINT ["/bin/bash"]
使用docker build:
docker build -t="jimmy/link:0.1" .
現(xiàn)在,輪到我們正式使用--link來連接兩個container了.
# 首先run 剛才創(chuàng)建的image docker run -d -ti --name child_link jimmy/link:0.1 # ok, 正常運行之后,現(xiàn)在就可以link了. # 使用cat 來查看建立的網(wǎng)橋連接 docker run --rm --link child_link ubuntu:latest cat /etc/hosts # 得到結(jié)果: 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 child_link // 這就是我們link進來的container # 上面只是看看一下成功沒. 接下來,我們需要使用ENV指令,來查看docker 具體做了些什么 docker run --rm --link ba6f1726435a:child_link ubuntu:latest env // 得到結(jié)果 HOSTNAME=1be326e281d5 CHILD_LINK_PORT=tcp://172.17.0.2:3669 # 主要使用這個!! CHILD_LINK_PORT_3669_TCP=tcp://172.17.0.2:3669 CHILD_LINK_PORT_3669_TCP_ADDR=172.17.0.2 CHILD_LINK_PORT_3669_TCP_PORT=3669 CHILD_LINK_PORT_3669_TCP_PROTO=tcp CHILD_LINK_NAME=/tender_payne/child_link CHILD_LINK_ENV_REFRESH=second HOME=/root # 然后在生產(chǎn)環(huán)境中,直接使用CHILD_LINK_PORT全局變量進行container間通信即可.
這樣的做法就是,不需要你手動指定port, docker 內(nèi)置的幫你搭建了通信的tunnel. 是不是很方便?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26675.html
摘要:問能否談一下迅雷云使用的過程其實最初的時候,迅雷團隊對是懷有謹(jǐn)慎的態(tài)度的。三調(diào)度算法是迅雷云定制優(yōu)化的。迅雷在使用這方面一直沒有把數(shù)據(jù)層面交給迅雷云之外的系統(tǒng)。 非商業(yè)轉(zhuǎn)載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/201256 曾金龍就職于迅雷網(wǎng)絡(luò),是國內(nèi)覆蓋面最廣的迅雷P2P引擎核心研發(fā)成員。他畢業(yè)于中山大...
摘要:使用有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。目錄實踐一了解架構(gòu)實踐二使用教程實踐三下構(gòu)建開發(fā)環(huán)境實踐四環(huán)境容器化實踐五生產(chǎn)環(huán)境容器化實踐六容器監(jiān)控實踐七提升幸福感實踐八構(gòu)建開發(fā)環(huán)境實踐九生產(chǎn)環(huán)境優(yōu)化參考源碼分析系列文章 使用 docker 有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。 系列文章發(fā)布在 SegmentFault 上我的專欄 Tairy,...
摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來意思。閱讀本期技術(shù)周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達的境界。周刊篩選的每篇內(nèi)容,是作者的獨到見解,踩坑總結(jié)和經(jīng)驗分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動感十足的清脆鍵盤響,我就能猜到公司程序員定...
由于容器虛擬化技術(shù)可以充分利用硬件資源,對于開發(fā)團隊就像夢想照進了現(xiàn)實。盡管容器化沒有推翻虛擬機在企業(yè)應(yīng)用開發(fā)和部署上的地位,但是Docker等工具在實現(xiàn)開發(fā)、測試和部署大規(guī)?,F(xiàn)代軟件的速度和敏捷性方面大展身手。Docker容器具有諸多優(yōu)點:無需復(fù)雜的hypervisor、可移植性、資源隔離性、輕量級、開放標(biāo)準(zhǔn)、完美適應(yīng)微服務(wù)架構(gòu)。眾多的應(yīng)用通過容器隔離起來,相互獨立地運行在同一臺宿主機上,哪家公...
摘要:在上已經(jīng)有接近的數(shù)了,是目前最熱門的前端框架。將整個應(yīng)用打包發(fā)布,自動試用進行壓縮與優(yōu)化。毫無疑問,這些重?fù)?dān)都將壓在企業(yè)開發(fā)人員身上團隊之間如何高效協(xié)調(diào),快速交付產(chǎn)品,快速部署應(yīng)用,以及滿足企業(yè)業(yè)務(wù)需求,是開發(fā)人員亟需解決的問題。 React在Github上已經(jīng)有接近70000的 star 數(shù)了,是目前最熱門的前端框架。而我學(xué)習(xí)React也有一段時間了,現(xiàn)在就開始用 React+Red...
摘要:在上已經(jīng)有接近的數(shù)了,是目前最熱門的前端框架。將整個應(yīng)用打包發(fā)布,自動試用進行壓縮與優(yōu)化。毫無疑問,這些重?fù)?dān)都將壓在企業(yè)開發(fā)人員身上團隊之間如何高效協(xié)調(diào),快速交付產(chǎn)品,快速部署應(yīng)用,以及滿足企業(yè)業(yè)務(wù)需求,是開發(fā)人員亟需解決的問題。 React在Github上已經(jīng)有接近70000的 star 數(shù)了,是目前最熱門的前端框架。而我學(xué)習(xí)React也有一段時間了,現(xiàn)在就開始用 React+Red...
閱讀 1790·2021-10-11 10:59
閱讀 2442·2021-09-30 09:53
閱讀 1816·2021-09-22 15:28
閱讀 2825·2019-08-29 15:29
閱讀 1590·2019-08-29 13:53
閱讀 3236·2019-08-29 12:34
閱讀 2887·2019-08-26 10:16
閱讀 2686·2019-08-23 15:16