构建第一个应用

要构建的第一个应用是Jekyll框架的自定义网站。我们会构建一下两个镜像。

  • 一个镜像安装Jekyll以及其他用于构建Jekyll网站的必要的软件包。
  • 一个镜像通过Apache来让Jekyll网站工作起来。

在启动容器时,通过创建一个新的Jekyll网站来实现自服务。工作流程如下:

  • 创建Jekyll基础镜像和Apache镜像(只需要构建一次)。
  • 从Jekyll镜像创建一个容器,这个容器存放通过卷挂载的网址源代码。
  • 从Apache镜像创建一个容器,这个容器利用包含编译后的网站的卷,并为其服务。
  • 在网站需要更新时,清理并重复上面的步骤。

可以把这个例子看做是创建一个多主机站点最简单的方法。

构建Jekyll镜像

创建Dockerfile:

# mkdir /opt/jekyll
# cd /opt/jekyll
# vim DockerfileFROM ubuntu:latest
MAINTAINER Bourbon Tian "bourbon@1mcloud.com"
ENV REFRESHED_AT 2017-06-13RUN apt-get -qq update
RUN apt-get -qq install ruby ruby-dev build-essential nodejs
RUN gem install --no-rdoc --no-ri jekyll -v 2.5.3VOLUME /data
VOLUME /var/www/html
WORKDIR /dataENTRYPOINT [ "jekyll", "build", "--destination=/var/www/html" ]

镜像基于Ubuntu:latest,并且安装ruby和用于支持Jekyll的包。然后通过VOLUME指令创建了以下两个卷。

  • /data 用来存放网站的源代码
  • /var/www/html 用来存放编译后的Jekyll网站码

然后将工作目录设置到/data/,并通过ENTRYPOINT指令指定自动构建的命令,这个命令会将工作目录/data/中所有的Jekyll网站代码构建到/var/www/html/目录中。

构建Jekyll基础镜像

通过Dockerfile,可以使用docker build命令构建出可以启动容器的镜像。

# docker build -t test/jekyll .
Sending build context to Docker daemon 1.691 MB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:latest---> db12a182ded0
Step 1 : MAINTAINER Bourbon Tian "bourbon@1mcloud.com"---> 6c517b49846f
...
Successfully built c8ea1e6c398b

这里就构建了一个名为test/jekyll、ID为c8ea1e6c398b的新镜像。我们可以通过docker images命令来查看:

# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test/jekyll                               latest              c8ea1e6c398b        About an hour ago   455.3 MB

构建Apache镜像

创建Dockerfile:

# mkdir /opt/apache
# cd /opt/apache
# vim DockerfileFROM ubuntu:latest
MAINTAINER Bourbon Tian "bourbon@1mcloud.com"
ENV REFRESHED_AT 2017-06-13RUN apt-get -qq update
RUN apt-get -qq install apache2VOLUME [ "/var/www/html" ]
WORKDIR /var/www/htmlENV 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/apache2RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIREXPOSE 80ENTRYPOINT [ "/usr/sbin/apache2" ]
CMD ["-D", "FOREGROUND"]

这个镜像也是基于Ubuntu:latest,并且安装了Apache。然后使用VOLUME指令创建了一个卷,即/var/www/html/,用来存放编译后的Jekyll网站。然后将/var/www/html设为工作目录。

使用ENV指令设置了一些必要的环境变量,创建了必要的目录,并且使用EXPOSE公开了80端口。最后指定了ENTRYPOINT和CMD指令组合赖在容器启动时默认运行Apache。

构建Apache镜像

# docker build -t test/apache .
Sending build context to Docker daemon  2.56 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:latest---> db12a182ded0
...
Successfully built f97bb19ef81c

这里构建了一个名为test/apache、ID为f97bb19ef81c的新镜像。可以通过docker images查看:

# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test/apache                               latest              f97bb19ef81c        About an hour ago   255.2 MB

启动Jekyll网站

现在有了以下两个镜像。

  • Jekyll:安装了Ruby及其他必备软件包的Jekyll镜像。
  • Apache:通过Apache Web服务器来让Jekyll网站工作起来的镜像。

我们从使用docker run命令来创建一个新的Jekyll容器开始我们的网站。我们将启动容器,并构建我们的网站。我们将启动容器,并构建我们的网站。

# cd /opt/jekyll
# git clone https://github.com/turnbullpress/james_blog.git
# docker run -v /opt/jekyll/james_blog:/data/ --name james_blog test/jekyll
Configuration file: /data/_config.ymlSource: /dataDestination: /var/www/htmlGenerating... done.

