8

系列文章第五篇中介绍了线上生产环境使用 Docker 集群,这篇文章对原来的架构进行了优化,同时使用了 Docker 最新的一些特性,记录一些流水账。

CentOS

CentOSDocker 确实不搭,但是苦于做不了主,只能硬着头皮上了,所幸没有遇上太大的坑。

  1. 必须要 CentOS 7.0 及以上才行,越新越好,内核也要升级到最新。

  2. 内核版本 Linux 3.10.0-327.36.1.el7.x86_64 有 bug,碰上了就别再折腾,赶紧绕过,Github Issue

  3. CentOS升级内核(需要梯子)

docker-compose

可喜的是新版本的 docker-compose 支持管理集群了,这比以前用 docker service 命令方便多了,只需要将 docker-compose.ymlversion 修改为 3 或者更高,然后就可以愉快的使用新增的特性了,示例:

version: '3'
services:
  nginx:
    image: nginx:latest
    networks:
      - product
    ports:
      - 8022:80
    environment:
      TZ: 'Asia/Shanghai'
    deploy:
      mode: replicated
      replicas: 4
      placement:
        constraints:
          - node.role == worker
      restart_policy:
        condition: any
  web-product:
    image:web:latest
    build:
      context: ./
    networks:
      - product
    environment:
      TZ: 'Asia/Shanghai'
    deploy:
      mode: replicated
      replicas: 4
      placement:
        placement:
          - node.role == worker
      restart_policy:
        condition: any
networks:
  product:
    driver: overlay
  1. 推荐在 docker-compose.yml 里面写上 build 节点,每次只需要执行 docker-compose build --no-cache 就可以构建镜像了,再也不需要记住复杂的镜像名和构建参数了。

  2. deploy 节点可以编排发布的一些特性,比如 replicas 可以指定运行的容器个数,也可以用placement来限定容器运行的节点。

  3. 编写好 docker-compose.yml 文件之后就可以执行下面命令将应用发布到集群中。
    docker stack deploy --compose-file docker-compose-product.yml web-product

  4. 建议 replicas 的数量 > 1,否则上线的时候会出现短暂的 502。

CI

对 ci 一直存在于理论中,这次有幸实践了一把,体验就是比 webhook 靠谱多了,配置也简单,强烈推荐,.gitlab-ci.yml 示例:

# 可自定义上线的每个阶段
stages:
  - build
  - release
  - test
  - release
  - deploy
  - cleanup

build-beta-job:
  stage: build
  script:
    - docker-compose -f docker-compose-beta.yml build --no-cache
    - docker-compose -f docker-compose-beta.yml down -v
    - docker-compose -f docker-compose-beta.yml up -d
  only:
    - master

build-release-job:
  stage: build
  script:
    - docker-compose -f docker-compose-release.yml build --no-cache
    - docker-compose -f docker-compose-release.yml down
    - docker-compose -f docker-compose-release.yml up -d
  only:
    - master

deploy-product-job:
  stage: deploy
  script:
    - docker build --no-cache -f Dockerfile-product -t 127.0.0.1:5000/web-product:latest .
    - docker push 127.0.0.1:5000/web-product:latest
    - docker stack deploy --compose-file docker-compose-product.yml web-product
  only:
    - release

cleanup-job:
  stage: cleanup
  script:
    - docker system prune -f
  only:
    - master
    - release
  1. 找一台服务器安装 gitlab-runner,参考链接,建议配置高一些。

  2. 在项目中编写 .gitlab-ci.yml 文件,然后推送到 gitlab 即可。

镜像结构

对于镜像的处理,依然沿用原来的办法,将环境依赖的扩展等构建好作为一个底层基础镜像,业务代码镜像基于这个基础镜像再构建,可以加快构建速度。

配置文件

鉴于上次搭建时配置文件管理混乱,这次做了统一规划:

  1. 为每个环境创建不同的配置文件,可以以环境名后缀。

  2. 构建最顶层镜像时连同配置文件一起 build 进去,千万不要在底层镜像修改配置文件。

清除数据

新版的 docker 终于支持对无用数据的清除了,主要有以下命令:

  • docker image prune:删除无用的镜像。

  • docker container prune:删除无用的容器。

  • docker volume prune:删除无用的卷。

  • docker network prune:删除无用的网络。

  • docker system prune:删除无用的镜像、容器、卷、网络。

要强制删除可加上 -f 参数。


Tairy
3.1k 声望404 粉丝

一介书生