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有不少可配置項,好比自動化構建啥的,興趣使然,你們自行摸索,謝謝你們

結尾

若有不明白的地方,請你們下方留言,我看到後會及時回覆的。若是你認爲寫的還算是能夠,請留個贊表示下支持,謝謝!!

相關文章
相關標籤/搜索