跳转至

Docker概念

Docker安全

  • 当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的命名空间和控制组集合。
  • 命名空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。

  • 能力机制(Capability) 是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制。
  • Linux 内核自 2.2 版本起就支持能力机制,它将权限划分为更加细粒度的操作能力,既可以作用在进程上,也可以作用在文件上。
1
2
3
4
5
使用 Docker 运行特权容器
docker run --privileged <image> [command]

使用 Docker 运行部分权限容器
docker run --cap-add=CAP_SYS_ADMIN <image> [command]

注意:

  • --cap-add 标志用于添加容器的权限。
  • 可以添加多个权限,用逗号分隔。
  • 有关可用权限的完整列表,请参阅 Docker 文档。

最佳实践:

  • 尽可能避免使用特权模式。
  • 仅授予容器执行其所需任务所需的最小权限。
  • 定期审查容器的权限。

底层实现

命名空间(Namespaces) + 控制组(Control groups) + Union 文件系统(Union file systems) + 容器格式

命名空间

命名空间 描述
PID 命名空间 隔离进程。容器中的进程只能看到属于同一命名空间的其他进程。
NET 命名空间 隔离网络资源。容器中的进程只能访问属于同一命名空间的网络接口和 IP 地址。
UTS 命名空间 隔离主机名和域信息。容器中的进程只能看到属于同一命名空间的主机名和域。
IPC 命名空间 隔离进程间通信 (IPC) 资源。容器中的进程只能与属于同一命名空间的其他进程进行 IPC。
MNT 命名空间 隔离文件系统挂载点。容器中的进程只能看到属于同一命名空间的挂载点。
USER 命名空间 隔离用户和组标识符。容器中的进程只能看到属于同一命名空间的用户和组。

注意:

  • 容器默认情况下在自己的命名空间中运行。
  • 可以使用 --pid=host--net=host 等标志将容器附加到主机的命名空间。

控制组

控制组 (cgroups) 是一种 Linux 内核功能,用于限制、记录和隔离进程组的资源使用情况。它允许管理员对系统资源(如 CPU、内存、块 I/O 和网络带宽)进行细粒度的控制。

cgroups 的主要组件:

  • cgroup 层次结构: 一个树形结构,其中每个节点代表一个 cgroup。
  • cgroup 控制器: 定义可以由 cgroup 控制的资源类型(例如,cpu、内存、blkio)。
  • 任务: 属于特定 cgroup 的进程组。

cgroups 的优点:

  • 资源管理: 允许管理员限制和分配系统资源,以确保公平性和服务质量 (QoS)。
  • 隔离: 将进程隔离到不同的 cgroup 中,防止它们相互干扰。
  • 可计量: 提供有关资源使用的详细统计信息,用于监控和故障排除。
  • 安全性: 限制恶意进程的资源使用,以防止拒绝服务攻击。

使用 cgroups

可以使用 cgcreatecgexec 命令创建和管理 cgroups。例如:

1
2
3
4
5
6
7
apt install cgroup-tools 

# 创建一个名为 "my-cgroup" 的 cgroup
cgcreate -g cpu,memory:my-cgroup

# 将进程 12345 移动到 "my-cgroup"
cgexec -g cpu,memory:my-cgroup /bin/bash -c "sleep 60"

Docker 和 cgroups

Docker 使用 cgroups 来隔离和限制容器的资源使用情况。
每个容器都运行在自己的 cgroup 中,这有助于确保容器不会耗尽主机的资源。

更多 cgroup限制内存、cup的使用

联合文件系统

联合文件系统 (UnionFS) 是一种分层文件系统,它允许将多个文件系统层叠在一起,创建一个统一的视图。这使得可以轻松地创建只读文件系统、合并文件系统更改以及回滚到以前的版本。

联合文件系统的工作原理:

联合文件系统将多个底层文件系统(称为“分支”)叠加在一起,创建一个新的虚拟文件系统(称为“联合挂载”)。当访问联合挂载中的文件或目录时,系统会从上到下搜索分支,直到找到该文件或目录。

如果在较高的分支中找到文件或目录,则使用该版本。如果在较低的分支中找到文件或目录,则使用该版本,前提是它未被较高分支中的文件或目录覆盖。

联合文件系统的优点:

  • 只读文件系统: 可以将联合文件系统用作只读文件系统,这对于创建安全且不可变的文件系统非常有用。
  • 合并文件系统更改: 联合文件系统允许合并来自不同分支的文件系统更改。这对于创建模块化和可扩展的文件系统非常有用。
  • 回滚到以前的版本: 联合文件系统允许轻松回滚到以前的版本。这对于故障排除和数据恢复非常有用。

Docker 和联合文件系统

  • Docker 使用联合文件系统来管理容器的镜像和容器。每个容器都有一层联合文件系统,其中包含容器的镜像和任何本地更改。这允许容器共享镜像层,同时仍然能够进行自己的更改。
  • 使用联合文件系统来创建只读文件系统,以提高安全性。
  • 使用联合文件系统来合并来自不同来源的文件系统更改。
  • 使用联合文件系统来回滚到以前的版本,以进行故障排除和数据恢复。

容器格式

容器格式 定义了容器的布局和结构,包括文件系统、网络配置、进程树和资源限制。