Docker 容器与容器云读书笔记
所有文章 所有文章

Docker 容器与容器云读书笔记

2026年1月26日·
软件工程
·阅读时长 1 分钟
托克
托克
云厂程序员,分享AI以及软件领域实践

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 进行挂载隔离的话,会影响到宿主的根空间

阅读