一、准备工作
- 服务器购买 大家可以等到双11各大平台搞活动或者新人用户去白嫖。
- 服务器简介 我购买的是阿里云的ECS云服务器,从
控制台进入到云服务器ECS,直接看概览,可见面板内容如下。
- 修改服务器密码
- 设置安全组(影响服务器对外暴漏端口,一定要设置)
进入
安全组配置操作如下图:
- 点击
配置规则
- 点击
快速添加
这里列出了常用的对外端口,记得勾选SSH(22),方便后面使用SSH连接工具。
选中所需端口后,确定即可。至此,安全组配置完毕。
2. 配置Xshell工具或secureCRT工具
这里我使用的是secureCRT工具,点击crt工具的Quick Connect,配置如下,Hostname为实例的公网IP,Port就是22,用户名根据自己设定的配置,我使用默认的root. Authentication只配置了密码。 其他如下图。这样我们就可以通过SSH工具进行服务器的访问了。
2. docker 介绍
3. nginx介绍
二、服务器资源配置
- docker 简介
... - 安装docker:
sudo yum -y install docker-ce
docker有CE版本和SE版本,这里使用CE版本,其他docker知识这里不过多赘述。 docker安装成功后我们就有了部署的基础。
- nginx简介
... - 安装nginx镜像。
docker pull nginx
后面章节配置跨域代理、负载均衡使用。
- node简介 ...
- 安装node镜像。
docker pull node
后面章节做后台服务器依赖。
三、前端项目配置
- 使用
create-react-app创建一个基础的项目。 - 基于章节
2.2,接下来做nginx相关配置。
- 在项目根目录下创建
Dockerfile文件,配置如下:
FROM nginx
COPY build/ /usr/share/nginx/html/
COPY nginx_conf/default.conf /etc/nginx/conf.d/default.conf
expose 80
FORM nginx: 基于nginx镜像拉取
COPY build/ /usr/share/nginx/html/: 复制build下文件到/usr/share/nginx/html/下
COPY nginx_conf/default.conf /etc/nginx/conf.d/default.conf:同样复制操作。 EXPOSE 80 暴漏80端口 这里COPY只复制不解压,另一个相似命令ADD:复制到指定文件位置并解压。
- 项目路根目录下新建
nginx_config文件夹,并新建default.conf文件(nginx配置文件),配置如下
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 执行
npm run build生成项目打包文件。 此时项目根目录会出现build文件夹,里面是打包后的静态资源。
由于只是演示部署过程,真正实现的过程不需要提前打包静态资源,需要在镜像中加入复制package.json文件操作和执行 npm install操作
- 项目根目录下新建
reactimages文件,并将上面的build、Dockerfile、nginx_conf复制到该文件下、执行打包命令tar zcvf /Users/yuhaibo/Downloads/reactImages.tar.gz reactImages/ - 将刚刚打包
reactImages.tar.gz文件上传至服务器
上传后将文件解压:
tar xvzf reactImages.tar.gz,解压后生成reactImages文件夹
四、部署前端应用
- 构建react应用镜像
- 登录服务器,进入
reactImages文件夹下,执行:docker build -t reactapp . - 查看新建的镜像:
docker images
2. 启动react app
- 执行命令:
docker run -p 3000:80 -d --name reactAppNew reactapp
- dicker run 启动容器
- -p 3000:80 宿主机3000端口映射服务器80端口
- --name reactAppNew reactapp 基于
reactapp镜像创建reactAppNew容器
- 查看当前容器
docker ps | grep 'react'
3. 浏览器访问
公网IP:3000即可看到本地是可以看到前端页面
至此,前端应用部署成功。
五、部署后端接口服务(node)
- 新建一个文件夹
express
- 新建
Dockerfile - 新建
package.json - 新建
server.js - 新建
.dockerignore
2. 编写
package.json 文件
{
"name": "node server",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start": "nodemon server.js"
},
"author": "onbing",
"dependencies": {
"express": "~4.13.3",
"nodemon": "~1.8.1"
}
}
- 编写
server.js文件
'use strict';
const express = require('express');
const PORT = 8080;
const HOST = '0.0.0.0';
const app = express();
app.get('/', (req, res) => {
res.send('Hello world\n');
});
app.get('/json', (req, res) => {
res.json({
code: 0,
data :'This is message from node container'
})
});
app.listen(PORT, HOST);
console.log("Running on http://" + HOST +":"+PORT);
- 编写
Dockerfile文件
FROM node
WORKDIR /opt/express
COPY package*.json ./
RUN npm install --registry=https://registry.npm.taobao.org
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
- 编写
.dockerignore文件
node_modules
- 构建node服务镜像
docker build -t nodewebserver .
- 运行node服务容器
docker run -p 5002:8080 -d --name nodeserver nodewebserver
- 查看容器状态
docker ps
- 浏览器访问
公网IP:5002/json
可以看到后台服务容器已经正常启动了。
六、跨域转发
- 想要将前端容器服务的接口调用转发到node后台容器服务上,就必须知道node容器的ip地址。
- 进入docker容器内部:
docker exect -it [CONTAINER ID] bash - 查看docker容器IP:
cat /etc/hosts. 或 docker inspect [CONTAINER ID]
2. 跨域配置,修改nginx配置文件
server {
...其他配置
location /api/ {
rewrite /api/(.*) /$1 break;
proxy_pass http://172.17.0.5:8080;
}
...其他配置
}
七、配置优化
- 为了避免每次配置更新都需要重新创建一个镜像和容器,我们将配置改为挂载的方式,这样每次文件变动只需要执行一次命令即可。
docker run -p 3000:80 -d --name reactAppnew
--mount type=bind,source=/opt/reactImages/nginx_conf,target=/etc/nginx/conf.d
--mount type=bind,source=/opt/reactImages/build,target=/usr/share/nginx/html nginx
八、配置负载均衡
按照目录五介绍再次创建多个node容器服务并获取服务ip。
- 修改ngonx.conf文件
server {
...其他配置
location /api/ {
rewrite /api/(.*) /$1 break;
proxy_pass http://backend;
}
...其他配置
}
upstream backend {
server 172.17.0.2:8080;
server 172.17.0.3:8080;
server 172.17.0.5:8080;
}