Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
c4fb20b
Update Docker.md
CyC2018 Oct 26, 2026
d61e356
Update Git.md
CyC2018 Oct 26, 2026
0561863
Update HTTP.md
CyC2018 Oct 26, 2026
f606195
Update Java IO.md
CyC2018 Oct 26, 2026
9836016
Update Java 基础.md
CyC2018 Oct 26, 2026
72fadbf
Update Java 容器.md
CyC2018 Oct 26, 2026
df799df
Update Java 并发.md
CyC2018 Oct 26, 2026
0f932fb
Update Java 虚拟机.md
CyC2018 Oct 26, 2026
52536fa
Update Linux.md
CyC2018 Oct 26, 2026
b464721
Update MySQL.md
CyC2018 Oct 26, 2026
23ce787
Update Redis.md
CyC2018 Oct 26, 2026
b8200ed
Update SQL 语法.md
CyC2018 Oct 26, 2026
3bbc964
Update Socket.md
CyC2018 Oct 26, 2026
8aa1b59
Update Spring.md
CyC2018 Oct 26, 2026
c942f95
Update 代码可读性.md
CyC2018 Oct 26, 2026
07db1f5
Update 分布式.md
CyC2018 Oct 26, 2026
74dc880
Update 大模型应用.md
CyC2018 Oct 26, 2026
d446e7b
Update 攻击技术.md
CyC2018 Oct 26, 2026
5fe7abf
Update 数据库系统原理.md
CyC2018 Oct 26, 2026
303ef42
Update 构建工具.md
CyC2018 Oct 26, 2026
6abd9bc
Update 消息队列.md
CyC2018 Oct 26, 2026
cf23f4b
Update 系统设计基础.md
CyC2018 Oct 26, 2026
c398e7b
Update 缓存.md
CyC2018 Oct 26, 2026
80462f1
Update 计算机操作系统 - 内存管理.md
CyC2018 Oct 26, 2026
0a3fae9
Update 计算机操作系统 - 概述.md
CyC2018 Oct 26, 2026
a16b171
Update 计算机操作系统 - 死锁.md
CyC2018 Oct 26, 2026
fb92b05
Update 计算机操作系统 - 目录.md
CyC2018 Oct 26, 2026
f7f18ae
Update 计算机操作系统 - 设备管理.md
CyC2018 Oct 26, 2026
96a0b82
Update 计算机操作系统 - 进程管理.md
CyC2018 Oct 26, 2026
cc4f7ab
Update 计算机操作系统 - 链接.md
CyC2018 Oct 26, 2026
87f33c4
Update 计算机网络 - 应用层.md
CyC2018 Oct 26, 2026
01769c5
Update 计算机网络 - 概述.md
CyC2018 Oct 26, 2026
22a025a
Update 计算机网络 - 物理层.md
CyC2018 Oct 26, 2026
5a5809c
Update 计算机网络 - 目录.md
CyC2018 Oct 26, 2026
d3ea423
Update 计算机网络 - 链路层.md
CyC2018 Oct 26, 2026
29ae9a6
Update 设计模式 - 中介者.md
CyC2018 Oct 26, 2026
3bdc9a6
Update 设计模式 - 命令.md
CyC2018 Oct 26, 2026
15bdf02
Update 设计模式 - 外观.md
CyC2018 Oct 26, 2026
f64452c
Update 设计模式 - 工厂方法.md
CyC2018 Oct 26, 2026
0bd11a8
Update 设计模式 - 模板方法.md
CyC2018 Oct 26, 2026
3370e22
Update 设计模式 - 状态.md
CyC2018 Oct 26, 2026
8a00700
Update 设计模式 - 装饰.md
CyC2018 Oct 26, 2026
57cd3de
Update 设计模式 - 观察者.md
CyC2018 Oct 26, 2026
d86e023
Update 设计模式 - 责任链.md
CyC2018 Oct 26, 2026
0a9938c
Update 设计模式 - 适配器.md
CyC2018 Oct 26, 2026
fdacc97
Update 集群.md
CyC2018 Oct 26, 2026
80e44fc
Update 面向对象思想.md
CyC2018 Oct 26, 2026
ad88b11
Add 面试高频问题.md
CyC2018 Oct 26, 2026
ab0062c
Update README.md
CyC2018 Oct 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@

