美文网首页
docker vue 部署

docker vue 部署

作者: 小白小白啦 | 来源:发表于2018-12-15 17:42 被阅读229次

    我会带领大家从一个网上的开源项目,一步步通过docker部署起来,因为我也不是很熟悉docker、nginx所以绕了一些坑,后面会指出来。本文主要是把一个vue项目,通过nginx docker镜像或者通过node docker镜像部署起来,会把一些关键配置以代码形式展示出来,一步一步来,肯定可以运行起来的。

    docker 基础知识

    docker的基础知识网上都有,就简单的理解成一个容器吧,可以把代码放进去,然后通过端口映射,访问宿主机可以访问得到容器里面的程序。下面列举一些常用操作

    操作 代码
    登录仓库 docker login docker-registry.xxxx (用户名不带mail)
    退出仓库 docker logout
    拉取镜像 docker pull docker-registry.xxx/docker/nginx:1.13.6
    推送镜像 docker push
    删除镜像 docker rmi IMAGE ID
    查看正在运行的容器 docker ps
    停止一个容器 docker stop CONTAINER ID
    查看所有容器 docker ps -a
    删除一个容器 docker rm CONTAINER ID
    删除所有容器 docker rm $(docker ps -a -q)
    容器挂载 docker -v /opt/www/html:/var/www/html 宿主机绝对路径(一定要是绝对路径,不然无法挂载):docker容器
    build容器 docker build -t fgf/nginx:beta_v1 . (一定要有.,并且在Dockfile所在文件夹操作,也可以做其他设置,简单点就行)
    run docker run -d -p 80:80 IMAGE ID(-d 后台运行 -p 宿主机端口:docker端口)
    进入一个正在运行的docker docker exec -it CONTAINER ID /bin/bash
    进入一个镜像 docker run -it IMAGE ID /bin/bash
    从容器中退出 Ctrl + d 或者exit回车
    镜像重命名 docker tag IMAGE ID 新名字

    vue项目

    项目是在iview-admin一个非常棒的后台管理开源项目上开发的。最新版事基于vue-cli 3.0开发的,所以部署到docker里面遇到了一些配置问题,毕竟和vue-cli 2.0 不一样,还是有点不太习惯。大家如果想尝试的话,可以去GitHub把iview-admin代码下载下来进行docker 部署,然后用豆瓣公开的api进行nginx配置,把这个流程走一遍。
    我要做的事情就是浏览器打开页面,然后页面会转发我的请求到第三方的api,比如豆瓣api什么的。然后把取回的数据进行渲染。其中有个不太一样的地方就是header里面加了一个参数:USERTOKEN。

    vue 的配置

    vue.config.js 只把修改的地方列举出来

    const BASE_URL = process.env.NODE_ENV === 'production'
      ? '/'
      : '/'
    
      devServer: {
        host: '0.0.0.0',
        port: 80,
        proxy: {
          '/getXXX|/getAAA|/getBBB': {
            target: 'http://abc.com/d/key',
            changeOrigin: true
          },
        }
      }
    

    src/config/index.js 将开发环境dev、生成环境pro都设置为ip地址,因为线上环境肯定是通过ip访问的,结果本地设置为localhost可以访问,线上就会出现header参数无法代理转发等奇怪的问题,为了在本地复现这个问题,就把开发环境也设置为了ip,所以为了能顺利部署,尽量和线上环境一直,这样问题也好复现。

      baseUrl: {
        dev: 'http://10.5.179.17/',
        pro: 'http://10.23.237.139/'
      },
    

    src/main.js 引入mock因为如果你没有对接登录的api的话,进不到后台页面,所以线上环境也mock一下吧。

    require('@/mock')
    

    src/api/xxx.js

    export const findXXX = ({pid, userName, grp_name, pageNumber, pageSize}) => {
        return axios.request({
            baseUrl: '',
            headers: {
                USERTOKEN: 'abcde'
            },
            url: '/findxxx',
            method: 'get',
            params: {
                pid: pid,
                userName: userName,
                grp_name: grp_name,
                pageNumber: pageNumber,
                pageSize: pageSize
            }
        })
    }
    

    上面的baseUrl一定要设置为空在iview-admin中,其他项目不清楚。

    nginx文件配置

    custom.conf

    server {
        listen 80;
        listen [::]:80;
        # 接口服务的IP地址
        server_name localhost;
        charset utf-8;
        access_log off;
        # ElecManageSystem-应用文件夹名称 app-index.html页面所在文件夹
        root /var/www/html;
        index index.html;
    
        location / {
            try_files $uri $uri/ /index.html;
        }
    
        location /getXXX{
            proxy_pass http://abc.com/d/key/getXXX;
        }
        location /getAAA {
            proxy_pass http://abc.com/d/key/getAAA;
        }
        location /getBBB{
            proxy_pass http://abc.com/d/key/getBBB;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
    

    其中

    location / {try_files $uri $uri/ /index.html;}
    

    一定要写,不然部署项目后刷新后变成404,还有就是 location /getBBB已定不要写成 location /getBBB/ 区别就是多了一个/但是效果不一样,在末尾加一个/会发现axios请求一次,但是nginx有两个请求,其中第二个还会把post请求的参数丢失

    Dockerfile文件编写

    node镜像(docker 里面打包)

    FROM docker-registry.xxxx/docker/node:8.12.0-slim
    RUN apt-get update  && apt-get install -y nginx
    WORKDIR /app
    COPY . /app/
    EXPOSE 80
    RUN  npm install  && npm run build  && cp -r dist/* /var/www/html && rm /etc/nginx/sites-enabled/default && cp custom.conf /etc/nginx/sites-enabled/ && rm -rf /app
    CMD ["nginx","-g","daemon off;"]
    

    代码解释
    FROM 后面的地址大家根据自己情况,填写自己可以获得镜像的正确地址,然后是安装nginx,创建文件夹/app,然后将所有项目代码拷贝到docker镜像/app下面然后是安装依赖,打包,将打包好的文件复制到nginx目录下面,删除nginx默认目录,将自己的nginx配置文件复制到nginx对应目录。删除/app里面的文件,启动nginx。

    nginx镜像(宿主机打包)

    FROM docker-registry.xxx/docker/nginx:1.13.6
    COPY ./dist /var/www/html
    COPY ./custom.conf /etc/nginx/conf.d/ 
    RUN rm /etc/nginx/conf.d/default.conf
    EXPOSE 80
    CMD ["nginx","-g","daemon off;"]
    

    代码和上面类似就不解释了。但是方便快了很多

    打包

    docker build -t fgf/ngixn:beta_v1 .
    

    运行

    docker run -it -p 80:80 IMAGE ID
    

    然后就可以通过ip访问了。

    注意项

    1. nginx的配置一定要正确,还要记得删除原nginx的在conf.d或者sites_enabled里面的默认配置,以免出什么幺蛾子。有时候把配置build到docker镜像里面比较费时间,仅仅是为了验证nginx配置是否正确,这个时候可以通过挂载的方式验证配置,等nginx跑通了,再把nginx配置build到镜像里面。
    2. 一定要在本地环境跑通了,再放到线上Linux服务器里面,毕竟本地比较好调试

    相关文章

      网友评论

          本文标题:docker vue 部署

          本文链接:https://www.haomeiwen.com/subject/fgqghqtx.html