该配置也适用于其它 gulp、webpack 类型的项目(须要经过node.js打包成静态文件并部署到服务器的)html
建立一个demo项目。vue
vue init webpack demo01
复制代码
放在项目的根目录。node
Dockerfilelinux
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;"] 复制代码
基础镜像node,以及安装nginx。webpack
FROM node:8-slim
RUN apt-get update && apt-get install -y nginx 复制代码
在镜像中建立目录/usr/src/app
以及进入到该目录中。用来临时存放项目代码。nginx
WORKDIR /usr/src/app 复制代码
下载node依赖。web
# 拷贝三个依赖相关的json文件到 "/usr/src/app" 目录下
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
# 下载依赖
RUN npm install 复制代码
拷贝项目全部文件到 /usr/src/app
目录下。(这里选择了先下载依赖,再拷贝项目的全部文件到镜像中。)docker
COPY . . 复制代码
运行打包命令npm
RUN npm run build 复制代码
将nginx的日志软链接到了标准输出和标准错误。这样能够经过 docker logs
查看nginx的日志。json
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
复制代码
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 <宿主机路径>:<容器路径>