/ docker

博智服务端项目部署规范

博智服务端项目部署规范

本文为笔者在公司推行的方案,在此分享出来,欢迎留言讨论。

概述

所有项目代码需提交到 公司GitLab 服务,并使用develop、release和master三个分支来分别保存开发版、测试版和稳定版代码。使用 DaoCloud Docker容器云服务来自动化部署应用,以提升部署效率和减少人为错误。具体实现方案请参考 博智Git分支模型和Docker自动化部署方案

应用域名和服务端口

为了避免不同应用容器运行在同一台服务器上时出现Docker映射端口冲突,需要统一分配所有应用的端口号。同时为了清楚知道所有业务的域名使用情况,这里也列出了各业务系统使用的域名。其中bicitech.cn用于公司,bicisims.com用于产品。

应用 域名 端口 备注
API网关 api.bicisims.com 所有对外API服务统一使用API子域名,通过路径前缀来区分不同后端服务。/gtgj/ - 钢铁管家API服务
静态资源 static.bicisims.com 站内静态资源(一般来说需要通过Git进行版本管理),比如Web应用的JS和CSS文件,可以使用“static”子域名来访问,以简化部署和做CDN加速。不同站点的静态资源使用路径前缀来区分。/gtgj/ - 钢铁管家Web管理后台静态资源
OSS资源 oss-xxx.bicisims.com 存储空间要求比较大或者不需要版本管理的资源,比如APP升级包、用户上传图片和附件等,由于服务器磁盘空间有限,需存放到阿里云OSS。域名使用oss-xxx.bicisims.com,其中xxx为OSS Bucket名称(去掉bici-前缀)。gtgj - 钢铁管家Bucket,gtgj-test - 钢铁管家测试用Bucket
公司官网 www.bicitech.cn 10xxx
数字钢厂 szgj.bicisims.com 20xxx 20000 - API服务,20001 - 硬件采集数据接收
钢铁管家 gtgj.bicisims.com 30xxx 30000 - API服务,30001 - Web管理后台

为了方便管理,开发环境和测试环境域名统一在对应的正式域名里增加“dev”和“test”节,比如api.bicisims.com对应的开发环境和测试环境域名分别为api.dev.bicisims.comapi.test.bicisims.com

依赖环境的应用配置

每个应用都有自己的配置,其中一些还会随运行环境的不同而发生变化。这些依赖环境的配置需要在启动应用时通过命令参数或者环境变量传递给应用。为了简单和统一,我们约定使用环境变量来传递这些依赖环境的配置。

通过环境变量来配置应用有两种方式。一种是事先约定几种环境,比如开发、测试和生产,部署时只传递一个环境变量来指示当前处于哪种运行环境,应用根据这个环境变量的值去加载相应的配置文件。另一种是通过环境变量直接传递配置信息,这里不包括随环境不变的配置,这些还是使用配置文件来管理,以减少要传递的环境变量个数。

第一种方式有一定的局限性,需要预设几种环境,灵活性不够。比如要部署一套新的环境来运行集成测试,这种情况下数据库等服务的地址无法预先知道,因此没法提前生成配置文件。相比而言,第二种方式就很灵活,可以应对任意部署环境。因此推荐使用第二种。

应用运行时产生的数据

应用在运行过程中会产生一些数据,比如日志、用户上传的文件等。由于容器里的数据会随容器销毁而丢弃,所以这些运行时数据需要存储到外部的磁盘卷Volume里。我们统一约定每个容器在启动时都会挂载宿主机Host上的某个目录到容器内的“/data”路径下,因此应用可以把运行时数据存放在这个固定的目录下。

示例 - 钢铁管家容器编排

下面的Docker Compose配置文件里,会一次启动多个容器,包括API服务“api-service”、Web管理后台“web”、MySQL服务“mysql”和Redis服务“redis”。通过环境变量把依赖于环境的配置传递给容器里的应用。

version: '2'
services:
  api-service:
    image: daocloud.io/bicitech_cn/gtgj-api-service:develop-3e09a4c
    environment:
      GTGJ_MYSQL_HOST: mysql
      GTGJ_MYSQL_PORT: 3306
      GTGJ_MYSQL_USER: xxx
      GTGJ_MYSQL_PASS: xxx
      GTGJ_REDIS_HOST: redis
      GTGJ_REDIS_PORT: 6379
      GTGJ_REDIS_PASS:
      GTGJ_ALIYUN_ACCESS_KEY_ID: xxx
      GTGJ_ALIYUN_ACCESS_KEY_SECRET: xxx
      GTGJ_ALIYUN_OSS_ENDPOINT: xxx
      GTGJ_ALIYUN_OSS_BUCKET_NAME: xxx
      GTGJ_ALIYUN_OSS_BUCKET_DOMAIN: xxx
    ports:
    - 30000:8080
    volumes:
    - /data/gtgj/api-service:/data
    links:
    - mysql
    - redis
  web:
    image: daocloud.io/bicitech_cn/gtgj-web:develop
    environment:
      NODE_ENV: production
      GTGJ_API_URL_BASE: ''
    ports:
    - 30001:5000
    volumes:
    - /data/gtgj/web:/data
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: xxx
      MYSQL_DATABASE: xxx
      MYSQL_USER: xxx
      MYSQL_PASSWORD: xxx
    ports:
    - 30002:3306
    volumes:
    - /data/gtgj/mysql:/var/lib/mysql
  redis:
    image: redis
    command:
    - redis-server
    - --appendonly
    - 'yes'
    ports:
    - 30003:6379
    volumes:
    - /data/gtgj/redis:/data

参考资料

  1. 公司GitLab
  2. DaoCloud
  3. 博智Git分支模型和Docker自动化部署方案
  4. Docker Compose