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

news/2023/12/1 7:10:24

系列文章第五篇中介绍了线上生产环境使用 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 参数。


http://www.niftyadmin.cn/n/686373.html

相关文章

白盒测试体系—框架搭建篇

良好的布局是成功的一半,选择一款合适的测试框架能够使我们的白盒测试更高效,事半功倍。 本文就我们过去三年在搭建测试框架中积攒的一些经验给大家做个简单的分享,主要从以下5个方面展示: 什么是测试框架 为什么要用测试框架 哪…

python怎么使用jenkins_Python-Jenkins API使用 —— 在后端代码中操控Jenkins

最近在工作中需要用到在后台代码中触发Jenkins任务的构建,于是想到Jenkins是否有一些已经封装好的API类库提供,用于处理跟Jenkins相关的操作。下面就简单介绍下我的发现。 Linux Curl 在官网首页就有关于触发job的方法:个人尝试了下&#xff…

在pythonanywhere上部署Django应用

参考:https://tutorial.djangogirls.org/zh/deploy/ 资料讲的很明了,仅在设置上做几点补充。 1、设置相对路径 import os BASE_DIR os.path.dirname(os.path.dirname(__file__))使用了魔法方法 __file__,可以获取到当前文件(包含…

d3.js v4刷子缩放功能Brush Zoom

刷子&缩放(Brush & Zoom) 源码: https://github.com/HK-Kevin/d...demo:https://hk-kevin.github.io/d3...原理:brush事件控制zoom的放缩.源码分析:let svg d3.select("svg"),margin {…

react 更新input 默认值setfieldsvalue_React笔记——核心概念:9.表单

1、受控组件在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新。state:唯一数据源渲染表单的 React 组件还控制着用户输入过程中表单发生的操作。被 React 以这种方式控制取值的表单输入…

罗功银:防控结合保信息网络安全

信息网络安全是指信息网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,确保系统连续可靠正常地运行,网络服务不中断。信息网络安全是企业安全的重要组成部分,随着“大云物移”新…

django安装_Django库的安装

Django库如何安装Django是基于Python的Web框架,依赖Python环境,所以需要提前安装好Python解释器。Django各版本对Python版本的依赖关系如下表所示:Django 版本Python 版本1.112.7, 3.4, 3.5, 3.6, 3.7 (1.11.17 添加)2.03.4,3.5&a…

遇到的前端问题

1、在页面上button按钮如果在form表单里面的话会自动提交表单,如果不是在表单里面在div标签里面或者其他标签里面的话就不会自动提交。 2、js中常用的选择器: 官网链接:http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 3、获取 …

POJ3498:March of the Penguins——题解

最近的题解的故事背景割。 题目: 描述 在靠近南极的某处,一些企鹅站在许多漂浮的冰块上。由于企鹅是群居动物,所以它们想要聚集到一起,在同一个冰块上。企鹅们不想把自己的身体弄湿,所以它们在冰块之间跳跃&#xff0…

光盘刻录只允许读取不能拷贝_8 张图搞懂零拷贝

前言磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速…

python输入在哪里_python在哪里能输入

raw_input函数(Python2) raw_input() 函数从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符):str raw_input("Enter your input: "); print "Received input is : ", str 这将…

DIV相关的操作总结: DIV居中,DIV自适应高度

http://www.cnblogs.com/scy251147/p/3391228.html 父DIV自动匹配子DIV高度的方法 DIV居中或者居底的方法 DIV最小高度及自适应方法:  需要给DIV块一个最小高度,但是当DIV内部内容超过最小高度的时候,需要DIV能够随着高度的增加而增加。这个时候&#…

HttpServletRequest上请求范围属性有关的几个方法

setAttribute():指定名称与对象设置属性。getAttribute():指定名称取得属性。getAttributeNames():取得所有属性名称。removeAttribute():指定名称移除属性。转载于:https://www.cnblogs.com/yc0735/p/7376531.html

zabbix agent安装_最简单有效的 zabbix 快速学习法,30分钟快速入门

在公司搭建系统级别的监控,由于ELK对流量监控存在局限——现有的工具只记录了累计的流量,而无法计算每时每刻的流量。所以决定最后用zabbix来对网络做监控和报警,下面会从零开始记录zabbix搭建过程中的所有步骤,希望可以给你带来帮…

fiddler 中文_全网最全最细的fiddler使用教程以及工作原理

一、Fiddler抓包工具简介Fiddler是位于客户端和服务器端的HTTP代理。Fiddler是目前最常用的http抓包工具之一。Fiddler是功能非常强大,是web调试的利器。二、Fiddler工作原理Fiddler原理图如下:Fiddler是一个代理服务器。代理地址:127.0.0.1,…

Dubbo调用链(version:2.5.3)

Consumer 调用 Provider的过程: (CONSUMER)Dubbo服务调用处 --> 调用RPC代理 --> InvokerInvocationHandler#invoke() --> FailoverClusterInvoker#doInvoke() --> ConsumerContextFilter#invoke(Invoker, Invocation) --> DubboCodec#encodeRequest…
最新文章