<br>

<div align="center">准备面试可以从 <a href="https://github.com/CyC2018/CS-Notes/blob/master/notes/面试高频问题.md">面试高频问题</a> 开始,每个问题都链接到对应的章节。</div>

<br>

## :pencil2: 算法

- [剑指 Offer 题解](https://github.com/CyC2018/CS-Notes/blob/master/notes/剑指%20Offer%20题解%20-%20目录.md)
Expand Down
93 changes: 88 additions & 5 deletions notes/Docker.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* [三、优势](#三优势)
* [四、使用场景](#四使用场景)
* [五、镜像与容器](#五镜像与容器)
* [六、实现原理](#六实现原理)
* [七、Kubernetes](#七kubernetes)
* [参考资料](#参考资料)
<!-- GFM-TOC -->

Expand All @@ -16,13 +18,13 @@

Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。

<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/011f3ef6-d824-4d43-8b2c-36dab8eaaa72-1.png" width="400px"/> </div><br>
<div align="center"> <img src="pics/docker-why.png" width="740px"/> </div><br>

## 二、与虚拟机的比较

虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。

<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/be608a77-7b7f-4f8e-87cc-f2237270bf69.png" width="500"/> </div><br>
<div align="center"> <img src="pics/docker-vs-vm.png" width="760px"/> </div><br>

### 启动速度

Expand Down Expand Up @@ -76,7 +78,84 @@ Docker 轻量级的特点使得它很适合用于部署、维护、组合微服

构建容器时,通过在镜像的基础上添加一个可写层(writable layer),用来保存着容器运行过程中的修改。

<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/docker-filesystems-busyboxrw.png"/> </div><br>
<div align="center"> <img src="pics/docker-layers.png" width="740px"/> </div><br>

## 六、实现原理

容器就是宿主机上的普通进程,Docker 用 Linux 内核的两个机制把它和其它进程隔开:

- 命名空间(Namespace)负责隔离“能看到什么”:PID 命名空间让容器中的第一个进程以为自己是 1 号进程;网络命名空间让容器有自己的网卡、IP 和端口;挂载命名空间让容器有自己的根文件系统;UTS 命名空间让容器有自己的主机名;
- 控制组(cgroup)负责限制“能用多少”:限制 CPU、内存、磁盘 I/O 等资源。

例如用 docker run --memory 64m --cpus 0.5 启动一个容器,在容器中查看:

```sh
$ cat /sys/fs/cgroup/memory.max /sys/fs/cgroup/cpu.max
67108864
50000 100000
$ echo $$
1
```

内存上限是 64 MB,CPU 每 100 ms 最多使用 50 ms,即半个 CPU;容器里的 shell 的进程号是 1。在容器中不断申请内存,超过 64 MB 时进程被内核杀掉,退出码为 137(128 + SIGKILL 的 9)。

因为所有容器共享宿主机的内核,所以容器比虚拟机轻量,但隔离性也更弱:内核漏洞可能让容器中的进程影响宿主机。

## 七、Kubernetes

Docker 解决的是单台机器上怎样运行容器。服务有几十个、部署在几十台机器上时,还需要决定每个容器放在哪台机器上、挂了谁来重启、怎样扩容、怎样不停机升级,这就是 Kubernetes(K8s)做的事情。

K8s 的核心思想是声明期望的状态,由控制器不断把实际状态调整为期望状态。例如下面的配置声明 order-service 要运行 3 个副本,并通过一个 Service 对外提供访问:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: app
image: nginx:1.27-alpine
ports:
- containerPort: 80
readinessProbe:
httpGet: { path: /, port: 80 }
---
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
selector:
app: order-service
ports:
- port: 80
targetPort: 80
```

其中的几个概念:

- Pod:K8s 调度的最小单位,包含一个或几个共享网络和存储的容器,每个 Pod 有自己的 IP,重建后 IP 会变;
- Deployment:管理一组相同的 Pod,负责保持副本数、扩缩容和滚动升级;
- Service:为一组 Pod 提供固定的虚拟 IP 和域名,把请求负载均衡到其中就绪的 Pod 上;
- 控制平面:API Server 接收所有请求,etcd 保存集群状态,调度器决定 Pod 放在哪个节点,控制器管理器运行各种控制器;每个节点上的 kubelet 负责启动和检查本节点的容器。

在本机的单节点 K8s(k3s v1.31)上实际操作:

- kubectl apply 之后约 20 秒,3 个 Pod 全部就绪,Service 得到虚拟 IP 10.43.189.89,在集群内用 http://order-service 就能访问;
- 删除一个 Pod,Deployment 发现副本数少于 3,立即创建新的 Pod,约 1.2 秒后恢复为 3/3,新 Pod 的 IP 与原来不同,Service 自动更新了后端列表;
- kubectl scale 把副本数改为 5;kubectl set image 修改镜像版本后,Deployment 创建新的 ReplicaSet,逐个用新版本的 Pod 替换旧的,约 12 秒完成滚动升级,期间一直有就绪的 Pod 在提供服务,需要时可以用 kubectl rollout undo 回滚。

readinessProbe 是就绪探针:Pod 启动后要通过检查才会加入 Service 的后端列表,避免把请求转发给还没启动完成的实例。

## 参考资料

Expand All @@ -85,7 +164,11 @@ Docker 轻量级的特点使得它很适合用于部署、维护、组合微服
- [Docker container vs Virtual machine](http://www.bogotobogo.com/DevOps/Docker/Docker_Container_vs_Virtual_Machine.php)
- [How to Create Docker Container using Dockerfile](https://linoxide.com/linux-how-to/dockerfile-create-docker-container/)
- [理解 Docker(2):Docker 镜像](http://www.cnblogs.com/sammyliu/p/5877964.html)
- [为什么要使用 Docker?](https://yeasy.gitbooks.io/docker_practice/introduction/why.html)
- [为什么要使用 Docker?](https://yeasy.gitbook.io/docker_practice/introduction/why)
- [What is Docker](https://www.docker.com/what-docker)
- [持续集成是什么?](http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html)

- [Understanding the image layers | Docker Docs](https://docs.docker.com/get-started/docker-concepts/building-images/understanding-image-layers/)
- [Kubernetes 文档:Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)
- [Kubernetes 文档:Service](https://kubernetes.io/docs/concepts/services-networking/service/)
- [namespaces(7) — Linux manual page](https://man7.org/linux/man-pages/man7/namespaces.7.html)
- [cgroups(7) — Linux manual page](https://man7.org/linux/man-pages/man7/cgroups.7.html)
27 changes: 24 additions & 3 deletions notes/Git.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,30 @@ $ ssh-keygen -t rsa -C "youremail@example.com"

## Git 命令一览

<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/7a29acce-f243-4914-9f00-f2988c528412.jpg" width=""> </div><br>

比较详细的地址:http://www.cheat-sheets.org/saved-copy/git-cheat-sheet.pdf
| 用途 | 命令 |
| --- | --- |
| 克隆仓库 | git clone <url> |
| 查看状态 | git status |
| 加入暂存区 | git add <file> |
| 提交 | git commit -m "说明" |
| 查看历史 | git log --oneline --graph |
| 查看改动 | git diff(工作区与暂存区),git diff --staged(暂存区与最新提交) |
| 撤销工作区的修改 | git restore <file> |
| 撤销 git add | git restore --staged <file> |
| 新建并切换分支 | git switch -c dev |
| 切换分支 | git switch master |
| 合并分支 | git merge dev |
| 变基 | git rebase master |
| 临时保存修改 | git stash,之后用 git stash pop 恢复 |
| 撤销最近一次提交,保留修改 | git reset --soft HEAD~1 |
| 回到某个提交,丢弃之后的修改 | git reset --hard <commit> |
| 用一个新提交抵消某次提交 | git revert <commit> |
| 拉取并合并远程分支 | git pull |
| 推送 | git push origin dev |

git restore 和 git switch 是 Git 2.23 加入的命令,分别承担了原来 git checkout 恢复文件和切换分支两种用途。需要注意的是,reset --hard 会丢弃未提交的修改;已经推送到远程的提交,应该用 revert 撤销,而不是 reset 后强制推送。

比较详细的命令列表:http://www.cheat-sheets.org/saved-copy/git-cheat-sheet.pdf

## 参考资料

Expand Down
Loading
Loading