利用docker與shell腳本進行懶人服務器搭建

前言

最近在學習後端的知識,本身搞了個本身玩的全棧項目,在須要發佈上線的時候,一開始是在服務器用的是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免密登錄
  1. 把本地的~/.ssh/id_rsa.pub複製到服務器~/.ssh/authorized_keys裏面sql

  2. 從新登錄一次便可mongodb

安裝docker以及存放腳本
  1. docker簡介以及安裝 如何使用下面會說
  2. 在服務器喜歡的地方建一個存放執行腳本的文件夾,例如我就放在根目錄下/server_sh,而後給個777權限

本機配置

  1. 在本機建立一個文件夾server_sh,並給個777權限,同時建立一個存放阿里雲服務器上面的腳本的文件夾aliyun,此文件夾對應服務器上面的server_sh
  2. 在server_sh下面建立一個自動更新服務器文件update_aliyun.sh,經過scp命令把aliyun文件夾裏面的shell腳本同步到服務器,只要修改了腳本,執行一次./update_aliyun.sh,便可完成同步
#!/bin/sh 
#更新服務器腳本

scp -r ./aliyun/* root@(服務器ip):/server_sh/
複製代碼
  1. 在aliyun文件夾創建首次運行docker的腳本、須要安裝的數據庫類型腳本,這裏使用了nginx、mongodb、mysql
注意1:db類型的鏡像run的時候須要使用內部或者掛載主機目錄數據卷來存放db數據,否則容器被刪除,數據就會丟失
注意2:容器內容通信須要創建一次內部網絡,否則只能每一個端口都暴露出去,我爲了方便調試,全部的端口好都暴露了出來,從正式環境來說,應該只暴露nginx的80端口便可,其餘都使用容器內部通信
  • docker_create.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

複製代碼
  • webserver.sh(根據須要,由官方nginx爲基礎配置的鏡像,後面會說)
#!/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

複製代碼
  • mongodb.sh
#!/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
複製代碼
  • mysql.sh
#!/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
複製代碼
  1. 執行update_aliyun.sh同步腳本到服務器而且在服務器執行一次docker_create.sh以後,在服務器打docker container ls就能夠看到正在運行的容器信息

項目配置

Nginx

由於只有一個服務器,若是多個前端項目的話,每次增長一個前端項目,就須要更改一次nginx的配置,因此就根據官方的nginx加以本身的配置,利用腳本把定製好的dockerfile構造一個image更新到本身的docker倉庫上,給服務器下載使用便可docker

  • DockerFile
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跑最新的鏡像

  • publish.sh
#開始構建
npm run build

#構建最新鏡像
docker build -t 用戶名/鏡像名 .

#發佈鏡像
docker push 用戶名/鏡像名

# 刪除構建以後的代碼
rm -rf ./dist

# 服務器現實新鏡像
ssh root@服務器IP "cd /server_sh && ./服務器上面對應的腳本.sh"
複製代碼
  • DockerFile
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 用戶名/鏡像名
複製代碼

最後

畢業一年多,第一次寫文章,不足之處,請求指出,十分感謝

相關文章
相關標籤/搜索