Docker测试一个静态网站

摘要:
使用Docker测试静态网站并将Docker用作本地Web开发环境是Docker最简单的应用场景。首先,创建一个目录来保存Dockerfile$mkdirsample$cdsample$touchDockerfile。现在你需要一些Nginx配置文件来运行这个网站。这是因为为了使Docker容器保持活动状态,其中运行的进程不能被中断。我们在Docker提供的配置中添加了命令daemooff。该命令允许Nginx在启动后在前台以交互方式运行。我们使用dockerrun命令从heian/nginx图像创建一个名为website的容器。
使用Docker测试静态网站

将Docker作为本地Web开发环境是Docker的一个最简单的应用场景。 这样的环境可以完全复制生产环境,并确保用户开发的东西在生产环境中也能运行。下面从将Nginx Web服务器安装到容器来架构一个简 单的网站开始。这个网站暂且命名为Sample。 

Sample网站的初始Dockerfile

为了完成网站开发,从这个简单的Dockerfile开始。先来创建一个 目录,保存Dockerfile

$ mkdir sample 
$ cd sample 
$ touch Dockerfile

现在还需要一些Nginx配置文件,才能运行这个网站。首先在这个示例 所在的目录里创建一个名为nginx的目录,用来存放这些配置文件。 然后我们可以从GitHub上下载作者准备好的示例文件

$ mkdir nginx && cd nginx 
$ wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/global.conf 
$ wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/nginx/nginx.conf 
$ cd ..

现在看一下我们将要为Sample网站创建的Dockerfile,如代码清单

FROM centos
MAINTAINER heian99 "heian99@163.com" 
ENV REFRESHED_AT 2014-06-01 
RUN yum -y update && yum  -y install nginx 
RUN mkdir -p /var/www/html/website 
ADD nginx/global.conf /etc/nginx/conf.d/ 
ADD nginx/nginx.conf /etc/nginx/nginx.conf 
EXPOSE 80

这个简单的Dockerfile内容包括以下几项。

  • 安装Nginx。

  • 在容器中创建一个目录/var/www/html/website/。

  • 将来自我们下载的本地文件的Nginx配置文件添加到镜像中。

  • 公开镜像的80端口。

这个Nginx配置文件是为了运行Sample网站而配置的。将文件 nginx/global.conf用ADD指令复制到/etc/nginx/conf.d/目 录中。配置文件

global.conf

server {
        listen          0.0.0.0:80;
        server_name     _;

        root            /var/www/html/website;
        index           index.html index.htm;

        access_log      /var/log/nginx/default_access.log;
        error_log       /var/log/nginx/default_error.log;
}

这个文件将Nginx设置为监听80端口,并将网络服务的根路径设置 为/var/www/ html/website,这个目录是我们用RUN指令创建 的。
我们还需要将Nginx配置为非守护进程的模式,这样可以让Nginx在 Docker容器里工作。将文件nginx/nginx.conf复制 到/etc/nginx目录就可以达到这个目的

nginx.conf的清单

user www-data;#把这个删除掉,不然后面docker里面的nginx无法启动
worker_processes 4;
pid /run/nginx.pid;
daemon off;

