来自《第一本Docker书》,我觉得很有趣,就记录一下
准备国内ubuntu镜像
每次构建Ubuntu容器然后安装软件的时候,都异常的卡,那是因为没有使用国内镜像,所以我事先准备了sources.list文件,一定要确定对应的ubuntu的版本号,我用的是18.04,内容如下
1 | vi sources.list |
输入以下内容
1 | deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse |
创建对应的Dockerfile
jekyll
1 | mkdir jekyll |
输入如下内容
1 | FROM ubuntu:18.04 |
最后一句命令的意思就是每次启动的时候就将/data下的源文件编译成可发布的网站内容,并放在/var/www/html中供下面的apache使用
apache
1 | mkdir apache |
输入以下内容
1 | FROM ubuntu:18.04 |
最终的目录结构为:
1 | . |
构建
分别构建 jekyll 和 apache
1 | cd jekyll |
注意:一定不要忘记更换容器的镜像源…
启动服务
jekyll源文件
创建一个目录
1 | mkdir jekyll-src |
从github上下载一个jekyll模板代码
1 | git clone https://github.com/turnbullpress/james_blog.git |
启动jekyll
1 | docker run -v /Users/wangxc/Develop/docker/jekyll-src/james_blog:/data/ --name vector_blog vector/jekyll |
结果为
1 | Configuration file: none |
“卷是在一个或多个容器中特殊指定的目录,卷会绕过联合文件系统,为持久化数据和共享数据提供几个有用的特性。
卷可以在容器间共享和重用。
共享卷时不一定要运行相应的容器。
对卷的修改会直接在卷上反映出来。
更新镜像时不会包含对卷的修改。
卷会一直存在,直到没有容器使用它们。
利用卷,可以在不用提交镜像修改的情况下,向镜像里加入数据(如源代码、数据或者其他内容),并且可以在容器间共享这些数据。”
摘录来自: [澳] 詹姆斯·特恩布尔(James Turnbull). “第一本Docker书(修订版)。” iBooks.
启动apache
1 | 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内容看一下
1 | docker exec -ti bdd9df87c189 /bin/bash |
进入对应的目录可看到jekyll中的卷
1 | /var/www/html |
查看宿主机与容器的端口映射情况
1 | docker ps |
得到0.0.0.0:32768,然后宿主机访问localhost:32768
编辑内容
进入宿主机的jekyll模板源代码中,对_config.yml进行相关的修改,比如修改title为自己的名字或者其他的内容,保存后退出,然后执行
1 | docker start vector_blog |
通过查看日志docker logs vector_blog
可以看到
1 | Configuration file: /data/_config.yml |
已经跟新,这个时候,我们刷新下页面localhost:32768
就可以看到最新的内容了,是不是很有趣
备份
这里提供两种思路吧,
第一种:我自己用的是hexo,一般都是直接备份在github上,jekyll也一样,保存在github上是很容易很方便的;
第二种就是书上说的直接对卷进行备份
1
2run --rm --volumes-from vector_blog -v $(pwd):/backup ubuntu:18.04 \
tar cvf /backup/vector_blog_backup.tar /var/www/html
指定了–rm标志,这个标志对于只用一次的容器,或者说用完即扔的容器,很有用。这个标志会在容器的进程运行完毕后,自动删除容器。对于只用一次的容器来说,这是一种很方便的清理方法。
个人感觉还是备份到git上方便。