参考原文链接: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上方便。

Docker构建镜像过于缓慢解决-----Docker构建服务之部署和备份jekyll网站的更多相关文章

  1. docker删除镜像时报错解决办法

    报错信息 [root@kvm ~]# docker rmi 4950a54ede5a Error response from daemon: conflict: unable to delete 49 ...

  2. docker - 修改镜像/容器文件或者 "Docker root dir" 的在宿主机上的存储位置

    背景 之前在使用docker的时候,由于启动container的时候用的是默认的mount(路径为 /var/lib/docker),这个目录对应的硬盘空间有限,只有200G左右.现在随着程序运行,有 ...

  3. docker - apt-get更换国内源解决Dockerfile构建速度过慢

    背景 使用ubuntu镜像一般apt-get源地址都是在国外导致在构建时因为源地址问题导致下载速度极其得慢 在构建中应事先修改apt-get源地址来避免因下载速度过慢导致的构建缓慢问题 方案 在Doc ...

  4. docker获取镜像很慢解决办法

    docker pull selenium/hub获取非常慢 可以使用docker中国的官方镜像加速 docker pull registry.docker-cn.com/selenium/hub 官方 ...

  5. 从零开始构建docker基础镜像

    段子 今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我 ...

  6. Docker容器学习梳理 - Dockerfile构建镜像

    在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其 ...

  7. Docker:dockerfile自动构建镜像 [六]

    一.手动docker镜像的缺点 相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点: 1.dockerfile只有几kb,便于传输 2.使用dockerfile构建出来的镜 ...

  8. docker构建镜像

    Docker 提供了两种构建镜像的方法: docker commit 命令Dockerfile 构建文件 示例: Dockerfile FROM golang:1.7.5 #基础镜像 RUN apt- ...

  9. (干货)构建镜像之docker commit

    Docker提供了两种构建镜像的方法:docker commit命令喝Dockerfile构建文件. docker commit   不推荐 (1).这是手工构建镜像的方式,容易出错,效率低且可重复性 ...

随机推荐

  1. Private Variable and Private Method - Python 私有变量 和 私有方法

    Private Variable and Private Method Python 不象 Java 那样, 通过 private 关键字创建私有属性, python 通过更简洁的实现了'私有属性', ...

  2. 20200110--python学习第八天

    今日内容 进制 对于计算机而言无论是计算机存储或是网络传输输入的本质都是:二进制:例如电脑上存储的视频/图形/文件/微信/qq的表情包/小视频都是二进制. 二进制:计算机内部 八进制: 十进制: 十六 ...

  3. CentOS7重置密码

    #在vmlinuz段最后添加rd.break Ctrl+X启动 rd.break #在linux16/linux/linuxefi所在参数行尾添加以下内容 init=/bin/sh #此时,可使用mo ...

  4. web前后端交互,nodejs

    手机赚钱怎么赚,给大家推荐一个手机赚钱APP汇总平台:手指乐(http://www.szhile.com/),辛苦搬砖之余用闲余时间动动手指,就可以日赚数百元 web前后端交互 前后端交互可以采用混合 ...

  5. 利用url地址获取你需要的参数,window.location系列

    这是我要获取url中一个code的参数值所以用了如下的方法GetQueryString(name) { let reg = new RegExp('(^|&)' + name + '=([^& ...

  6. 【GET TIPS】Chrome所见即所得的截图技巧

    精简的前言: 对,我就是想说下事情的来龙去脉.您要不想听,就把耳朵捂起来23333. 想截个新冠肺炎病毒,全国确诊人数今日增长的图,以确定非湖北地区不再明显增长. 但由于网页需要的内容分布在两页,需要 ...

  7. 实验一  GIT 代码版本管理

    实验一  GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git ini ...

  8. Sublime text3的安装及python开发环境的搭建

    作者:struct_mooc 博客地址:https:////www.cnblogs.com/structmooc/p/12376592.html 一. Sublime text3的安装 1.subli ...

  9. codewars--js--Hamming Numbers

    问题描述: A Hamming number is a positive integer of the form 2i3j5k, for some non-negative integers i, j ...

  10. Python面试(基础)

    第一部分 必答题 1,简述列举了解的编程语言及语言间的区别? Python 解释型语言,代码简洁,易懂 C语言 编译型语言,底层语言 c++ 编译型语言,在C语言基础上加了面向对象 Java 混合型语 ...