docker核心技术

一. 从系统架构谈起

传统分层架构 vs 微服务

微服务改造

分离微服务的方法建议:

  • 审视并发现可以分离的业务逻辑业务逻辑,在对业务领域不是特别熟悉的时候,按照部门职能进行划分,例如账号、财务等
  • 寻找天生隔离的代码模块,可以借助于静态代码分析工具
  • 如果可以闭环的解决一个用户场景,那么它应该是一个微服务
  • 还可以根据访问频率进行区分划分,将用户高频访问的部分划分为一个服务,不同并发规模,不同内存需求的模块都可以分离出不同的微服务,此方法可提高资源利用率,节省成本
  • 还可以根据读写进行划分

一些常用的可微服务化的组件:

  • 用户和账户管理
  • 授权和会话管理
  • 系统配置
  • 通知和通讯服务
  • 照片,多媒体,元数据等

分解原则:基于 size, scope and capabilities

微服务间通讯

点对点:

  • 多用于系统内部多组件之间通讯;
  • 有大量的重复模块如认证授权;
  • 缺少统一规范,如监控,审计等功能;
  • 后期维护成本高,服务和服务的依赖关系错综复杂难以管理。

API 网关

  • 基于一个轻量级的 message gateway
  • 新 API 通过注册至 Gateway 实现
  • 整合实现 Common function

为什么我们的服务不直接对外进行暴露?

  • 前端(移动端、客户端、web)同学非常痛苦,需要对接多个服务,兼容性差,沟通效率低
  • 后端同学也很痛苦,一年前的版本都有人使用,服务无法进行重构升级

为什么需要最外层的 api gateway?

  • 基础库的同学非常痛苦,限流熔断安全等业务无关的功能需要进行升级的时候升不动

在内网主要看安全级别一般有三种:

  • Full Trust:假定内网服务之间是安全的,在内网裸奔
  • Half Trust:内网服务之间需要进行认证鉴权,但是不需要所有的都进行加密
  • Zero Trust: 零信任,任务内部网络是不安全的,类似公网,所有的请求通过身份认证鉴权之后,都需要通过安全加密,防止被嗅探

https://www.microsoft.com/en-us/security/business/zero-trust

二. 理解 Docker

Docker是什么?

  • 基于 Linux 内核的 Cgroup,Namespace,以及 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
  • 最初实现是基于 LXC,从 0.7 以后开始去除 LXC,转而使用自行开发的 Libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 Containerd。
  • Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得 Docker 技术比虚拟机技术更为轻便、快捷。

为什么要用 Docker?

  • 更高效地利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松地迁移
  • 更轻松地维护和扩展
  • ……

虚拟机和容器运行态的对比

性能对比

安装 Docker

ubuntu上安装Docker运行时,参考https://docs.docker.com/engine/install/ubuntu/

sudo apt-get updatesudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-commoncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"sudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io

容器操作

启动

  • docker run
    • -it 交互
    • -d 后台运行
    • -p 端口映射
    • -v 磁盘挂载

启动已终止的容器

  • docker start

停止容器

  • docker stop

查看容器进程

  • docker ps

查看容器细节

  • docker inspect

进入容器

  • Docker attach:
    • 通过 nsenter:
      • PID=$(docker inspect --format “{{ .State.Pid }}” )
      • nsenter --target $PID --mount --uts --ipc --net --pid

拷贝文件至容器内

  • docker cp file1 :/file-to-path

初识容器

  • cat Dockerfile
FROM ubuntu
ENV MY_SERVICE_PORT=80
ADD bin/amd64/httpserver /httpserver
ENTRYPOINT /httpserver
  • Dockerfile打包成镜像

docker build -t cncamp/httpserver:${tag} .
docker push cncamp/httpserver:v1.0
  • 运行容器
docker run -d cncamp/httpserver:v1.0

