最近自己做了个小项目,试着使用docker来进行发布,而其中用到了node做跨越代理,就是为了解决这个问题至少多花费了我一天时间,不说了直接进入主题吧

step 1 部署环境
step 2 vue项目根目录添加 node所需的 server.js

目录机构如下



prod.server.js 内容如下


var express = require('express');
var config = require('./config/index'); var port = process.env.PORT || config.build.port; var app = express(); var router = express.Router();
const axios = require('axios') axios.interceptors.request.use((config) => {
return config;
}, (error) => {
return Promise.reject(error);
}); axios.interceptors.response.use((response) => {
return response;
}, (error) => {
return Promise.reject(error);
}); router.get('/', function (req, res, next) {
req.url = '/index.html';
next();
}); app.use(router); var apiRoutes = express.Router();
app.use('/api', apiRoutes); app.get('/api/getDiscList', (req, res) => {
var url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
axios.get(url, {
headers: {
referer: 'https://c.y.qq.com/',
host: 'c.y.qq.com'
},
params: req.query
}).then((response) => {
res.json(response.data)
}).catch((e) => {
console.log('错误日志')
console.log(e)
})
}),
app.get('/api/getMusic', (req, res) => {
var url = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg'
axios.get(url, {
headers: {
referer: 'https://c.y.qq.com/',
host: 'c.y.qq.com'
},
params: req.query
}).then((response) => {
res.json(response.data)
}).catch((e) => {
console.log('错误日志')
console.log(e)
})
}),
app.get('/api/getplaysongvkey', function (req, res) { // 获取vkey
var url = 'https://u.y.qq.com/cgi-bin/musicu.fcg'
axios.get(url, {
headers: {
origin: 'https://y.qq.com',
referer: 'https://y.qq.com/portal/player.html'
},
params: req.query
}).then((response) => {
res.json(response.data)
}).catch((e)=>{
console.log(e)
})
}),
app.get('/api/lyric', (req, res) => {
var url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg'
axios.get(url, {
headers: {
referer: 'https://c.y.qq.com/',
host: 'c.y.qq.com'
},
params: req.query
}).then((response) => {
res.json(response.data)
}).catch((e) => {
console.log('错误日志')
console.log(e)
})
}),
app.get('/api/getSongList', (req, res) => {
var url = 'https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg'
axios.get(url, {
headers: {
referer: 'https://c.y.qq.com/',
host: 'c.y.qq.com'
},
params: req.query
}).then((response) => {
var ret = response.data
res.json(ret)
}).catch((e) => {
console.log('错误日志')
console.log(e)
})
}),
app.get('/api/suggestSearch', (req, res) => {
var url = 'https://c.y.qq.com/soso/fcgi-bin/search_for_qq_cp'
axios.get(url, {
headers: {
referer: 'https://c.y.qq.com/',
host: 'c.y.qq.com'
},
params: req.query
}).then((response) => {
var ret = response.data
res.json(ret)
}).catch((e) => {
console.log('错误日志')
console.log(e)
})
}) app.use(express.static('./dist')); module.exports = app.listen(port, function (err) {
if (err) {
console.log(err);
return
}
console.log('Listening at http://localhost:' + port + '\n')
});

与此同时修改package.json 中 node的启动脚本,如下


"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "node prod.server.js",
"lint": "eslint --ext .js,.vue src",
"build": "node build/build.js"
},

"start": "npm run dev" 改为 "start": "node prod.server.js"

因为直接使用 npm run dev 将无法完成node的代理

会出现调用api接口报错

step 3 执行npm run build 后将dist目录上传到centos

# 执行 ll 查看已上传的文件
[root@VM_0_5_centos vuedev]# ll
total 20
drwxr-xr-x 2 root root 4096 Jul 28 09:01 config
drwxr-xr-x 3 root root 4096 Jul 28 09:01 dist
-rw-r--r-- 1 root root 404 Jul 28 09:02 Dockerfile
-rw-r--r-- 1 root root 2612 Jul 28 09:01 package.json
-rw-r--r-- 1 root root 3253 Jul 28 09:01 prod.server.js

同时在该目录创建一个Dockerfile用于镜像制作,文件内容如下


FROM docker.io/node:8.0-alpine # Create app directory
WORKDIR /usr/src/vueappdev # Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./ RUN npm install # If you are building your code for production
# RUN npm ci --only=production # Bundle app source
COPY . . EXPOSE 9009
CMD [ "npm", "start" ]

