
Docker 容器与容器云读书笔记
Iaas 基础设施即服务 Paas 平台即服务 Saas 软件即服务
容器云以容器为资源分割和调度的基本单位,专注资源共享和隔离,容器的编排和部署
每个docker命令都会发送给Docker daemon 进行处理 这个守护进程默认绑定一个unix socket
Dockerfile -> build -> image 镜像 run 变成容器 Push 发布镜像 tag 进行版本控制 容器有生命周期 每新建一个新的容器,docker 会分配一个新的ID作为唯一标识符 Docker commit 可以将一个容器固化成一个新的镜像,可以让在容器中安装的工具不丢失,但官方还是建议使用Dockerfile build 来创建镜像
节点互联的时候会通过 hosts 文件 自动维护联接的 ip 映射,类似DNS,使得容器的ip 可以任意改变,因此两两连接的节点的启动顺序至关重要,需要暴露在公网的节点最后启动 配置文件等需要编辑的文件使用数据卷的方式与宿主机共享 填写ip 配置的时候填写 link 参数的连接名,连接的时候容器会自动去 hosts 查找实际的 ip 地址
Namespace
- PID 解决进程冲突
- Network 解决网络配置冲突
- Mount 文件挂载
- User 解决用户冲突
同一个 namespace 下的进程可以感知到彼此的变化,而对外界一无所知
使用 clone 来实现创建不同的 namespace 查看 namespace 的方式:/proc/pid/ns 目录下的文件,如果两个进程指向的namespace 相同,那么它们就在同一个 namespace 下
setns() 可以用于加入一个已经存在的 namespace,进程从原先的 namespace 加入某个已经存在的 namespace,后使用 clone() 创建子进程继续执行命令。常用于 docker exec 在已有 namespace 中执行 shell 命令
UTC namespace
提供主机名和域名的隔离,使得隔离进程可以在网络上被视为一个独立节点,通过服务名来自定义登录时的名称 root@xxxxx
IPC namespace
进程间通信的 IPC 资源也需要进行隔离,在同一个 IPC namespace 下的进程彼此之间沟通的全局ID可见,不在同一 namespace 下的则不可见
PID namespace
对进程PID进行隔离,不同 namespace 下的进程可以有相同的 PID,内核会为 PID namespace 维护一个树状结构,在命名空间下重新挂载 /proc 只会发现同属一个命名空间的其他进程
父可以看到子,根命名空间可以看到所有的进程 查看所有 container 状态的原理:监控 docker daemon 所在 PID namespace 下所有进程和子进程,再根据条件进行筛选即可
如果需要在 docker 容器中跑多个进程,最先启动的应该是 bash,因为它具有资源监控与回收等管理能力
如果命名空间下的 init 没有处理某个信号,那么同下的其他进程发送的信号都会被屏蔽,这样可以防止 init 进程被误杀
一旦 init 进程被销毁,同下的进程也都会被销毁并回收
如果只想在 ps 的时候只看到该空间下的进程,需要对 /proc 进行重新挂载,在这种情况下,如果没有 mount namespace 进行挂载隔离的话,会影响到宿主的根空间
阅读