docker实战——构建Jekyll
構(gòu)建第一個應(yīng)用
要構(gòu)建的第一個應(yīng)用是Jekyll框架的自定義網(wǎng)站。我們會構(gòu)建一下兩個鏡像。
- 一個鏡像安裝Jekyll以及其他用于構(gòu)建Jekyll網(wǎng)站的必要的軟件包。
- 一個鏡像通過Apache來讓Jekyll網(wǎng)站工作起來。
在啟動容器時,通過創(chuàng)建一個新的Jekyll網(wǎng)站來實現(xiàn)自服務(wù)。工作流程如下:
- 創(chuàng)建Jekyll基礎(chǔ)鏡像和Apache鏡像(只需要構(gòu)建一次)。
- 從Jekyll鏡像創(chuàng)建一個容器,這個容器存放通過卷掛載的網(wǎng)址源代碼。
- 從Apache鏡像創(chuàng)建一個容器,這個容器利用包含編譯后的網(wǎng)站的卷,并為其服務(wù)。
- 在網(wǎng)站需要更新時,清理并重復(fù)上面的步驟。
可以把這個例子看做是創(chuàng)建一個多主機(jī)站點最簡單的方法。
構(gòu)建Jekyll鏡像
創(chuàng)建Dockerfile:
# mkdir /opt/jekyll # cd /opt/jekyll # vim DockerfileFROM ubuntu:latest MAINTAINER Bourbon Tian "bourbon@1mcloud.com" ENV REFRESHED_AT 2017-06-13RUN apt-get -qq update RUN apt-get -qq install ruby ruby-dev build-essential nodejs RUN gem install --no-rdoc --no-ri jekyll -v 2.5.3VOLUME /data VOLUME /var/www/html WORKDIR /dataENTRYPOINT [ "jekyll", "build", "--destination=/var/www/html" ]鏡像基于Ubuntu:latest,并且安裝ruby和用于支持Jekyll的包。然后通過VOLUME指令創(chuàng)建了以下兩個卷。
- /data 用來存放網(wǎng)站的源代碼
- /var/www/html 用來存放編譯后的Jekyll網(wǎng)站碼
然后將工作目錄設(shè)置到/data/,并通過ENTRYPOINT指令指定自動構(gòu)建的命令,這個命令會將工作目錄/data/中所有的Jekyll網(wǎng)站代碼構(gòu)建到/var/www/html/目錄中。
構(gòu)建Jekyll基礎(chǔ)鏡像
通過Dockerfile,可以使用docker build命令構(gòu)建出可以啟動容器的鏡像。
# docker build -t test/jekyll . Sending build context to Docker daemon 1.691 MB Sending build context to Docker daemon Step 0 : FROM ubuntu:latest---> db12a182ded0 Step 1 : MAINTAINER Bourbon Tian "bourbon@1mcloud.com"---> 6c517b49846f ... Successfully built c8ea1e6c398b這里就構(gòu)建了一個名為test/jekyll、ID為c8ea1e6c398b的新鏡像。我們可以通過docker images命令來查看:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test/jekyll latest c8ea1e6c398b About an hour ago 455.3 MB構(gòu)建Apache鏡像
創(chuàng)建Dockerfile:
# mkdir /opt/apache # cd /opt/apache # vim DockerfileFROM ubuntu:latest MAINTAINER Bourbon Tian "bourbon@1mcloud.com" ENV REFRESHED_AT 2017-06-13RUN apt-get -qq update RUN apt-get -qq install apache2VOLUME [ "/var/www/html" ] WORKDIR /var/www/htmlENV 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/apache2RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIREXPOSE 80ENTRYPOINT [ "/usr/sbin/apache2" ] CMD ["-D", "FOREGROUND"]這個鏡像也是基于Ubuntu:latest,并且安裝了Apache。然后使用VOLUME指令創(chuàng)建了一個卷,即/var/www/html/,用來存放編譯后的Jekyll網(wǎng)站。然后將/var/www/html設(shè)為工作目錄。
使用ENV指令設(shè)置了一些必要的環(huán)境變量,創(chuàng)建了必要的目錄,并且使用EXPOSE公開了80端口。最后指定了ENTRYPOINT和CMD指令組合賴在容器啟動時默認(rèn)運行Apache。
構(gòu)建Apache鏡像
# docker build -t test/apache . Sending build context to Docker daemon 2.56 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:latest---> db12a182ded0 ... Successfully built f97bb19ef81c這里構(gòu)建了一個名為test/apache、ID為f97bb19ef81c的新鏡像。可以通過docker images查看:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test/apache latest f97bb19ef81c About an hour ago 255.2 MB啟動Jekyll網(wǎng)站
現(xiàn)在有了以下兩個鏡像。
- Jekyll:安裝了Ruby及其他必備軟件包的Jekyll鏡像。
- Apache:通過Apache Web服務(wù)器來讓Jekyll網(wǎng)站工作起來的鏡像。
我們從使用docker run命令來創(chuàng)建一個新的Jekyll容器開始我們的網(wǎng)站。我們將啟動容器,并構(gòu)建我們的網(wǎng)站。我們將啟動容器,并構(gòu)建我們的網(wǎng)站。
# cd /opt/jekyll # git clone https://github.com/turnbullpress/james_blog.git # docker run -v /opt/jekyll/james_blog:/data/ --name james_blog test/jekyll Configuration file: /data/_config.ymlSource: /dataDestination: /var/www/htmlGenerating... done.這里啟動了一個叫james_blog的新容器,把本地的james_blog目錄作為/data/卷掛載到容器里。容器已經(jīng)拿到網(wǎng)站的源代碼,并將其構(gòu)建到已編譯的網(wǎng)站,存放到/var/www/html/目錄。
卷是在一個或多個容器中特殊指定的目錄,卷會繞過聯(lián)合文件系統(tǒng),為持久化數(shù)據(jù)提和共享數(shù)據(jù)提供幾個有用的特性:
- 卷可以在容器間共享和重用。
- 共享卷時不一定要運行相應(yīng)的容器。
- 對卷的修改會直接在卷上反映出來。
- 更新鏡像時不會包含對卷的修改。
- 卷會一直存在,直到?jīng)]有容器使用它們。
利用卷,可以在不用提交鏡像修改的情況下,向鏡像里加入數(shù)據(jù)(如源代碼、數(shù)據(jù)或者其他內(nèi)容),并且可以在容器間共享這些數(shù)據(jù)。卷在Docker宿主機(jī)的/var/lib/docker/volumes目錄中。可以通過docker inspect命令查看某個卷的具體位置。
# docker inspect -f "{{ .Volumes}}" james_blog map[/data:/opt/jekyll/james_blog /var/www/html:/var/lib/docker/volumes/6bf6fbf5ef4017c7aaab6f681b396f32f0f3878a3958f833e02973e0826ccafd/_data]?如果想在另一個容器里使用/var/www/html/卷里編譯好的網(wǎng)站,可以創(chuàng)建一個新的連接到這個卷的容器:
# docker run -d -P --volumes-from james_blog test/apache- --volumes-from把指定容器里的所有卷都加入新創(chuàng)建的容器里。
這意味著,Apache容器可以訪問之前創(chuàng)建的james_blog容器里/var/www/html卷中存放的編譯后的Jekyll網(wǎng)站。即便james_blog容器沒有運行,Apache容器也可以訪問這個卷。
不過,容器本身必須存在。如果用docker rm命令刪除了james_blog容器,那么這個卷和卷里的內(nèi)容也就不存在了。
現(xiàn)在在宿主機(jī)上瀏覽該網(wǎng)站,首先查看容器公開的80端口映射到了宿主機(jī)的哪個端口:
# docker port f39825fd8f61 80 0.0.0.0:32782更新Jekyll網(wǎng)站
如果需要更新網(wǎng)站的數(shù)據(jù),假設(shè)要修改Jekyll網(wǎng)站的博客名字,我們只需要通過編輯宿主機(jī)上 james_blog/_config.yml文件
# pwd /opt/jekyll/james_blog# vi _config.yml?并將title域改為Bourbon Blog。
然后通過使用docker start命令啟動Docker容器即可:
# docker start james_blog james_blog## 看上去什么都沒有發(fā)生。我們來查看一下日志 # docker logs james_blog Configuration file: /data/_config.ymlSource: /dataDestination: /var/www/htmlGenerating... done.Auto-regeneration: disabled. Use --watch to enable. Configuration file: /data/_config.ymlSource: /dataDestination: /var/www/htmlGenerating... done.Auto-regeneration: disabled. Use --watch to enable.?可以看到,Jekyll編譯過程第二次被運行,并且往網(wǎng)站已經(jīng)被更新。這次更新已經(jīng)寫入了對應(yīng)的卷。現(xiàn)在瀏覽Jekyll網(wǎng)站,就能看到變化了。
?
由于共享的卷會自動更新,這一切都不要更新或者重啟Apache容器。這個流程非常簡單,可以將其擴(kuò)展到更復(fù)雜的部署環(huán)境。
備份Jekyll卷
如果擔(dān)心一不小心刪除卷。由于卷的優(yōu)點之一就是可以掛載到任意的容器,因此可以輕松備份它們。現(xiàn)在創(chuàng)建一個新容器,用來備份/var/www/html卷
# docker run --rm --volumes-from james_blog -v $(pwd):/backup ubuntu tar cvf /backup/james_blog_backup.tar /var/www/html tar: Removing leading `/' from member names /var/www/html/ /var/www/html/History.markdown /var/www/html/atom.xml /var/www/html/pages.html ...# ls james_blog_backup.tar james_blog_backup.tar這里我們運行了一個已有的Ubuntu容器,并把james_blog的卷掛載到該容器。這會在該容器里創(chuàng)建/var/www/html目錄。然后我們使用一個-v標(biāo)志把當(dāng)前目錄(通過$(pwd)命令獲得)掛載到容器的/backup 目錄。最后我們的容器運行這一備份命令。
- --rm 標(biāo)志,這個標(biāo)志對于只用一次的容器,或者說用完即扔的容器,很有用。這個標(biāo)志在容器的進(jìn)程運行完畢后,自動刪除容器。對于只用一次的容器來說,這是一種很方便的清理方法。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Bourbon-tian/p/7003387.html
總結(jié)
以上是生活随笔為你收集整理的docker实战——构建Jekyll的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三相不平衡的原因、危害以及解决措施
- 下一篇: jq.validate.js