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