來自《第一本Docker書》,我覺得很有趣存筏,就記錄一下
準(zhǔn)備國內(nèi)ubuntu鏡像
每次構(gòu)建Ubuntu容器然后安裝軟件的時候碍岔,都異常的卡痴施,那是因為沒有使用國內(nèi)鏡像擎厢,所以我事先準(zhǔn)備了sources.list文件,一定要確定對應(yīng)的ubuntu的版本號辣吃,我用的是18.04动遭,內(nèi)容如下
vi sources.list
輸入以下內(nèi)容
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
創(chuàng)建對應(yīng)的Dockerfile
jekyll
mkdir jekyll
cd jekyll
vi Dockerfile
輸入如下內(nèi)容
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下的源文件編譯成可發(fā)布的網(wǎng)站內(nèi)容,并放在/var/www/html中供下面的apache使用
apache
mkdir apache
cd apache
vi Dockerfile
輸入以下內(nèi)容
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"]
最終的目錄結(jié)構(gòu)為:
.
├── apache
│ ├── Dockerfile
│ └── sources.list
├── jekyll
├── Dockerfile
└── sources.list
構(gòu)建
分別構(gòu)建 jekyll 和 apache
cd jekyll
docker build -t vector/jekyll .
cd apache
docker build -t vector/apache .
注意:一定不要忘記更換容器的鏡像源...
啟動服務(wù)
jekyll源文件
創(chuàng)建一個目錄
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
結(jié)果為
Configuration file: none
Source: /data
Destination: /var/www/html
Generating...
done.
“卷是在一個或多個容器中特殊指定的目錄神得,卷會繞過聯(lián)合文件系統(tǒng)厘惦,為持久化數(shù)據(jù)和共享數(shù)據(jù)提供幾個有用的特性。
卷可以在容器間共享和重用哩簿。
共享卷時不一定要運行相應(yīng)的容器宵蕉。
對卷的修改會直接在卷上反映出來。
更新鏡像時不會包含對卷的修改节榜。
卷會一直存在羡玛,直到?jīng)]有容器使用它們。
利用卷全跨,可以在不用提交鏡像修改的情況下缝左,向鏡像里加入數(shù)據(jù)(如源代碼亿遂、數(shù)據(jù)或者其他內(nèi)容)浓若,并且可以在容器間共享這些數(shù)據(jù)。
卷在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
把指定容器里的所有卷都加入新創(chuàng)建的容器里馏予。這意味著,Apache容器可以訪問之前創(chuàng)建的james_blog容器里/var/www/html
卷中存放的編譯后的Jekyll網(wǎng)站盔性。即便james_blog容器沒有運行霞丧,Apache容器也可以訪問這個卷
**摘錄來自: [澳] 詹姆斯·特恩布爾(James Turnbull). “第一本Docker書(修訂版)∶嵯悖” iBooks. **
此時apache這個容器可以訪問jekyll容器里的所有卷,我們進(jìn)入apache內(nèi)容看一下
docker exec -ti bdd9df87c189 /bin/bash
進(jìn)入對應(yīng)的目錄可看到j(luò)ekyll中的卷
/var/www/html
/data
查看宿主機與容器的端口映射情況
docker ps
或
docker port e539ff7ed7e8 80
得到0.0.0.0:32768蛹尝,然后宿主機訪問localhost:32768
編輯內(nèi)容
進(jìn)入宿主機的jekyll模板源代碼中后豫,對_config.yml進(jìn)行相關(guān)的修改,比如修改title為自己的名字或者其他的內(nèi)容突那,保存后退出挫酿,然后執(zhí)行
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.
已經(jīng)跟新,這個時候愕难,我們刷新下頁面localhost:32768
就可以看到最新的內(nèi)容了早龟,是不是很有趣
備份
這里提供兩種思路吧,
第一種:我自己用的是hexo务漩,一般都是直接備份在github上拄衰,jekyll也一樣,保存在github上是很容易很方便的饵骨;
第二種就是書上說的直接對卷進(jìn)行備份
run --rm --volumes-from vector_blog -v $(pwd):/backup ubuntu:18.04 \
tar cvf /backup/vector_blog_backup.tar /var/www/html
指定了--rm標(biāo)志翘悉,這個標(biāo)志對于只用一次的容器,或者說用完即扔的容器居触,很有用妖混。這個標(biāo)志會在容器的進(jìn)程運行完畢后,自動刪除容器轮洋。對于只用一次的容器來說制市,這是一種很方便的清理方法。
個人感覺還是備份到git上方便弊予。