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耗时较长)?

参考资料