资讯专栏INFORMATION COLUMN

Docker 实践(九):生产环境优化

AlienZHOU / 1091人阅读

摘要:系列文章第五篇中介绍了线上生产环境使用集群,这篇文章对原来的架构进行了优化,同时使用了最新的一些特性,记录一些流水账。配置文件鉴于上次搭建时配置文件管理混乱,这次做了统一规划为每个环境创建不同的配置文件,可以以环境名后缀。删除无用的容器。

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

CentOS

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

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

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

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

推荐在 docker-compose.yml 里面写上 build 节点,每次只需要执行 docker-compose build --no-cache 就可以构建镜像了,再也不需要记住复杂的镜像名和构建参数了。

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

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

建议 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

找一台服务器安装 gitlab-runner,参考链接,建议配置高一些。

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

镜像结构

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

配置文件

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

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

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

清除数据

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

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

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

docker volume prune:删除无用的卷。

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26965.html

相关文章

  • Docker 实践系列文章

    摘要:使用有一段时间了,打算把自己实践过程中的一些理解和感悟记录下来。目录实践一了解架构实践二使用教程实践三下构建开发环境实践四环境容器化实践五生产环境容器化实践六容器监控实践七提升幸福感实践八构建开发环境实践九生产环境优化参考源码分析系列文章 使用 docker 有一段时间了,打算把自己实践过程中的一些理解和感悟记录下来。 系列文章发布在 SegmentFault 上我的专栏 Tairy,...

    VincentFF 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    Mr_houzi 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    tommego 评论0 收藏0
  • Gin实践 连载 将Golang应用部署到Docker

    摘要:项目地址快上车,支持一波原文地址将应用部署到注开始前你需要安装好,配好镜像源本章节源码在分支上从本章节开始项目目录都以为基准请配合自己本地项目灵活变动介绍在这里简单介绍下,建议深入学习是一个开源的轻量级容器技术,让开发者可以打包他们 项目地址:https://github.com/EDDYCJY/go... (快上车,支持一波)原文地址:将Golang应用部署到Docker 注: 开...

    Hancock_Xu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<