容器标准

  • Open Container Initiative(OCI): 轻量级开放式管理组织(项目)
  • OCI 主要定义两个规范
    • Runtime Specification
      • 文件系统包如何解压至硬盘,供运行时运行。
    • Image Specification
      • 如何通过构建系统打包,生成镜像清单(Manifest)、文件系统序列化文件、镜像配置。

容器主要特性

Namespace

Linux Namespace是一种Linux Kernel提供的资源隔离方案:

  • 系统可以为进程分配不同的Namespace
  • 并保证不同的Namespace资源独立分配、进程彼此隔离,即不同的Namespace下的进程互不干扰。

Linux 内核代码中 Namespace 的实现

# 进程数据结构
struct task_struct {.../* namespaces */struct nsproxy *nsproxy;...
}# Namespace 数据结构
struct nsproxy {atomic_t count;struct uts_namespace *uts_ns;struct ipc_namespace *ipc_ns;struct mnt_namespace *mnt_ns;struct pid_namespace*pid_ns_for_children;struct net *net_ns;
}

Linux 对 Namespace 操作方法

  • clone
    在创建新进程的系统调用时,可以通过 flags 参数指定需要新建的 Namespace 类型:
// CLONE_NEWCGROUP / CLONE_NEWIPC / CLONE_NEWNET / CLONE_NEWNS / CLONE_NEWPID / 
CLONE_NEWUSER / CLONE_NEWUTS
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg)
  • setns
    该系统调用可以让调用进程加入某个已经存在的 Namespace 中:
Int setns(int fd, int nstype)
  • unshare
    该系统调用可以将调用进程移动到新的 Namespace 下:
int unshare(int flags)
# 这会创建一个新的网络命名空间,然后在这个隔离的环境中运行 sleep 60 命令。
unshare -fn sleep 60

隔离性 – Linux Namespace

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server之DML触发器

一、如何创建一个触发器呢 触发器的定义语言如下: CREATE [ OR ALTER ] TRIGGER trigger_nameon {table_name | view_name}{for | After | Instead of }[ insert, update,delete ]assql_statement从这个定义语言我们可以知道如下信息: trigger_name&…

从领域外到领域内:LLM在Text-to-SQL任务中的演进之路

导语 本文介绍了ODIS框架,这是一种新颖的Text-to-SQL方法,它结合了领域外示例和合成生成的领域内示例,以提升大型语言模型在In-context Learning中的性能。 标题:Selective Demonstrations for Cross-domain Text-to-SQL会议&am…

计算机组成原理 — 存储器(1)

存储器 大家好呀!我是小笙,由于存储器这部分章节内容较多,我分成二部分进行总结,以下是第一部分,希望内容对你有所帮助! 概述 存储器是计算机系统中的记忆设备,用来存放程序和数据 存储器分…

vue3 mathjax 数学公式