Dockerfile文件就很多中配置,还有待研究…

step 4 制作镜像

#cd 到项目目录下
[root@VM_0_5_centos ~]# cd /opt/web_proj/vuedev # 执行镜像创建 (注意最后的 . 标识使用当前目录下的Dockerfile)
[root@VM_0_5_centos vuedev]# docker build -t vuedev:v1 . # 执行完上面步骤,现在可以看见你创建的images了
[root@VM_0_5_centos vuedev]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vuedev v1 ac171f1d6b87 21 hours ago 239 MB
step 5 容器创建

# 创建并运行容器
[root@VM_0_5_centos vuedev]# docker run -p 8191:8009 --name vuedev2 -d vuedev:v1 # 查看容器运行日志
[root@VM_0_5_centos vuedev]# docker logs -f -t --tail 200 vuedev2
2019-07-26T02:59:30.093574000Z npm info it worked if it ends with ok
2019-07-26T02:59:30.094162000Z npm info using npm@5.0.0
2019-07-26T02:59:30.094450000Z npm info using node@v8.0.0
2019-07-26T02:59:30.137340000Z npm info lifecycle vue-music@1.0.0~prestart: vue-music@1.0.0
2019-07-26T02:59:30.143459000Z npm info lifecycle vue-music@1.0.0~start: vue-music@1.0.0
2019-07-26T02:59:30.147283000Z > vue-music@1.0.0 start /usr/src/vueappdev
2019-07-26T02:59:30.147534000Z > node prod.server.js
2019-07-26T02:59:30.404213000Z Listening at http://localhost:8009 # 查看容器运行情况 【运行后见 STATUS 处于 Up 标识正在运行】
[root@VM_0_5_centos vuedev]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6141d4fda6c9 vuedev:v1 "npm start" 21 hours ago Up 21 hours 9009/tcp, 0.0.0.0:8191->8009/tcp vuedev2 # 使用wget进行端口检测【运行后见 response... 200 ok 信息标识端口测试成功】
[root@VM_0_5_centos vuedev]# wget localhost:8191
--2019-07-27 08:44:10-- http://localhost:8191/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:8191... connected.
HTTP request sent, awaiting response... 200 OK
Length: 514 [text/html]
Saving to: ‘index.html.4’ 100%[=================================================================================================================================================>] 514 --.-K/s in 0s 2019-07-27 08:44:10 (61.4 MB/s) - ‘index.html.4’ saved [514/514] # 假如我们检测了一个不存在的端口【结果会是如下】
[root@VM_0_5_centos vuedev]# wget localhost:8190
--2019-07-27 08:45:14-- http://localhost:8190/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:8190... failed: Connection refused.
Connecting to localhost (localhost)|::1|:8190... failed: No route to host.

【注意】在执行docker run -p 8191:8009 --name vuedev2 -d vuedev:v1

运行容器的时候,端口的指定要小心,不然会被坑;

其中的8191指的是容器向外暴露的端口,而8009这个就要注意了(我当时就没弄明白)

这个并不是Dockerfile中的 EXPOSE 9009

而是 vue中config>index.js 文件里

build:{ port:8009, }

中的 8009

如果你不需要node进行api代理(就是没有修改package.json的script) 如

  "scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --host 0.0.0.0",
"start": "npm run dev",
"build": "node build/build.js"
},

那么端口就应该是

dev: { port: 18080, }

中的 18080


到此项目部署圆满完成 ;在手机浏览器中输入https://whaala.com/vueapp/即可访问页面,如果使用PC请F12转到手机模式预览,因为这是一个移动版app

该项目源码访问地址:https://github.com/dengxiaoning/vue-music


