docker部署

144 阅读2分钟

目标

使用docker为载体,需要准备服务器、域名各一个,实现

  1. nginx部署前端服务
  2. webhooks实现自动部署
  3. nginx作为代理服务器,配置二级域名
  4. docker-compose一次部署多个服务

域名解析

本文以腾讯云为例

DNS 解析 DNSPod/解析

image.png

云服务器

image.png

image.png

image.png

image.png 做完以上操作,有1个主域名、3个二级域名和一些端口号可以用了。登录服务器,使用docker起飞了~

ssh root@106.54.179.243

创建文件夹,以备测试使用,所有项目都放在这里

mkdir docker-git

nginx部署前端服务

启动docker

service docker start

查看nginx默认目录

cat /etc/nginx/nginx.conf

image.png 所以下面的default.conf,只有放到以上两个目录下,才生效,一般放到/etc/nginx/conf.d下就可以了。 准备一个nginx静态项目

├── dist                         
│   ├── index.html           // 静态文件
├── nginx                         
│   ├── conf.d
│   │    └── default.conf    // nginx配置
├── docker-compose.yml       // docker配置
// default.conf
server {
    listen 80;
    server_name kaixin.world;
    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}
# docker-compose.yml
version: '3.1'
services:
  nginx:
    restart: always
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./dist:/var/www/html

先把项目push,然后在服务器拉取。

git clone https://gitee.com/liuyuetong/nginx-app.git

以下在docker中执行。停止运行的容器,并且会删除已停止的容器以及已创建的所有网络

docker-compose down

根目录执行,强制重新创建一次,所有的Dcokerfile文件重新创建

docker-compose up -d --force-recreate --build

image.png 进入该实例的终端

docker ps

找到以上指令的结果:CONTAINER ID

docker exec -it d1e12ad0d979 /bin/bash

image.png

image.png

webhooks自动部署

image.png 以上操作,会在执行git push后触发钩子回调。在nginx-app项目中执行

npm init -y
npm i gitee-webhook-handler
mkdir deploy-dev.sh
# deploy-dev.sh
echo deploy project

# 拉取最新代码
git pull

npm i

echo npm i end

# 停止运行的容器,并且会删除已停止的容器以及已创建的所有网络
docker-compose down

echo "docker-删除成功"

# 强制重新创建一次,所有的Dcokerfile文件重新创建
docker-compose up -d --force-recreate --build

echo "发布成功"
// webhooks.js
const http = require('http')
const createHandler = require('gitee-webhook-handler')

const handler = createHandler({
  path: '/webhooks',
  secret: 'nginx-app'
})

function run_cmd(cmd, args, callback) {
  const spawn = require('child_process').spawn
  const child = spawn(cmd, args)
  let resp = ''
  // 打印日志
  child.stdout.on('data', function (buffer) {
    resp += buffer.toString()
  })
  child.stdout.on('end', function () {
    callback(resp)
  })
}

const port = 9530
http
  .createServer((req, res) => {
    handler(req, res, (err) => {
      res.statusCode = 404
      res.end('服务器错误')
    })
  })
  .listen(port, () => {
    console.log(`webhook listen ${port}`)
  })

handler.on('error', (err) => {
  console.error('error', err.message)
})

handler.on('Push Hook', (e) => {
  if (e.payload.ref === "refs/heads/master") {
    console.log('nginx-app master push Hook ...')
    // 执行shall脚本
    run_cmd('sh', ['./deploy-dev.sh'], function (res) {
      console.log('run_cmd.res', res)
    })
  }
})

使用pm2,启动进程守护

docker pull pm2

开启webhooks监听

pm2 start webhooks.js

查看日志

pm2 log

清除所有日志

pm2 flush

查看所有进程

pm2 status

杀死进程

pm2 delete id

本地执行git push后,就会触发自动部署 image.png 注意:一定要保证服务是启动状态

image.png

nginx代理二级域名

准备一个react的项目,不依赖后端。

├── src                      // 项目目录
├── nginx                         
│   ├── conf.d
│   │    └── default.conf    // nginx配置
├── docker-compose.yml       // docker配置,对外暴露9000端口

在服务器,将项目clone下来,准备发布

git clone https://gitee.com/liuyuetong/h5-app.git

下载依赖,执行npm run build,使用docker-compose发布

docker-compose up -d --force-recreate --build

image.png 线上已经有一个可以通过访问ip+port访问的项目了,下一步,在nginx-app添加以下配置

# nginx-app/nginx/conf.d/default.conf
server {
    listen 80;
    server_name m.kaixin.world; #二级域名
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://106.54.179.243:9000; #代理的服务:ip+port
    }
}

执行git push,会触发自动构建

image.png 同样的,我们也可在h5-app项目中添加webhooks,实现自动构建

docker-compose