Docker構建鏡像過於緩慢解決-----Docker構建服務之部署和備份jekyll網站


參考原文鏈接:https://www.jianshu.com/p/e6b7e68f2ba7

來自《第一本Docker書》,我覺得很有趣,就記錄一下

准備國內ubuntu鏡像

每次構建Ubuntu容器然后安裝軟件的時候,都異常的卡,那是因為沒有使用國內鏡像,所以我事先准備了sources.list文件,一定要確定對應的ubuntu的版本號,我用的是18.04,內容如下

vi sources.list 

輸入以下內容

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse 

創建對應的Dockerfile

jekyll

mkdir jekyll
cd jekyll
vi Dockerfile

輸入如下內容

FROM ubuntu:18.04 LABEL maintainer="vector4wang@qq.com" ENV REFRESHED_AT 2019-01-14 ## 更換鏡像 RUN rm -rf /etc/apt/sources.list ADD sources.list /etc/apt/ RUN apt-get -qq update RUN apt-get -qq install ruby ruby-dev libffi-dev build-essential nodejs RUN gem install --no-rdoc --no-ri jekyll -v 2.5.3 VOLUME /data VOLUME /var/www/html WORKDIR /data ENTRYPOINT [ "jekyll", "build", "--destination=/var/www/html" ] 

最后一句命令的意思就是每次啟動的時候就將/data下的源文件編譯成可發布的網站內容,並放在/var/www/html中供下面的apache使用

apache

mkdir apache
cd apache
vi Dockerfile

輸入以下內容

FROM ubuntu:18.04 LABEL maintainer="vector4wang@qq.com" ## 更換鏡像 RUN rm -rf /etc/apt/sources.list ADD sources.list /etc/apt/ RUN apt-get -qq update RUN apt-get -qq install apache2 VOLUME [ "/var/www/html" ] WORKDIR /var/www/html 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 ENTRYPOINT [ "/usr/sbin/apachectl" ] CMD ["-D", "FOREGROUND"] 

最終的目錄結構為:

. ├── apache │ ├── Dockerfile │ └── sources.list ├── jekyll ├── Dockerfile └── sources.list 

構建

分別構建 jekyll 和 apache

cd jekyll
docker build -t vector/jekyll .

cd apache
docker build -t vector/apache .

注意:一定不要忘記更換容器的鏡像源...

執行docker images

 
2019-01-14 21-28-56.png

 

啟動服務

jekyll源文件

創建一個目錄

mkdir jekyll-src
cd jekyll-src

從github上下載一個jekyll模板代碼

git clone https://github.com/turnbullpress/james_blog.git
cd james_blog

啟動jekyll

docker run -v /Users/wangxc/Develop/docker/jekyll-src/james_blog:/data/ --name vector_blog vector/jekyll 

結果為

Configuration file: none Source: /data Destination: /var/www/html Generating... done. 

“卷是在一個或多個容器中特殊指定的目錄,卷會繞過聯合文件系統,為持久化數據和共享數據提供幾個有用的特性。
卷可以在容器間共享和重用。
共享卷時不一定要運行相應的容器。
對卷的修改會直接在卷上反映出來。
更新鏡像時不會包含對卷的修改。
卷會一直存在,直到沒有容器使用它們。
利用卷,可以在不用提交鏡像修改的情況下,向鏡像里加入數據(如源代碼、數據或者其他內容),並且可以在容器間共享這些數據。
卷在Docker宿主機的/var/lib/docker/volumes目錄中。可以通過docker inspect命令查看某個卷的具體位置,如docker inspect -f "{{ range .Mounts }}{{.}}{{end}}"。”
摘錄來自: [澳] 詹姆斯·特恩布爾(James Turnbull). “第一本Docker書(修訂版)。” iBooks.

啟動apache

docker run -d -P --volumes-from vector_blog vector/apache 

--volumes-from把指定容器里的所有卷都加入新創建的容器里。這意味着,Apache容器可以訪問之前創建的james_blog容器里/var/www/html卷中存放的編譯后的Jekyll網站。即便james_blog容器沒有運行,Apache容器也可以訪問這個卷
**摘錄來自: [澳] 詹姆斯·特恩布爾(James Turnbull). “第一本Docker書(修訂版)。” iBooks. **

此時apache這個容器可以訪問jekyll容器里的所有卷,我們進入apache內容看一下

docker exec -ti bdd9df87c189 /bin/bash

進入對應的目錄可看到jekyll中的卷

/var/www/html /data 

查看宿主機與容器的端口映射情況

docker ps 
或
docker port e539ff7ed7e8 80

得到0.0.0.0:32768,然后宿主機訪問localhost:32768

 

 
微信截圖_20190115092234.png

 

編輯內容

進入宿主機的jekyll模板源代碼中,對_config.yml進行相關的修改,比如修改title為自己的名字或者其他的內容,保存后退出,然后執行

docker start vector_blog

通過查看日志docker logs vector_blog可以看到

Configuration file: /data/_config.yml Source: /data Destination: /var/www/html Generating... done. Auto-regeneration: disabled. Use --watch to enable. 

已經跟新,這個時候,我們刷新下頁面localhost:32768就可以看到最新的內容了,是不是很有趣

備份

這里提供兩種思路吧,
第一種:我自己用的是hexo,一般都是直接備份在github上,jekyll也一樣,保存在github上是很容易很方便的;

第二種就是書上說的直接對卷進行備份

run --rm --volumes-from vector_blog -v $(pwd):/backup ubuntu:18.04 \ tar cvf /backup/vector_blog_backup.tar /var/www/html 

指定了--rm標志,這個標志對於只用一次的容器,或者說用完即扔的容器,很有用。這個標志會在容器的進程運行完畢后,自動刪除容器。對於只用一次的容器來說,這是一種很方便的清理方法。

個人感覺還是備份到git上方便。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM