node 项目从构建到使用 jenkins + docker + nginx + mysql + redis 自动化部署

概述

这都2019年底了,你还不会 docker吗? 你 low 爆了,咱们做为一枚前端,不能说是要精通使用 docker 完成各类事情,但我以为必需要学会使用 docker 干下面几件事:html

  1. 部署前端应用
  2. 部署nginx
  3. 使用docker-compose部署
  4. 在容器之间创建联系

Docker 可理解为跑在宿主机上的很是精简、小巧、高度浓缩的虚拟机。 它能够将容器里的进程安稳的在宿主机上运行,以前我也有写过一些关于docker的文章,在这我就不作过多的介绍了,若有须要请自行查看我以前的文章便可,接下来咱们经过项目来了解并使用 docker前端

Egg.js ?

在这里我使用 egg.js 来为你们实操一下项目的部署流程。有人会问 egg.js 是什么? 我只能回答这是一款专业级的 node 框架。做为一个有梦想的前端,咱们有必要去学习一种后端语言,而做为前端 node 的学习成本相对来讲比较低的。 egg.js 这个框架在 node 现有框架中也是比较优秀的,若有须要,你们能够自行学习,咱们今天的学习主要仍是项目的部署流程,在这我就不给你们作过多的介绍。若有须要,请查阅 官方文档node

开始前的准备

docker 与 docker-compose 的安装我就不给你们介绍了。在以前的文章中是有的,也比较详细,做为一位开发人员,我认为这点事情难不倒你们mysql

初始化项目

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
复制代码

建立须要的文件

咱们须要在项目根目录建立咱们所须要的文件nginx

$ touch Dockerfile
$ touch docker-compose.yml
$ setup.sh
复制代码

目录结构

egg-project
├── package.json
├── setup.sh (新建)
├── Dockerfile (新建)
├── docker-compose.yml (新建)
├── app
|   ├── router.js
│   ├── controller
│   |   └── home.js
│   ├── service (可选)
│   |   └── user.js
│   ├── middleware (可选)
│   |   └── response_time.js
│   ├── schedule (可选)
│   |   └── my_task.js

...

复制代码

经常使用指令

在开始以前咱们要学习下经常使用的一些指令,看下方:redis

了解流程

安装 jenkins

在安装jenkins我选择了使用docker-compose
docker-compose 是一个用来把 docker 自动化的东西
有了 docker-compose 你能够把全部繁复的 docker 操做全都一条命令,自动化的完成。sql

首先咱们须要在服务器上建立一个目录机构 (具体结构我的自行建立)

/home/jenkins
     - docker-compose.yml
     - jenkins-home
复制代码

接下来咱们来编写 docker-compose.yml 安装jenkins

version: '3'                                    # 指定 docker-compose.yml 文件的写法格式
services:                                       # 多个容器集合
  docker_jenkins: 
    user: root                                  # 为了不一些权限问题 在这我使用了root
    restart: always                             # 重启方式
    image: jenkins/jenkins:lts                  # 指定服务所使用的镜像 在这里我选择了 LTS (长期支持)
    container_name: jenkins                     # 容器名称
    ports:                                      # 对外暴露的端口定义
      - '8080:8080'
      - '50000:50000'
    volumes:                                    # 卷挂载路径
      - /home/jenkins/jenkins_home/:/var/jenkins_home   # 这是咱们一开始建立的目录挂载到容器内的jenkins_home目录
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker                 # 这是为了咱们能够在容器内使用docker命令
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose     # 一样的这是为了使用docker-compose命令
复制代码

咱们须要进入到 jenkins 目录下执行:docker

$ docker-compose up -d
复制代码

配置

不出意外你如今能够打开你的服务器地址 http://xxxxxxx:端口号 就能看到这个界面:shell

打开你所建立的jenkins目录进入到jenkins-home
/home/jenkins/jenkins-home数据库

进入 secrets 目录

$ cat initialAdminPassword
复制代码

而后把里面的文本复制出来填到管理员密码中

接下来须要安装两个插件

NodeJS Plugin
Publish Over SSH
复制代码

而后咱们滑到最下方

开始咱们的操做

Dockerfile

咱们在开始阶段的时候学过一些经常使用指令,你们应该一眼就能够看得懂这些命令。 加油!!

FROM node:10.0-alpine             # 镜像版本

# 设置时区
RUN apk --update add tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && apk del tzdata 
# 建立app目录
RUN mkdir -p /usr/src/node-app/egg-santak 
# 设置工做目录
WORKDIR /usr/src/node-app/egg-santak 
# 拷贝package.json文件到工做目录
# !!重要:package.json须要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,从新构建对应的层。
# 若是package.json和源代码一块儿添加到镜像,则每次修改源码都须要从新安装npm模块,这样木有必要。
# 因此,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/node-app/egg-santak/package.json 
# 安装npm依赖(使用淘宝的镜像源)
# 若是使用的境外服务器,无需使用淘宝的镜像源,即改成`RUN npm i`。
RUN npm i --registry=https://registry.npm.taobao.org 
# 拷贝全部源代码到工做目录
COPY . /usr/src/node-app/egg-santak 
# 暴露容器端口
EXPOSE 7001

# 启动node应用
CMD npm start 复制代码

在服务器中建立咱们所须要挂载的数据卷

# nginx
$ mkdir -p nginx/conf.d nginx/logs
 # mysql
$ mkdir mysql
 # redis
$ mkdir redis
复制代码

而后进入 nginx/conf.d 文件夹中 建立一个后缀为 conf 的文件

$ cd nginx/conf.d
$ touch default.conf
$ vim default.conf
复制代码

写入如下内容:

server {
  listen 80;
  listen [::]:80;
  server_tokens off;

  root /var/www/html;
  index index.html index.htm;

  # 修改成本身的域名
  server_name api.lovelp.xin;

  # 访问 / 路径时执行反向代理
  location / {
    # 这里 nodejs 是 node 容器名
    proxy_pass http://nodejs:7001;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    # 后端的Web服务器能够经过 X-Forwarded-For 获取用户真实 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 容许客户端请求的最大单文件字节数
    client_max_body_size 15M;
    # 缓冲区代理缓冲用户端请求的最大字节数
    client_body_buffer_size 128k;
  }
}
复制代码

docker-compose.yml

version: '3'

services:
 santak_redis:
 image: redis:3                  # 指定服务镜像
 container_name: santak_redis    # 容器名称
 restart: always                 # 重启方式
 hostname: redis
 command: redis-server /usr/local/etc/redis/redis.conf --requirepass 123456  --appendonly yes
 volumes:                        # 挂载数据卷
 - /root/redis/redis.conf:/usr/local/etc/redis/redis.conf
 ports:                          # 映射端口
 - "6379:6379"     
 networks:                       # 加入指定网络
 - app-network

 santak_nginx:
 image: nginx:stable-alpine      # 指定服务镜像
 container_name: santak_nginx    # 容器名称
 restart: always                 # 重启方式
 ports:                          # 映射端口
 - "80:80"
 volumes:                        # 挂载数据卷
 - /etc/localtime:/etc/localtime
 - /root/nginx/conf.d:/etc/nginx/conf.d
 - /root/nginx/logs:/var/log/nginx
 depends_on:                     # 启动顺序
 - nodejs
 networks:                       # 加入指定网络
 - app-network

 santak_mysql:
 image: mysql:5.7
 container_name: santak_mysql
 restart: always
 ports:                          # 映射端口
 - "3306:3306"
 environment:
 - MYSQL_ROOT_PASSWORD=root
 - MYSQL_USER=lovelp           # 建立lovelp用户
 - MYSQL_PASSWORD=mm123321     # 设置lovelp用户的密码
 - MYSQL_DATABASE=santak       # 建立初始数据库
 - TZ=Asia/Shanghai            # 设置时区
 volumes:                        # 挂载数据卷
 - /root/mysql:/var/lib/mysql  # 为了数据持久化
 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 networks:                       # 加入指定网络
 - app-network 

 nodejs:
 build:                          # 这里指的是咱们刚刚撸的 Dockerfile 文件
 context: .                    
 dockerfile: Dockerfile
 image: nodejs                   # 镜像名称
 container_name: nodejs          # 容器名称
 restart: always                 # 重启方式
 depends_on:                     # 启动顺序
 - santak_redis
 - santak_mysql
 links:                          # 容器链接
 - santak_redis:santak_redis
 - santak_mysql:santak_mysql
 networks:                       # 加入指定网络
 - app-network

volumes:
 certbot-etc:
 certbot-var:

networks:  # 实现通讯
 app-network:
 driver: bridge
复制代码

在项目中的使用

setup.sh

#!/usr/bin/env bash
#image_version=`date +%Y%m%d%H%M`;
 # 关闭容器
docker-compose stop || true;
# 删除容器
docker-compose down || true;
# 构建镜像
docker-compose build;
# 启动并后台运行
docker-compose up -d;
# 查看日志
docker logs nodejs;
# 对空间进行自动清理
docker system prune -a -f

复制代码

jenkins 建立项目

最后咱们就能够愉快的 Build Now

在这里我选择的是手动构建。其实jenkins有不少可配置项,好比自动化构建啥的,兴趣使然,你们自行摸索,谢谢你们

结尾

若有不明白的地方,请你们下方留言,我看到后会及时回复的。若是你认为写的还算是能够,请留个赞表示下支持,谢谢!!

相关文章
相关标签/搜索