events {  }

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/conf.d/*.conf;
}

在这个配置文件里,daemon off;选项阻止Nginx进入后台,强制其 在前台运行。这是因为要想保持Docker容器的活跃状态,需要其中运 行的进程不能中断。默认情况下,Nginx会以守护进程的方式启动,这 会导致容器只是短暂运行,在守护进程被fork启动后,发起守护进程 的原始进程就会退出,这时容器就停止运行了

这个文件通过ADD指令复制到/etc/nginx/nginx.conf。

第一个指令以 目录/etc/nginx/ conf.d/结束,而第二个指令指定了文 件/etc/nginx/nginx.conf。将文件复制到Docker镜像时,这两 种风格都是可以用的。

构建Sample网站和Nginx镜像

利用之前的Dockerfile,可以用docker build命令构建出新的镜 像,并将这个镜像命名为heian/nginx

docker build -t heian/nginx .

Docker测试一个静态网站第1张

这将构建并命名一个新镜像。下面来看看构建的执行步骤。使用 docker history命令查看构建新镜像的步骤和层级

Docker测试一个静态网站第2张

 从Sample网站和Nginx镜像构建容器

现在可以使用heian/nginx镜像,并开始从这个镜像构建可以用 来测试Sample网站的容器。为此,需要添加Sample网站的代码。现在
注意提示下载这段代码到sample目录

$ mkdir website && cd website 
$ wget http://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/website/index.html
$ cd..

现在来看看如何使用docker run命令来运行一个容器

docker run -d -p 80 --name website  -v $PWD/website:/var/www/html/website heian/nginx nginx

上面命令如果有问题,那就执行下面的命令

docker run -d  -p 80 --name nginx -v $PWD/website:/var/www/html/website  heian/nginx /bin/bash -c "tail -f /dev/null;/usr/sbin/nginx"

可以看到,在执行docker run时传入了nginx作为容器的启动命令。一般情况下, 这个命令无法让Nginx以交互的方式运行。我们已经在提供给Docker的配置里加入了指令 daemon off,这个指令让Nginx启动后以交互的方式在前台运行

Docker测试一个静态网站第3张

可以看到,我们使用docker run命令从heian/nginx镜像创建 了一个名为website的容器。读者已经见过了大部分选项,不过-v选 项是新的。-v这个选项允许我们将宿主机的目录作为卷,挂载到容器 里。
回到刚才的例子。当我们因为某些原因不想把应用或者代码构建到镜 像中时,就体现出卷的价值了。例如:

  • 希望同时对代码做开发和测试;
  • 代码改动很频繁,不想在开发过程中重构镜像;
  • 希望在多个容器间共享代码

-v选项通过指定一个目录或者登上与容器上与该目录分离的本地宿主 机来工作,这两个目录用:分隔。如果容器目录不存在,Docker会自 动创建一个。
 

 docker run -d -p 80 --name website 
 -v $PWD/website:/var/www/html/website:ro  
heian/nginx nginx

这将使目的目录/var/www/html/website变成只读状态。

在Nginx网站容器里,我们通过卷将$PWD/website挂载到容器 的/var/www/ html/website目录,顺利挂载了正在开发的本地网 站。在Nginx配置里(在配置文 件/etc/ngingx/conf.d/global.conf中),已经指定了这个目 录为Nginx服务器的工作目录。
现在,如果使用docker ps命令查看正在运行的容器,可以看到名为 website的容器正处于活跃状态,容器的80端口被映射到宿主机的 49161端口

Docker测试一个静态网站第4张

修改网站

Docker测试一个静态网站第5张

我们已经得到了一个可以工作的网站!现在,如果要修改网站,该怎 么办?可以直接打开本地宿主机的website目录下的index.html文 件并修改

Docker测试一个静态网站第6张

Docker测试一个静态网站第7张

可以看到,Sample网站已经更新了。显然这个修改太简单了,不过可 以看出,更复杂的修改也并不困难。更重要的是,正在测试网站的运 行环境,完全是生产环境里的真实状态。现在可以给每个用于生产的 网站服务环境(如Apache、Nginx)配置一个容器,给不同开发框架 的运行环境(如PHP或者Ruby on Rails)配置一个容器,或者给后端 数据库配置一个容器,等等。 

免责声明:文章转载自《Docker测试一个静态网站》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇论文翻译:2018_Deep Learning for Acoustic Echo Cancellation in Noisy and Double-Talk Scenarios取快递的数学问题:手机尾号的重复概率下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Nginx自带的Realip模块获取用户真实IP

使用Nginx自带的Realip模块获取用户真实IP   (一)简要说明     如果你的Web服务器前端有代理服务器或CDN时日志中的$remote_addr可能就不是客户端的真实IP了。比较常用的解决方法有以下三几种,本文将主要介绍如何使用Nginx自带realip模块来解决这一问题 : 1,用CDN自定义IP头来获取 2,通过HTTP_X_F...

docker安装db2数据库

查询可安装的db2镜像 # docker search db2 [root@docker-servers ~]# docker search db2 INDEX NAME DESCRIPTION S...

nginx 414 Request-URI Too Large

症状 nginx 414 Request-URI Too Large #客户端请求头缓冲区大小,如果请求头总长度大于小于128k,则使用此缓冲区, #请求头总长度大于128k时使用large_client_header_buffers设置的缓存区client_header_buffer_size 128k; #large_client_header_buf...

使用Docker官方的Django包【转】

官方Django docker,并没有安装Django 所以需要 在requirements.txt中配置Django 具体安装流程可以参考:http://www.logme.cn/blog/51/use_Docker_official_django/ 作两记录: - python安装modules,切换到Python27Scripts 执行 easy_i...

docker 部署 flask(一)配置环境及测试

简介: flask也是要部署的。不能老在我们的pycharm里面跑测试服务器。 各种配置linux,我看就算了吧。我们用docker部署。 也就两三行命令。 一:选择基础镜像 GitHub repo: https://github.com/tiangolo/uwsgi-nginx-flask-docker Docker...

nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法

NGINX启动时提示错误: /usr/local/nginx/sbin/nginx -t/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or direct...