Ubuntu18.04 下使用 Docker 测试静态网站

Sample 网站的初始 Dockerfile

mkdir sample && cd sample
touch Dockerfile

需要一些配置文件才能运行这个网站:

cd sample
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 ..

Dockerfile 编辑如下:

FROM ubuntu:14.04
MAINTAINER nikki "[email protected]"
ENV REFRESHED_AT 2019-10-18
RUN apt-get update
RUN apt-get -y install nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

Dockerfile 主要内容:

  • 安装 Nginx
  • 在容器中创建一个目录 /var/www/html
  • 将来自我们下载的本地文件的 Nginx 配置文件添加到镜像中
  • 公开镜像的 80 端口

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 在 Docker 容器里工作,因此还需要将 Nginx 配置为非守护进程的模式,将文件 nginx/nginx.conf 复制到 /etc/nginx 目录就是可以达到这个目的,nginx.conf:

user www-data;
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 进入后台,强制在前台运行

默认情况下,Nginx 会以守护进程的方式启动,这会导致容器只是短暂运行,在守护进程被 fork 启动后,发起守护进程的原始进程就会退出,容器就会停止运行

Dockerfile 指令目录中 ADD 以 conf.d 和 nginx.conf 两种风格都是允许的

构建 Sample 网站和 Nginx 镜像

sudo docker build -t nikki01/nginx .

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

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

这将在 sample 目录中创建一个名为 website 的目录,然后为 Sample 网站下载 index.html 文件,放到 website 目录中

现在创建一个容器:

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

-v 选项允许将宿主机的目录作为卷,挂载到容器中

卷是在一个或多个容器内被选定的目录,可以绕过分层的联合文件系统,为 Docker 提供持久数据或共享数据,这意味着对卷的修改会直接生效,并绕过镜像。当提交或创建镜像时,卷不被包含在镜像里

卷可以在容器间共享,即使容器停止,卷里的内容依旧存在

卷的价值:

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

-v 制定了卷的源目录(本地宿主机的目录)和容器里的目的目录,这两个目录通过 : 分隔,如果目的目录不存在,Docker 会自动创建一个

也可以通过在目的目录后面加上 rw 或 ro 制定目的目录的读写状态:

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

此时,目的目录变成只读状态

sudo docker ps -l

查看端口映射

打开浏览器,输入:

localhost:显示的端口号

查看 sample 网站

vi $PWD/website/idnex.html

可以直接在文件中修改网页内容,之后刷新网页即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章