Docker 底层实现

基本架构 Docker 采用了 C/S 架构,包括客户端和服务端。Docker 守护进程作为服务端接收来自客户端的请求,并处理这些请求(创建、运行、分发容器等)。 客户端和服务端可以运行在一个机器上,也可以通过 socket 或者 RESTful API 来进行通信。 Docker 守护进程一般在宿主机后台运行,等待接收来自客户端的请求。 Docker 客户端则为用户提供了一系列命令,用户可以使用这些命令来与 Docker 守护进程进行交互。 命名空间 命名空间是 Linux 内核一个强大的特性。每个容器都有自己独立的命名空间,运行在其中的应用都像是在独立的系统中运行一样。命名空间保证了容器之间彼此隔离,不会相互影响。 PID 命名空间 不同用户的进程就是通过 PID 命名空间来隔离的,且不同命名空间中的进程 ID 可以相同。所有 LXC 进程都是 Docker 守护进程的子进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,可以实现容器内运行容器的功能,提供更灵活的部署方式。 LXC: Linux Container,是一种操作系统级别的虚拟化技术。 NET 命名空间 网络隔离通过 NET 命名空间实现,每个 NET 命名空间都有自己的网络设备、IP 地址、路由表、防火墙规则等。这样就可以实现容器之间的网络隔离。Docker 默认使用 Veth 的方式,将容器中的虚拟网卡同 Host 上的一个 Docker 网桥 docker0 相连。 IPC 命名空间 在容器中,进程间通信(IPC)采用了 Linux 中常见的方式,如信号量、消息队列和共享内存等。与虚拟机(VM)不同,容器内的进程实际上是运行在宿主机(Host)上,并共享相同的进程 ID(PID)命名空间。因此,在申请 IPC 资源时,需要加入命名空间信息以区分不同容器。每个 IPC 资源都有一个唯一的 32 位标识符(ID)。 IPC: Inter-Process Communication,进程间通信。...

March 20, 2024

安全相关的 HTTP 响应头

Strict-Transport-Security Strict-Transport-Security 是一个安全相关的 HTTP 响应头,它可以让网站要求浏览器只通过 HTTPS 访问它,以防止中间人攻击。它的值是一个时间,单位是秒。例如: Strict-Transport-Security: max-age=31536000; includeSubDomains X-Frame-Options X-Frame-Options 是一个安全相关的 HTTP 响应头,它可以用来控制网站在 iframe 中的显示情况。它有三个值: DENY:表示页面不允许在 iframe 中显示 SAMEORIGIN:表示页面可以在相同域名下的 iframe 中显示 ALLOW-FROM uri:表示页面可以在指定来源的 iframe 中显示 X-XSS-Protection X-XSS-Protection 是一个安全相关的 HTTP 响应头,它可以用来控制浏览器的 XSS 防护机制。它有三个值: 0:表示关闭浏览器的 XSS 防护机制 1:表示开启浏览器的 XSS 防护机制,如果检测到 XSS 攻击,尝试清除不安全的部分,然后加载页面 1; mode=block:表示开启浏览器的 XSS 防护机制,并且如果检测到 XSS 攻击,浏览器会停止加载页面 X-Content-Type-Options X-Content-Type-Options 是一个安全相关的 HTTP 响应头,它可以用来控制浏览器的 MIME 类型嗅探行为。它有一个值: nosniff:表示浏览器不会执行 MIME 类型嗅探,即使服务器返回的 MIME 类型是错误的,浏览器也不会改变它 Content-Security-Policy TODO

March 18, 2024

RSA 加密和解密

视频教程:https://www.bilibili.com/video/BV1XP4y1A7Ui 前置知识 因数:a * b = c,a 和 b 就是 c 的因数 质数:只能由 1 和数字本身相乘得到的数字 余数:a % b = c,a 除以 b 的余数是 c 互质:两个数的最大公约数是 1 公约数:两个数的公约数是能同时整除这两个数的数 加密和解密过程 假设公钥为(7, 33),私钥为(3, 33) 加密过程 明文为 3,加密后的密文为 3^7 % 33 = 9 明文为 1,加密后的密文为 1^7 % 33 = 1 明文为 15,加密后的密文为 15^7 % 33 = 27 解密过程 密文为 9,解密后的明文为 9^3 % 33 = 3 密文为 1,解密后的明文为 1^3 % 33 = 1 密文为 27,解密后的明文为 27^3 % 33 = 15 公钥加密的密文只能由私钥解密,私钥加密的密文只能由公钥解密...

March 14, 2024

Redis 数据结构

String 介绍 最基本的数据类型,一个 key 对应一个 value 底层结构 SDS 应用场景 缓存 计数器 常用命令 命令 描述 SET key value 设置 key 对应的值为 value GET key 获取 key 对应的值 DEL key 删除 key 对应的值 INCR key key 对应的值加 1 DECR key key 对应的值减 1 INCRBY key increment key 对应的值加 increment DECRBY key decrement key 对应的值减 decrement List 介绍 双端链表,支持从两端插入和删除 底层结构 QuickList 应用场景 消息队列 常用命令 命令 描述 LPUSH key value1 [value2 … valueN] 从左边插入一个或多个值 RPUSH key value1 [value2 … valueN] 从右边插入一个或多个值 LPOP key 从左边删除一个值 RPOP key 从右边删除一个值 LINDEX key index 获取指定索引的值 LRANGE key start stop 获取指定范围的值 Hash 介绍 哈希表,类似于 Java 中的 HashMap...

March 13, 2024

Redis ZSkipList 结构

结构 /* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode { sds ele; double score; struct zskiplistNode *backward; struct zskiplistLevel { struct zskiplistNode *forward; unsigned int span; } level[]; } zskiplistNode; typedef struct zskiplist { struct zskiplistNode *header, *tail; unsigned long length; int level; } zskiplist; ele: 持有数据,是一个 sds 结构 score: 分值 backward: 指向前一个节点 level: 层级,包含 forward 和 span 两个字段 forward: 指向下一个节点 span: 记录跨度,即当前节点到下一个节点的距离 优势 插入、删除、查找的时间复杂度都是 O(logN) 有序,可以使用跳表进行范围查询

March 13, 2024