docker +node 部署vue项目的心路历程的更多相关文章

  1. Docker 部署 vue 项目

    Docker 部署 vue 项目 Docker 作为轻量级虚拟化技术,拥有持续集成.版本控制.可移植性.隔离性和安全性等优势.本文使用Docker来部署一个vue的前端应用,并尽可能详尽的介绍了实现思 ...

  2. 在nginx上部署vue项目(history模式)--demo实列;

    在很早之前,我写了一篇 关于 在nginx上部署vue项目(history模式) 但是讲的都是理论,所以今天做个demo来实战下.有必要让大家更好的理解,我发现搜索这类似的问题还是挺多的,因此在写一篇 ...

  3. docker中部署django项目~~Dockfile方式和compose方式

    1.  背景:   本机win10上,后端django框架代码与前端vue框架代码联调通过. 2.  目的:   在centos7系统服务器上使用docker容器部署该项目. 3.  方案一:仅使用基 ...

  4. docker自动化部署前端项目实战一

    docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...

  5. 在nginx上部署vue项目(history模式);

    在nginx上部署vue项目(history模式): vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想has ...

  6. 记基于docker+gunicorn部署sanic项目遇到的很多很多坑

    前言: 最近有个项目需要上线,是python中sanic网络异步框架写的,并且要求使用docker+nginx来部署项目实现负载均衡,于是乎百度了sanic项目部署,基本上都是基于docker+gun ...

  7. nginx部署vue项目

    nginx是一个高性能的HTTP和反向代理服务器.因此常用来做静态资源服务器和后端的反向代理服务器.本文主要记录使用nginx去部署使用vue搭建的前端项目,项目基于vue官方的脚手架vue-cli构 ...

  8. CentOS7 安装nginx部署vue项目

    简单描述:代码开发完了,需要环境来运行测试.服务器上没有nginx,搞起搞起.   在Centos下,yum源不提供nginx的安装,可以通过切换yum源的方法获取安装.也可以通过直接下载安装包的方法 ...

  9. 部署vue项目到Linux服务器

    案例一 vue-cli构建vue3项目,将项目上传到Linux服务器,服务器安装node,并启动vue项目 首先本地有一个vue项目,启动后可正常访问 本地打包后,也可直接访问 若打包后的index. ...

  10. Docker镜像+nginx 部署 vue 项目

    一.打包vue项目 在开发完的vue项目输入如下命名,打包生成dist文件夹 yarn build / npm run build 此时根目录会多出一个文件夹:dist文件夹,里面就是我们要发布的东西 ...

随机推荐

  1. Axios的js文件的下载教程+相关应用

    下载教程来啦! 1.进入GitHub网站,网址在这里:http://github.com 2.去搜索框搜索Axios,得到如下界面: 3.然后选择这里: 会出现如下界面: 4.点击右方的绿色按钮&qu ...

  2. Nacos与OpenFeign开发

    目录 1.前言 2.生产者 3.消费者 4.扩展 1.前言 我的话是微服务B调用微服务A的controller层 2.生产者 微服务A请求接口如下: @GetMapping("/listUn ...

  3. (新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4

    本文意在帮助 Go 语言初学者在 Linux环境下编写自己的第一个Golang程序 难点主要在 VScode 中 Go 插件的下载 与 go.mod 以及编译运行和 第一个Go测试程序的使用 前提准备 ...

  4. 全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门解析非结构化数据应用——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...

  5. Redis 缓存雪崩 |击穿 |穿透 概念及解决方案

    一.雪崩 1.概念  指某一时间段,缓存集中过期失效,无数的请求绕开缓存,直接访问数据库. 2.解决方案 让redis数据永不过期,这种方式最可靠的.最安全的,但占用空间,内存消耗大,并且不能保持数据 ...

  6. TS 基础及在 Vue 中的实践:TypeScript 都发布 5.0 版本啦,现在不学更待何时!

    大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端.跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营. 微软于3月16日发布了 TypeScript 5.0 版本 ...

  7. abp(net core)+easyui+efcore实现仓储管理系统——ABP升级7.3下(五十九)

    Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  8. 在Mac搭建一个便捷的Markdown创作环境

    前言 使用 Typora + PicGo + Gitee + Snipaste 在 Mac 搭建一个 Markdown 编辑环境. Typora 是一款简洁的 Markdown 编辑器: PicGo ...

  9. Java BIO,NIO,AIO

    一丶IO模型&Java IO Unix为程序员提供了以下5种基本的io模型: blocking io: 阻塞io nonblocking io: 非阻塞io I/O multiplexing: ...

  10. LeeCode 动态规划(二)

    01背包问题 题目描述 有 n 件物品和容量为 w 的背包,给你两个数组 weights 和 values ,分别表示第 i 件物品的重量和价值,每件物品只能使用一次,求解将哪些物品装入背包可使得物品 ...