对于“通过 nginx 访问网站资源文件”形式的前端项目,有以下三种方式将项目部署到 Docker 容器。

资源文件拷贝到容器方式

◊ 假设前端发布压缩包”dist.tar.gz”内部结构是 dist 文件夹->index.htnl&static 文件夹。
◊ 发布包同目录下创建 nginx 配置文件”default.conf”,例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80 default_server;

location / {
root /usr/share/nginx/html/dist;
index index.html;
try_files $uri $uri/ /index.html = 404;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

◊ 发布包同目录下创建 Dockerfile,内容示例如下,其中的 dist.tar.gz 文件 Docker 会自动做解压,如果是文件夹 dist,注意 Docker 将只拷贝 dist 文件夹内部的内容。

1
2
3
4
5
FROM nginx:latest
LABEL maintainer "Congzhou"
ADD dist.tar.gz /usr/share/nginx/html
ADD default.conf /etc/nginx/conf.d
EXPOSE 80

◊ 构建镜像:docker build -timageName. 。
◊ 运行测试镜像:docker run -p 4000:80imageName–name containerName ;
◊ 浏览器访问 ip:4000;

本地目录挂载到容器方式

● 运行测试镜像:docker run -p 4000:80 -v /home/docker_congzhou/my_project/agt_jinzhong/nginx_conf:/etc/nginx/conf.d -v /home/docker_congzhou/my_project/agt_jinzhong/nginx_file:/usr/share/nginx/html nginx –name containerName ;
● 浏览器访问 ip:4000;
● 通过 docker 的卷(volume)机制实现将宿主机上的本地目录挂载到容器,这样所做的修改不会随着容器重启而丢失,且在宿主机对应的 Volume 挂载目录下做修改将在容器中生效。

使用数据容器的方式

◆ 创建包含指定目录挂载的数据容器

1
docker create -v /home/docker_congzhou/my_project/agt_jinzhong/nginx_conf:/etc/nginx/conf.d -v /home/docker_congzhou/my_project/agt_jinzhong/nginx_file:/usr/share/nginx/html --name agt_jinzhong_data nginx

◆ docker run –rm -p 80:80 –volumes-from agt_jinzhong_data nginx

三种方式比较

◇ 资源文件拷贝到容器方式

缺点

(1)运行多个 container 时每个 container 内都有一份资源。
(2)由于 docker 容器每次重启都是一个新的环境,在 docker 容器内做的修改将被还原,当需要修改 nginx 配置文件或静态资源时需要重新构建镜像。

优点

(1)通过命令行自动化操作,利于集成到 CI/CD 流程,更方便地完成滚动更新、服务器迁移、回滚等操作。

◇ 本地目录挂载到容器和使用数据容器的方式优缺点与以上相反。