传统分层架构 VS 微服务
- Monolithic Architecture > UI / Biz logic / Data Access Layer 在一个服务上
- SOA 面向服务的架构,通过业务总线链接所有应用
- MicroService Architecture
- SOA 的最佳实现
- UI 可能会链接成百上千个微服务,微服务之间可以互相调用
- 服务发现怎么做,一般,应用需要固定的 IP + 端口
- 传统的
- 通过物理机,不同服务通过不同的 port ,挑战是一个接口不能重复利用
- 虚拟机,不同的应用使用不同的虚拟机,两个 web 应用使用不同的虚拟机 ip,可以使用同样的端口。管理困难。
Docker
基于Linux内核的Cgroup,Namespace,以及UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
虚拟机 VS Docker
- 性能不好,数据包会过两个 OS,资源也需要额外的支持操作系统。
- 有最好的性能,和资源有最高的利用率。
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
docker run -it centos
, ip, 操作系统,进程,完全不同。
初识容器
# 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
容器主要特性
- 隔离性:需要一个封闭的环境,所需依赖必须在隔离环境里。
- 可配额:对资源的管控,保证一定会有所需的资源。如果写的不对,不能影响其他的应用
- 便捷性:可以方便的 replay
- 安全性:各个应用是安全隔离的。
Namespace
LinuxNamespace是一种LinuxKernel提供的资源隔离方案:
• 系统可以为进程分配不同的 Namespace;
• 并保证不同的 Namespace 资源独立分配、进程彼此隔离,即不同的 Namespace 下的进 程互不干扰 。
任何进程都是有 namespace,不同 namespace 之间相互隔离。
鼓励大家源代码驱动,就是学习任何技术的时候,都去看看源代码,可能无需看所有的代码。只关注想关注的部分。
隔离性 - Linux Namespace
namespace 有几种
- IPC: System V IPC 和 POSIX 消息队列
- Network: 网络设备、网络协议栈、网络端口等
- PID: 进程
- Mount:挂载点
- UTS:主机名和域名
- USR:用户和用户组
把用户的进程隔离开,让 Namespace 内的进程看不到外边的世界。有独立的主机域名、用户管理、网络、进程、文件系统等。把它模拟成一个操作系统。
容器就是通过 docker demon fork 了一个子进程
关于 namespace 的常用操作
- 查看当前系统的 namespace:
lsns –t <type>
- 进入某namespace运行命令:
nsenter -t <pid> -n ip addr
, 主机可以操作容器内应用
答疑
- namespace 不能看到其他的 namespace
- 网络 namespace 的问题挺多,比如网络不通
- 容器分为两部分,一部分是 runtime service, 一部分是 mirror service
- namespace,
cgroup
是跟 runtime service 相关的
- namespace,
- Docker 跟 containerd 底层技术相同。这会儿都是 containerd 了\
- kubernetes 限制一个主机上最多 110 个容器
- kuber admin 来深入学习 kubernates
- Kubernetes namespace 是把 kubernates 对象放在不同的 namespace,与 linux namespace 不同
网友评论