来自《第一本 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 Node.JS
- 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
https://i.loli.net/2019/01/14/5c3c8ea882065.png
2019-01-14 21-28-56.PNG https://i.loli.net/2019/01/14/5c3c8ea882065.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
https://i.loli.net/2019/01/15/5c3d366950ba8.png
微信截图_20190115092234.PNG https://i.loli.net/2019/01/15/5c3d366950ba8.png
编辑内容
进入宿主机的 jekyll 模板源代码中, 对_config.YAML 进行相关的修改, 比如修改 title 为自己的名字或者其他的内容, 保存后退出, 然后执行
docker start vector_blog
通过查看日志 docker logs vector_blog 可以看到
- Configuration file: /data/_config.YAML
- 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 上方便.
来源: http://www.jianshu.com/p/e6b7e68f2ba7