最近在學習後端的知識,本身搞了個本身玩的全棧項目,在須要發佈上線的時候,一開始是在服務器用的是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 用戶名/鏡像名
複製代碼
畢業一年多,第一次寫文章,不足之處,請求指出,十分感謝