Ubuntu部署nodejs应用-Docker

1,730 阅读7分钟

系统版本:ubuntu~16.04.10

初始安装操作

  1. 环境配置完毕,部署基本完成
  2. 如果环境不一致?重复部署?由Docker来解决

更新

# 更新
sudo apt-get update

基本工具安装

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

nvm 安装

如果全部由Docker管理,可以跳过安装


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 解决方式,软连接

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管理,可以跳过安装


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管理,可以跳过安装

# 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 端口,负责端口转发

# 更新
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 修改

# 优化

# 隐藏版本号`Response Headers` -> `Server: nginx/1.10.3 (Ubuntu)` -> `Server: nginx`
# vi /etc/nginx/nginx.conf # 去掉注释
server_tokens off;

mongodb 安装与配置

如果全部由Docker管理,可以跳过安装

mongodb 安装

从 Ubuntu Repository 安装 MongoDB

# 更新
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 远程连接

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

参考资料