Ubuntu部署nodejs應用-Docker

系統版本:ubuntu~16.04.10html

初始安裝操做

  1. 環境配置完畢,部署基本完成
  2. 若是環境不一致?重複部署?由Docker來解決

更新

# 更新
sudo apt-get update

複製代碼

基本工具安裝

# 基本工具安裝
sudo apt-get install vim openssl build-essential libssl-dev wget curl git

複製代碼

nvm 安裝

若是所有由Docker管理,能夠跳過安裝node

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.31.4/install.sh | bash
# 查看(若是沒法查看先退出再從新登入)
# 版本
nvm --version
# 遠程倉庫版本
nvm ls-remote
# 查看全部版本
nvm ls
# 安裝版本
nvm install v12.13.1
# 使用此版本
nvm use v12.13.1

# 查看node與npm版本
node --version
npm --version
複製代碼

sudo node --version,sudo npm --version
sudo: npm: command not found
sudo: node: command not found 解決方式,軟鏈接linux

which node
# /root/.nvm/versions/node/v12.13.1/bin/node

which npm
# /root/.nvm/versions/node/v12.13.1/bin/npm


sudo ln -s "/root/.nvm/versions/node/v12.13.1/bin/node" "/usr/local/bin/node"
sudo ln -s "/root/.nvm/versions/node/v12.13.1/bin/npm" "/usr/local/bin/npm"

# 再次查看便可正確返回
sudo npm --version

# 若是切換node版本,要先刪除/usr/local/bin/node,/usr/local/bin/npm
rm -rf /usr/local/bin/node
rm -rf /usr/local/bin/npm
# 再執行上面的軟鏈接
複製代碼

yarn 安裝

若是所有由Docker管理,能夠跳過安裝nginx

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'
sudo apt update
sudo apt install yarn
# 查看yarn
yarn --version


# 移除yarn及其依賴
sudo apt purge yarn
# 刪除yarn源
sudo rm /etc/apt/sources.list.d/yarn.list

複製代碼

安裝 pm2

若是所有由Docker管理,能夠跳過安裝git

# npm
# npm --registry=https://registry.npm.taobao.org install -g pm2
# yarn
# yarn config set registry https://registry.npm.taobao.org
yarn global add pm2
# 查看版本
pm2 --version

複製代碼

nginx 安裝&配置文件編寫

nginx 默認 80 端口,負責端口轉發github

# 更新
sudo apt-get update
# 安裝 nginx
sudo apt-get install nginx

# 根據業務編寫nginx.conf
cd /etc/nginx/conf.d/
vi test.conf

# 如下爲nginx經常使用命令
# 檢測nginx文件
nginx -t
# 啓動nginx服務
systemctl start nginx.service
# 中止nginx服務
systemctl stop nginx.service
# 重啓nginx服務
systemctl restart nginx.service
# 從新讀取nginx配置(這個最經常使用, 不用中止nginx服務就能使修改的配置生效)
systemctl reload nginx.service

複製代碼

config 修改web

# 優化

# 隱藏版本號`Response Headers` -> `Server: nginx/1.10.3 (Ubuntu)` -> `Server: nginx`
# vi /etc/nginx/nginx.conf # 去掉註釋
server_tokens off;
複製代碼

mongodb 安裝與配置

若是所有由Docker管理,能夠跳過安裝mongodb

mongodb 安裝

從 Ubuntu Repository 安裝 MongoDBdocker

# 更新
sudo apt update && sudo apt upgrade -y
# 安裝
sudo apt install mongodb

# 查看狀態
systemctl status mongodb

# mongodb配置文件查看
# mongodb.service - An object/document-oriented database
# Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
# Active: active (running) since Mon 2019-12-02 16:06:36 CST; 18s ago
# Docs: man:mongod(1)
# Main PID: 32418 (mongod)
# CGroup: /system.slice/mongodb.service
# └─32418 /usr/bin/mongod --config /etc/mongodb.conf
cat /etc/mongodb.conf
# 可知道默認數據和log存放地址,方便往後定時清理日誌
# # Where to store the data.
# dbpath=/var/lib/mongodb
# #where to log
# logpath=/var/log/mongodb/mongodb.log

# mongodb經常使用命令以下
systemctl status mongodb
systemctl stop mongodb
systemctl start mongodb
systemctl restart mongodb

# 卸載MongoDB
systemctl stop mongodb
apt purge mongodb
apt autoremove
# 完全卸載刪除mongodb
# 嘗試使用 dpkg 搜索已經安裝的mongo軟件包
sudo dpkg -l | grep mongo
# remove
sudo apt-get remove mongodb* --purge
# 刪除數據庫和日誌文件
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb
複製代碼

默認配置修改

須要 robot3T 遠程鏈接shell

# 修改mongodb配置文件
systemctl status mongodb # 查看狀態
vi /etc/mongodb.conf # 修改配置
# 端口和ip修改
# 127.0.0.1=>0.0.0.0
# port=>27017
複製代碼

mongodb 配置

基本的安全意識是要有的

mongodb 默認監聽端口 27017,人盡皆知,因此很不安全,容易被勒索,基本的防禦措施咱們仍是須要處理的

設置用戶名密碼和數據庫的訪問權限