这里启动了一个叫james_blog的新容器,把本地的james_blog目录作为/data/卷挂载到容器里。容器已经拿到网站的源代码,并将其构建到已编译的网站,存放到/var/www/html/目录。

卷是在一个或多个容器中特殊指定的目录,卷会绕过联合文件系统,为持久化数据提和共享数据提供几个有用的特性:

  • 卷可以在容器间共享和重用。
  • 共享卷时不一定要运行相应的容器。
  • 对卷的修改会直接在卷上反映出来。
  • 更新镜像时不会包含对卷的修改。
  • 卷会一直存在,直到没有容器使用它们。

利用卷,可以在不用提交镜像修改的情况下,向镜像里加入数据(如源代码、数据或者其他内容),并且可以在容器间共享这些数据。卷在Docker宿主机的/var/lib/docker/volumes目录中。可以通过docker inspect命令查看某个卷的具体位置。

# docker inspect -f "{{ .Volumes}}" james_blog
map[/data:/opt/jekyll/james_blog /var/www/html:/var/lib/docker/volumes/6bf6fbf5ef4017c7aaab6f681b396f32f0f3878a3958f833e02973e0826ccafd/_data]

如果想在另一个容器里使用/var/www/html/卷里编译好的网站,可以创建一个新的连接到这个卷的容器:

# docker run -d -P --volumes-from james_blog test/apache

  • --volumes-from把指定容器里的所有卷都加入新创建的容器里。

这意味着,Apache容器可以访问之前创建的james_blog容器里/var/www/html卷中存放的编译后的Jekyll网站。即便james_blog容器没有运行,Apache容器也可以访问这个卷。

不过,容器本身必须存在。如果用docker rm命令删除了james_blog容器,那么这个卷和卷里的内容也就不存在了。

现在在宿主机上浏览该网站,首先查看容器公开的80端口映射到了宿主机的哪个端口:

# docker port f39825fd8f61 80
0.0.0.0:32782

更新Jekyll网站

如果需要更新网站的数据,假设要修改Jekyll网站的博客名字,我们只需要通过编辑宿主机上 james_blog/_config.yml文件

# pwd
/opt/jekyll/james_blog# vi _config.yml

并将title域改为Bourbon Blog。

然后通过使用docker start命令启动Docker容器即可:

# docker start james_blog
james_blog## 看上去什么都没有发生。我们来查看一下日志
# docker logs james_blog
Configuration file: /data/_config.ymlSource: /dataDestination: /var/www/htmlGenerating... done.Auto-regeneration: disabled. Use --watch to enable.
Configuration file: /data/_config.ymlSource: /dataDestination: /var/www/htmlGenerating... done.Auto-regeneration: disabled. Use --watch to enable.

可以看到,Jekyll编译过程第二次被运行,并且往网站已经被更新。这次更新已经写入了对应的卷。现在浏览Jekyll网站,就能看到变化了。

由于共享的卷会自动更新,这一切都不要更新或者重启Apache容器。这个流程非常简单,可以将其扩展到更复杂的部署环境。

备份Jekyll卷

如果担心一不小心删除卷。由于卷的优点之一就是可以挂载到任意的容器,因此可以轻松备份它们。现在创建一个新容器,用来备份/var/www/html卷