安装 pnpm install mathjax 新建文件/util/mathjax.js window.MathJax {tex: {inlineMath: [["$", "$"],["\\(", "\\)"],], // 行内公式选择符displayMath: [["$$", "$$"],["\\[", "\\]"…

UE4运用C++和框架开发坦克大战教程笔记(十七)(第51~54集)

UE4运用C和框架开发坦克大战教程笔记(十七)(第51~54集) 51. UI 框架介绍UE4 使用 UI 所面临的问题以及解决思路关于即将编写的 UI 框架的思维导图 52. 管理类与面板类53. 预加载与直接加载54. UI 首次进入界面 51. UI 框架介绍 U…

《合成孔径雷达成像算法与实现》Figure6.4

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

CSS布局

CSS布局 1. 版心 在 PC 端网页中,一般都会有一个固定宽度且水平居中的盒子,来显示网页的主要内容,这是网页的版心。版心的宽度一般是 960 ~ 1200 像素之间。版心可以是一个,也可以是多个。 2. 常用布局名词 3. 重置默认样式 很…

C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度

目录 一、使用的方法 1.使用正则表达式 2.通过计算字符串的长度验证 二、实例 1.源码 2.生成效果 一、使用的方法 1.使用正则表达式 使用正则表达式可以判断和限制用户输入的字符串长度。 比如验证用户密码不得少于8为,匹配的正则表达式"^.{8,}$"…

AIGC专题:AIGC教育行业全景报告

今天分享的是AI GC系列深度研究报告:《AIGC专题:AIGC教育行业全景报告》。 (报告出品方:量子位智库) 报告共计:31页 生成式AI快速落地教育,技术推动教育理念实施 生成式AI将我们带入AI2.0时代…

数据类型完整版

第三章 数据类型 3.1 Key操作 3.1.1 相关命令 序号命令语法描述1DEL key该命令用于在 key 存在时删除 key2DUMP key序列化给定 key ,并返回被序列化的值3EXISTS key检查给定 key 是否存在,存在返回1,否则返回04EXPIRE key seconds为给定 k…

MacOS系统电脑远程桌面控制windows系统电脑【内网穿透】

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1…

回归预测 | Matlab实现WOA-CNN-LSTM-Attention鲸鱼算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现WOA-CNN-LSTM-Attention鲸鱼算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现WOA-CNN-LSTM-Attention鲸鱼算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制&…

问题:0xc8前面加(byte) #人工智能#学习方法的原因是因为0xc8大于??????????? 。 #微信#其他#微信

问题:0xc8前面加(byte)的原因是因为0xc8大于??????????? 。 参考答案如图所示

大数据学习之Redis,十大数据类型的具体应用(五)

目录 3.9 Redis地理空间(GEO) 简介 原理 Redis在3.2版本以后增加了地理位置的处理哦 命令 命令实操 如何获得某个地址的经纬度 3.9 Redis地理空间(GEO) 简介 移动互联网时代LBS应用越来越多,交友软件中附近的…

双非本科准备秋招(10.2)—— JVM3:垃圾收集器

垃圾收集器 分为七种,如下: 从功能的角度分为 1、串行:Serial、Serial Old 2、吞吐量优先:Parallel Scavenge、Parallel Old 3、响应时间优先:CMS 吞吐量优先VS响应时间优先 吞吐量运行用户代码时间/(运行用户代码…

如何通过ETL实现快速同步美团订单信息

一、美团外卖现状 美团作为中国领先的生活服务电子商务平台,其旗下的美团外卖每天承载着大量的订单信息。这些订单信息需要及时入库、清洗和同步,但由于数据量庞大且来源多样化,传统的手动处理方式效率低下,容易出错。比如&#…

ANTLR4规则解析生成器(一):入门

文章目录 1 什么是ANTLR42 为什么需要ANTLR43 环境搭建4 官方示例4.1 编写语法规则文件4.2 生成语法解析器4.3 基于SDK实现逻辑 5 总结 1 什么是ANTLR4 ANTLR是ANother Tool for Language Recognition的缩写,它是一个强大的用于读取、处理、执行和翻译结构化文本或…

数据库性能监控 ,数据库可用性监控 #mysql##oracle##SQLserver#_

当谈到监控数据库的性能和可用性时,涉及的方面多种多样。数据库是许多组织业务中的关键组成部分,因此确保其高性能和不间断可用性对于业务的成功至关重要。因此建立一个全面的监控系统至关重要。让我们深入探讨数据库性能和可用性监控的各个方面。 数据…

深刻理解树状数组--树状数组构造定义与动态维护区间和的合理性证明

文章目录 一.树状数组概览二.树状数组构造定义lowbit运算树状数组的结点值的定义树状数组结点层次的定义树状数组父子结点关系定义 三.关于树状数组结构的重要证明引理1引理2树状数组模板题 一.树状数组概览 树状数组的下标从1开始标识,其物理结构是线性表,逻辑结构是一颗多叉…

C语言——O/动态内存管理

目录 一、为什么要有动态内存分配 二、malloc 和 free 1、malloc 2、free 三、calloc和realloc 1、calloc 2、realloc 四、常见的动态内存的错误 1、对NULL指针的解引用操作 2、对动态开辟空间的越界访问 3、对非动态开辟内存使用 free 释放 4、使用free释放一块动…