# 建立超級管理員
mongo   # 進入mongo shell
show dbs   # 顯示全部數據庫
use admin  # 進入admin數據庫
# 建立一個用戶,身份是超級管理員
db.createUser({user:"root",pwd:"123456",roles:[{role:'root',db:'admin'}]})
# 退出mongo shell 再次進入,權限測試,返回1說明登陸成功
use admin
db.auth("root","123456")

# 爲別的數據庫建立用戶
use admin
# 建立用戶,用戶 wang 對數據庫test的權限爲讀寫
db.createUser({user:"wang",pwd:"123456",roles:[{ role: "readWrite", db: "test" }]})

# auth認證
db.auth("test-user","123456")

# 操做對應數據庫
use test
db.test.save({name:'老王',age:18})


# 查看全部用戶
use admin
db.system.users.find({})
複製代碼

默認狀況下 MongoDB 是不開啓用戶認證的。若是咱們添加用戶,那麼須要開啓用戶認證機制。經過修改 mongodb.conf 配置文件(/etc/mongodb.conf),在文件中解開 auth=true 便可

# bind_ip = 127.0.0.1
# 遠程訪問
bind_ip = 0.0.0.0
port = 27017

# Turn on/off security. Off is currently the default
# noauth = true
auth = true
複製代碼

而後重啓 MongoDB 服務

# 進入mongodb shell
mongo

show dbs # 會報錯,由於權限已設置

# 登陸認證=> db.auth('user','pwd')
use admin
# 返回 1 說明認證成功
db.auth('root','123456')

複製代碼

Robo3T 訪問

此類工具填寫帳戶名和密碼可鏈接訪問
注意防火牆或安全組已經打開(27017 端口),且 ip 修改成(0.0.0.0)

Robo3T 訪問 詳見此篇


以上就完成了基本環境搭建,若是你想用Docker,接着往下走

docker 安裝

若是所有以 Docker 方式部署應用node, mongo, pm2等均可沒必要安裝

  1. 更新系統軟件
    sudo apt-get update
    複製代碼
  2. 安裝依賴包
    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
    複製代碼
  3. 添加官方密鑰
    # 添加 Docker 官方的 GPG 密鑰(爲了確認所下載軟件包的合法性,須要添加軟件源的 GPG 密鑰)
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    # 網絡問題可使用國內鏡像
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    複製代碼
  4. 添加倉庫
    # 設置穩定版本的apt倉庫地址
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    # 國內地址
    sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    複製代碼
  5. 再次更新軟件
    sudo apt-get update
    複製代碼
  6. 安裝 docker
    # 具體版本安裝 sudo apt-get install docker-ce=<VERSION>
    sudo apt-get install docker-ce
    複製代碼
  7. 查看 docker 版本
    docker --version
    複製代碼
  8. 加速器

    因爲鏡像服務可能出現宕機,建議同時配置多個鏡像

    # 修改配置文件的方法,配置文件若是不存在則新建
    vi /etc/docker/daemon.json
    # 寫入以下內容
    {
       "registry-mirrors": [
          "https://docker.mirrors.ustc.edu.cn",
          "https://registry.docker-cn.com",
          "https://dockerhub.azk8s.cn",
          "https://reg-mirror.qiniu.com"
       ]
    }
    複製代碼
  9. 重啓服務
sudo systemctl daemon-reload
sudo systemctl restart docker
複製代碼

docker 經常使用命令

# 設置開機啓動
sudo systemctl enable docker
sudo systemctl start docker

# 查看docker服務是否啓動
systemctl status docker
# 啓動docker服務
sudo systemctl start docker
# 關閉docker服務
sudo systemctl stop docker

# 查看容器啓動列表
docker ps -a

# 查看容器列表
docker images -a

# 查看默認配置
cat /etc/systemd/system/multi-user.target.wants/docker.service

# 運行狀態查看 docker stats
docker stats -a
複製代碼

至此就能夠用docker管理應用了

可是很明顯的弊端就是手動管理不宜構建不易維護,此時docker-compose又能夠助你一臂之力

docker-compose 安裝

是一個快速編排Docker服務的工具

  1. 下載 docker-compose
    sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    複製代碼
  2. 受權
    sudo chmod +x /usr/local/bin/docker-compose
    複製代碼
  3. 查看版本信息
    docker-compose --version
    複製代碼
  4. 安裝 docker composer 自動補全命令
    curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
    複製代碼

部署

基本環境搭建完成,Centos 與 Ubuntu 部署方式基本一致

關鍵點

  • nginx 反向代理與負載均衡
  • webhook 自動部署(github,gitee)
  • mongodb 數據庫導入導出以及定時打包備份並同步到七牛雲存儲
  • pm2 進程管理
  • SSL 證書,以及腳本自動更新 SSL 證書,如何作到一次部署永久 https

具體細節以下

  1. 傳統部署方式參考
  2. Docker 部署兩種方案

思考如下幾個問題

  1. 若是容器沒有定義在同一個docker-compose.yml文件中,它們之間如何連接?
  2. 若是有手動run起的鏡像,也有docker-compose up起的鏡像,它們之間又如何連接?
  3. 自動化部署,自動部署腳本編寫是否有必要每次都從新構建鏡像(畢竟每次build耗時較長)?

參考資料

相關文章
相關標籤/搜索