# docker run --rm --volumes-from james_blog -v $(pwd):/backup ubuntu tar cvf /backup/james_blog_backup.tar /var/www/html
tar: Removing leading `/' from member names
/var/www/html/
/var/www/html/History.markdown
/var/www/html/atom.xml
/var/www/html/pages.html
...# ls james_blog_backup.tar
james_blog_backup.tar

这里我们运行了一个已有的Ubuntu容器,并把james_blog的卷挂载到该容器。这会在该容器里创建/var/www/html目录。然后我们使用一个-v标志把当前目录(通过$(pwd)命令获得)挂载到容器的/backup 目录。最后我们的容器运行这一备份命令。

  • --rm 标志,这个标志对于只用一次的容器,或者说用完即扔的容器,很有用。这个标志在容器的进程运行完毕后,自动删除容器。对于只用一次的容器来说,这是一种很方便的清理方法。

转载于:https://www.cnblogs.com/Bourbon-tian/p/7003387.html

docker实战——构建Jekyll相关推荐

  1. Docker实战 (docker swarm的应用,docker集群的构建,在docker集群中部署服务)

    Docker实战 ----docker swarm的应用,docker集群的构建,在docker集群中部署服务 转载来源:https://blog.csdn.net/No_red/article/de ...

  2. Docker 实战教程之从入门到提高 (四)

    本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的 ...

  3. Docker03 Docker基础知识、Docker实战

    1 Docker基础知识 1.1 什么是Docker Docker是一个可以装应用的容器,就像杯子可以装水.书包可以装书一样:docker官网 Docker是Docker公司开发的,并开源到GitHu ...

  4. ASP.NET Core amp; Docker 实战经验分享

    一.前言 最近一直在研究和实践ASP.NET Core.Docker.持续集成.在ASP.NET Core 和 Dcoker结合下遇到了一些坑,在此记录和分享,希望对大家有一些帮助. 二.中间镜像 我 ...

  5. Dockerfile 文件结构、docker镜像构建过程详细介绍

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  6. 使用docker构架服务 jekyll 和 java应用程序

    使用Jeky11框架自定义网站,主要流程如下: 1 构建Jekyll Dockerfile和镜像 mkdir jekyll cd jekyll vi Dockerfile,内容如下: FROM ubu ...

  7. Web 函数自定义镜像实战:构建图象处理函数

    Web 函数自定义镜像实战:构建图象处理函数 本篇文章写作于 2021.07.23 前言 作为一名前端工程师,我们经常会在 H5, 或者小程序中,使用 Canvas 来处理或生成图片. 不过在有些禁用 ...

  8. Marathon+Mesos+Docker实战

    Marathon+Mesos+Docker实战 Apache Mesos概述 Apache Mesos是一款基于多资源调度的开源集群管理套件,使容错和分布式系统更加容易使用实现,采用Master/Sl ...

  9. 【工作向】docker镜像构建方法与命令

    序言 docker镜像制作,学习记录 1. docker镜像制作的常见方法 1.1 docker commit基于已有容器构建镜像(手工) 这种方法将已有容器存为新的镜像,但是不建议使用使用这种方式, ...

最新文章

  1. python统计字符串数字个数_python统计字符串中数字个数_后端开发
  2. python使用del保留字定义一个函数-函数和代码复用 --Python
  3. 用掘金-Markdown 官方语法总结大全
  4. 未能加载文件或程序集“SqlServerDal”或它的某一个依赖项。系统找不到指定的文件。...
  5. 基于FAST-RCNN深度学习的目标识别算法的MATLAB仿真
  6. android 固定大小,android 固定大小取图片缩略图
  7. POJ2243 Knight Moves —— A*算法
  8. 系统仿真平台SkyEye可替代国外Matlab/Sumlink等同类软件
  9. Git:小乌龟报错no supported authentication methods avaiable
  10. JavaScript之jQuery够用即可(查找筛选器、属性操作、jQuery文档处理)
  11. linux 导出 excel文件名乱码,excel导出,文件名称中文乱码问题 · 大腿的博客
  12. 局域网共享工具_还在用数据线?快来试试网页版局域网共享工具!
  13. 无线路由器建立usb共享打印服务器,无线路由器USB网络共享管理设置方法
  14. 【gp数据库】查询GP中某张表的分布键信息
  15. AngularJS - uib-datepicker-popup - 日期控件
  16. Windows API实现弹出U盘
  17. 蓝牙技术|传统手表品牌加入智能手表竞争,智能手表市场持续火热
  18. 更适合小孩的电动牙刷,轻柔呵护口腔,Combo咸蛋超人电动牙刷上手
  19. 【hadoop生态之ZooKeeper】第三章ZooKeeper内部管理【笔记+代码】
  20. 嘉信给你介绍新加坡10大特色美食

热门文章

  1. 马斯克宣布将芯片成功植入猴子大脑,让它们可以玩电子游戏
  2. 国家卫健委:我国男女性成人平均身高分别为169.7厘米和158厘米
  3. 为什么Python是数据科学领域最受欢迎的语言
  4. Cortex-M0微处理器之错误定位
  5. 世卫组织总干事谭德塞:没有国家可以假装大流行已结束
  6. linux ls mv,Linux基本命令总结一(ls,cp,rm,mv,mkdir,rmdir,cd)
  7. python中insert()函数的用法_Python list insert()用法及代码示例
  8. 计算机软件uml,计算机软件——UML旅游管理系统.pdf
  9. 浅谈sleep、wait、yield、join区别
  10. qt qtableview 刷新列表_qt qtablewidget 刷新