该配置也适用于其它 gulp、webpack 类型的项目(需要通过node.js打包成静态文件并部署到服务器的)
脚手架创建vue项目(示例用)
创建一个demo项目。
vue init webpack demo01
写dockerfile配置文件
完整的dockerfile文件
放在项目的根目录。
Dockerfile
FROM node:8-slim
RUN apt-get update && apt-get install -y nginx
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install
COPY . .
RUN npm run build
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
RUN cp -r dist/* /var/www/html \
&& rm -rf /user/src/app
CMD ["nginx","-g","daemon off;"]
dockerfile文件配置详解
基础镜像node,以及安装nginx。
FROM node:8-slim
RUN apt-get update && apt-get install -y nginx
在镜像中创建目录/usr/src/app以及进入到该目录中。用来临时存放项目代码。
WORKDIR /usr/src/app
下载node依赖。
# 拷贝三个依赖相关的json文件到 "/usr/src/app" 目录下
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
# 下载依赖
RUN npm install
拷贝项目所有文件到 /usr/src/app 目录下。(这里选择了先下载依赖,再拷贝项目的所有文件到镜像中。)
COPY . .
运行打包命令
RUN npm run build
将nginx的日志软连接到了标准输出和标准错误。这样可以通过 docker logs 查看nginx的日志。
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
移动打包后的文件到 nginx的 html目录下。并将项目源文件移除(没有用了,要的只是打包后的静态文件)。
RUN cp -r dist/* /var/www/html \
&& rm -rf /user/src/app
配置项目启动命令。-g 'daemon off;'配置参数将会使nginx前台运行,如果后台运行,docker容器会直接退出。
CMD ["nginx","-g","daemon off;"]
部署
将项目移动到部署的系统中(以linux为例),并进入到项目根目录中。
将项目打包成docker镜像。镜像名称为demo,版本号为1.0
docker build -t demo:1.0 .
-t <镜像名称>:<版本号>
创建容器并运行。这里用的是nginx-proxy进行代理。直接打开 <域名> 即可访问。
docker run -d -p 80 -e VIRTUAL_HOST=<域名> demo:1.0
# 可以开多个容器。nginx-proxy会自动配置负载均衡
docker run -d -p 80 -e VIRTUAL_HOST=<域名> demo:1.0
Vue history模式处理、API代理(附加)
需要配置nginx。配置文件可以放在项目中打到镜像内,还有就是放在宿主机中映射到容器内。这里选择的是后者,方便运维操作。
在宿主机中新建配置示例文件
/root/conf/demo.conf
server {
listen 80;
server_name <域名>;
# 接口代理
location /api {
# .... 省略
}
# vue `history` 模式配置
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}
}
改动启动命令
docker run -d -p 80 -e VIRTUAL_HOST=<域名> -v /root/conf:/etc/nginx/conf.d demo:1.0
-v <宿主机路径>:<容器路径>