转载过程中,图片丢失,代码显示错乱。
为了更好的学习内容,请访问原创版本:
https://www.missshi.cn/api/view/blog/5a6328110a745f6335000006
Ps:初次访问由于js文件较大,请耐心等候(5s左右)
在之前的文章中,我们简要介绍的Docker的一些简单实践。
接下来,我们将在本文中进行类似内容的讲解,不过相比而言,使用Docker部署的服务将会更加的复杂。
搭建Jekyll框架的网站
本文中我们将要构建的第一个应用是一个使用Jekyll框架的自定义网站。
该网站会包括以下两个镜像:
- 一个镜像安装了Jekyll及其相关的软件包
- 一个镜像安装了Apache服务用于使网站正常运行。
则以后开发过程可以转化如下:
- 创建Jekyll基础镜像和Apache镜像
- 利用Jekyll镜像创建一个容器并通过卷挂载网站的源代码。
- 使用Apache镜像创建一个容器,这个容器利用包含编译后的网站的卷并为其服务。
- 网站更新时跳转至步骤2重复执行。
Jekyll基础镜像
首先,我们需要创建第一个Jekyll基础镜像。
我们需要创建一个新的目录并创建该镜像所需要的Dockerfile文件。
mkdir jekyll
cd jekyll
touch Dockerfile
修改Dockerfile
文件如下:
FROM ubuntu:16.04
MAINTAINER nianshi <nianshi0912@gmail.com>
ENV REFRESHED_AT 2018-02-17
RUN apt-get -qq update
RUN apt-get -qq install ruby ruby-dev build-essential nodejs libffi-dev
RUN gem install --no-rdoc --no-ri jekyll
VOLUME /data
VOLUME /var/www/html
WORKDIR /data
ENTRYPOINT [ "jekyll", "build", "--destination=/var/www/html" ]
在该Dockerfile
文件中,我们首先安装了Ruby和相关的包,此外,我们使用VOLUME
指令创建了两个卷:/data/
用于存放网站的源代码,/var/www/html
用于存放编译后的Jekyll文件。
构建Jekyll基础镜像
创建好Dockerfile
文件后,我们可以执行如下命令来构建镜像:
docker build -t nianshi/jekyll .
命令执行完成后,我们则创建完成了一个jekyll的基础镜像。
Apache基础镜像
接下来,我们需要继续创建一个新的文件夹用于构建Apache镜像。
mkdir apache
cd apache
touch Dockerfile
修改Dockerfile
文件如下:
FROM ubuntu:16.04
MAINTAINER nianshi <nianshi0912@gmail.com>
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/apache2" ]
CMD ["-D", "FOREGROUND"]
构建Apache镜像
创建好Dockerfile
文件后,我们可以执行如下命令来构建镜像:
docker build -t nianshi/apache .
命令执行完成后,我们则创建完成了一个apache的基础镜像。
启动Jekyll网站
现在,我们已经完成了两个基础镜像的构建了。
下面,我们需要启动容器来构建我们的网站了:
首先需要下载网站所需要的源代码:http://www.missshi.cn/#/adminBook?_k=95xjmw
访问资源下载页面,搜索Jekyll示例服务依赖代码
下载并解压即可,此处我们假设解压目录是/home/nianshi/blog_demo
。
此时,我们可以执行如下命令来启动Jekyll容器:
docker run -v /home/nianshi/blog_demo:/data/ --name blog_demo nianshi/jekyll
此时,我们启动了一个blog_demo
的容器,并对卷进行了挂载,其中,本地的/home/nianshi/blog_demo
目录挂载到的容器中的/data/
文件夹下。另外容器对源代码编译后生成的代码会存放在/var/www/html/
卷下。
接下来,我们期望启动一个Apache容器,同时希望Apache容器可以连接到Jekyll容器中/var/www/html/
卷下获取编译后的文件。
我们可以执行如下命令:
docker run -d -P --name apache --volumes-from blog_demo nianshi/apache
在上述命令中,出现了一个新的参数--volumes-from
,该参数用于连接一个卷,从而可以访问到指定容器中的所有的卷。
Ps:当所有使用某个卷的容器全部都被rm
命令删除后,该卷会被自动释放。
下面我们来查看一下我们的容器映射到了机器的哪个端口吧: