最近在学习后端的知识,本身搞了个本身玩的全栈项目,在须要发布上线的时候,一开始是在服务器用的是git拉代码->编译构造->从新启动的手动挡模式,发布次数频繁了或者先后端须要同时发布就以为十分的繁琐,因此就想着怎么能够经过脚本就把全部过程自动化执行,让本身敲少几回命令html
阿里云有个CodePipeline服务,相似jenkins那样能够进行编译构建,不过到最后一步想部署容器的话,貌似须要开通集群之类的,可是钱要留着给女友花,因此就先放弃研究这一块的实现了...,而后只能想点比较简单暴力的方法去实现,结合本身的实际状况,一台笔记本走天下的,因此经过shell脚原本实现应该是比较合适的方案了前端
ssh shell docker nodenode
经过本地编译出dist文件用scp命令把文件放上去服务器对应的站点目录mysql
经过dockerFile编译出image上传到本身的仓库再触发服务器的对应脚本从新启动对应的containernginx
用的是Ubuntu 16.04,创建一个文件夹存着一系列对应项目的脚本,让本地经过ssh触发执行脚本git
使用docker是为了方便环境的构建,由于本身只有一个服务器,使用docker就能够很从容的部署以及管理多个项目,docker的规划以下图web
把本地的~/.ssh/id_rsa.pub复制到服务器~/.ssh/authorized_keys里面sql
从新登录一次便可mongodb
#!/bin/sh
#更新服务器脚本
scp -r ./aliyun/* root@(服务器ip):/server_sh/
复制代码
#!/bin/sh
# 首次安装docker跑的脚本
# 建立docker内部网络
docker network create --subnet 192.168.0.0/16 local-network
#启动web服务
./webserver.sh
#启动mongodb数据库
./mongodb.sh
#启动mysql数据库
./mysql.sh
复制代码
#!/bin/sh
# 启动Nginx服务
#中止正在运行的镜像
docker container stop webserver
#删除旧镜像
docker container rm webserver
#删除image,确保启动的时候能拿到最新的镜像
docker image rm masonchow/webserver
#下载最新镜像并启动
docker run -d -p 80:80 --name webserver -v /dockerVolume/web:/web:ro masonchow/webserver
复制代码
#!/bin/sh
#中止正在运行的镜像
docker container stop mongo
#删除旧镜像
docker container rm mongo
#删除image,确保启动的时候能拿到最新的镜像,若不须要拿最新版本镜像则不用运行
docker image rm mongo
# 安装并启动mongodb
docker run -d -p 27017:27017 -v /dockerVolume/db/mongo/data:/data/db --name mongo --network local-network --ip 192.168.0.101 mongo
复制代码
#!/bin/sh
#中止正在运行的镜像
docker container stop mysql
#删除旧镜像
docker container rm mysql
#删除image,确保启动的时候能拿到最新的镜像,若不须要拿最新版本镜像则不用运行
# docker image rm mysql
# 安装并启动mysql
docker run -d -p 3306:3306 -v /dockerVolume/db/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql --network local-network --ip 192.168.0.100 mysql
复制代码
docker container ls
就能够看到正在运行的容器信息由于只有一个服务器,若是多个前端项目的话,每次增长一个前端项目,就须要更改一次nginx的配置,因此就根据官方的nginx加以本身的配置,利用脚本把定制好的dockerfile构造一个image更新到本身的docker仓库上,给服务器下载使用便可docker
FROM nginx:latest
#一些nginx配置
ADD conf/nginx.conf /etc/nginx/nginx.conf
#nginx站点配置
ADD conf/server_app.conf /etc/nginx/conf.d/default.conf
ADD conf/gzip.conf /etc/nginx/conf.d/gzip.conf
RUN cd / \ && mkdir /web
WORKDIR /web
CMD ["nginx", "-g", "daemon off;"]
复制代码
这里监听的web目录是docker监听的本地目录,是因为在上文启动nginx的时候跑了-v /dockerVolume/web:/web:ro
前端项目只须要在本地构建完以后把dist文件夹同步到服务器对应的文件夹便可,例如我在项目文件夹下会创建一个publsh.sh,同时给个777的权限便可
#!/bin/sh
#删除本地的依赖包
rm -rf ./node_modules
#从新安装
npm i
#开始构建
npm run build
#删除远端自己的文件
ssh root@120.78.190.53 "rm -rf /dockerVolume/web/项目文件夹"
#把本地编译的文件放上去远端
scp -r ./wallet root@服务器IP:/dockerVolume/web/
复制代码
后端项目的思路是每次更新发布就跑一次项目的脚本,经过dockerflie把后端编译成一个新的image更新到本身的docker仓库让服务器的docker跑最新的镜像
#开始构建
npm run build
#构建最新镜像
docker build -t 用户名/镜像名 .
#发布镜像
docker push 用户名/镜像名
# 删除构建以后的代码
rm -rf ./dist
# 服务器现实新镜像
ssh root@服务器IP "cd /server_sh && ./服务器上面对应的脚本.sh"
复制代码
FROM node:8.9.3
COPY /dist /server
WORKDIR /server
ENV NODE_ENV=production
COPY /package.json /server
RUN npm install
CMD ["node", "./app.js"]
复制代码
#!/bin/sh
# 启动后端服务
#中止正在运行的镜像
docker container stop 容器名
#删除旧镜像
docker container rm 容器名
#删除image,确保下载的是最新镜像
docker image rm 用户名/镜像名
#下载最新镜像并启动
docker run -d -p 3005:3005 --name 容器名 --network local-network --ip 192.168.0.105 用户名/镜像名
复制代码
毕业一年多,第一次写文章,不足之处,请求指出,十分感谢