Docker 与 Podman:安全编排的新纪元

Hugehard 2024年08月13日 编辑

2024-08-13T14:06:50.png

大家好!😊 今天,我们将探讨一个令人兴奋的话题: 容器编排 。在容器编排工具出现之前,开发者们需要手动进行部署,而且经常面临因缺乏标准化而导致的“在我的机器上可以运行”的问题,这使得部署过程既复杂又容易出错。我们应该感谢那些开发这些技术的人们,他们极大地简化了我们的工作。

在此基础上,让我们来看看一个新兴的工具( Podman ),它在编排领域,尤其是在安全编排方面引起了广泛关注。这个工具甚至开始挑战长期以来一直占据主导地位的Docker 💪。请大家保持关注,我们将进一步探讨这个激动人心的新进展!

🚀 容器理解:从原因到方法

容器是一个独立的可执行包,包含了应用程序运行所需的所有元素,例如代码、运行时、库和系统设置。

这意味着无论你在哪里启动应用程序——无论是在你的笔记本电脑、云服务器还是同事的电脑上——它都能以相同的方式运行。这种一致性解决了长期存在的“ 在我的机器上可以运行 ”的问题。

容器编排的基础是 容器运行时 ,它负责创建、管理和执行容器。

  • 当启动一个容器时,运行时从仓库中获取指定的容器镜像,这个镜像就像是应用程序及其依赖的蓝图。
  • 运行时利用Linux命名空间为容器提供一个安全且隔离的环境,使容器能够独立地理解系统资源(如CPU、内存、磁盘、网络等)。
  • Linux内核中的控制组(cgroups)确保资源的公平分配,避免任何容器占用过多资源,从而影响系统性能。
  • 一旦容器被隔离,运行时就在该环境中执行程序,便于与宿主系统进行通信。
  • 容器运行时工具作为守护进程运行,与Linux内核交互以管理容器,这需要根访问权限。这种交互对于有效管理容器至关重要。

一些著名的容器运行时包括containerd(被Docker、Kubernetes、nerdctl等使用)和cri-o。

🏆 Podman的崛起挑战Docker的统治地位

2024-08-13T14:07:07.png

在容器管理领域,Podman正变得越来越受欢迎,这背后有几个重要的原因:

  • 无根架构 :与需要以守护进程形式运行并拥有根权限的Docker不同,Podman采用了无根架构。这一根本差异是Podman日益受欢迎的主要原因之一。
  • 安全漏洞问题 :Docker的根权限使其能够通过读取文件、安装程序、编辑应用等方式管理容器,但这同时也带来了安全隐患,使得守护进程成为黑客攻击的主要目标。
  • 易受黑客攻击 :一旦守护进程被黑客控制,他们可能会窃取敏感数据、运行恶意代码、篡改容器配置,甚至导致整个系统瘫痪。
  • 利用SELinux增强安全性 :Podman与Docker不同,它在启动每个容器时都会添加Security-Enhanced Linux (SELinux)标签,以此来提升安全性。
  • 依赖其他工具进行管理 :作为无根架构,Podman并不直接管理容器,而是依赖以下工具进行容器管理。- Buildah :这是一个开源的、基于Linux的工具,用于构建与Open Container Initiative (OCI)兼容的容器。Buildah能够在没有安装完整容器运行时或守护进程的情况下创建和管理容器。- Skopeo :这是一个命令行工具,用于对容器镜像和镜像仓库执行多种操作。它可以在不下载整个镜像的情况下检查远程仓库中的镜像,是处理容器的轻量级解决方案。- Systemd :Podman通过调用配置的容器运行时来创建运行中的容器。在没有专用守护进程的情况下,Podman使用systemd——Linux操作系统的系统和服务管理器——来进行更新并在后台保持容器运行。

🔒 Podman安全实践:Docker的安全替代品

  • 在这个场景中,我们创建了三个Linux用户—— Bob、Dawg和BadBoy 。Bob和Dawg使用Podman来创建容器,这些容器只能访问他们各自用户命名空间内的资源。这样的配置增强了安全性,因为它将每个容器的访问权限限制在其自己的命名空间内。
  • BadBoy使用的是 Docker ,它拥有根权限,可以访问宿主系统上的所有资源,包括他命名空间之外的内容。这增加了安全风险,因为这样可能会让系统面临攻击。而Podman作为一个无根架构,限制了用户只能访问自己的命名空间,从而提高了安全性。

Podman安装步骤

让我们通过一个实际例子来了解如何在macOS上安装Podman。我们的演示将在这个操作系统上进行,但你可以根据需要查阅相应的文档以在其他环境中进行安装。

  • 安装Podman :执行brew install podman命令,通过Homebrew安装Podman。
  • 初始化Podman虚拟机 :使用podman machine init命令来初始化Podman虚拟机。
  • 安装Podman-Compose :Podman-Compose是一个脚本,用于通过Podman运行Docker Compose,你可以通过brew install podman-compose命令来安装它。
  • 安装Podman-Desktop :Podman-Desktop为Podman提供了类似Docker Desktop的使用体验。使用brew install podman-desktop命令进行安装。
  • 验证Podman安装详情 :最后,你可以使用podman info命令来检查Podman的安装和配置信息。下面是部分输出内容,其中突出显示了一些关键信息。
host:
  arch: amd64
  buildahVersion: 1.32.0
  cgroupControllers:
  - cpu
  - io
  - memory
  - pids
  cgroupManager: systemd
  cgroupVersion: v2
  ociRuntime:
    name: crun
    package: crun-1.12-1.fc39.x86_64
    path: /usr/bin/crun
    version: |-
      crun version 1.12
      commit: ce429cb2e277d001c2179df1ac66a470f00802ae
      rundir: /run/user/501/crun
      spec: 1.0.0
      +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +YAJL
  os: linux
  security:
    apparmorEnabled: false
    capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
    rootless: true
    seccompEnabled: true
    seccompProfilePath: /usr/share/containers/seccomp.json
    selinuxEnabled: true
  serviceIsRemote: true
registries:
  search:
  - docker.io
version:
  APIVersion: 4.7.2
  Built: 1698762721
  BuiltTime: Tue Oct 31 20:02:01 2023
  GitCommit: ""
  GoVersion: go1.21.1
  Os: linux
  OsArch: linux/amd64
  Version: 4.7.2
  • 你还可以使用Podman命令行界面(CLI)来验证Podman的详细信息,检查镜像,以及管理正在运行的容器。

2024-08-13T14:09:17.png

  • 我们可以通过执行命令podman compose up -d来使用下面提供的Docker Compose文件启动容器。
services:
  postgres:
    image: postgres
    restart: always
    environment:
      POSTGRES_DB: podman-psql
      POSTGRES_USER: podman-psql-user
      POSTGRES_PASSWORD: podman-pass
    ports:
      - '5432:5432'

  redis:
    image: 'redis:6.0.14'
    restart: always
    command: redis-server
    ports:
      - '6379:6379'
  • 你可以在Podman桌面环境中查看正在运行的容器和镜像。

2024-08-13T14:10:16.png

2024-08-13T14:10:26.png

结语

在数字时代,安全性至关重要。一次安全漏洞可能导致严重后果。Docker和Podman各有所长,也各有所短。Podman以安全编排为基础构建,可能在某些功能上不如Docker(例如Docker Swarm)。而Docker虽然注重易用性,但在安全性方面似乎略显不足。

希望这次讨论对你有所帮助,并增进了你对安全编排的了解。如果你觉得这些信息有用,并希望收到更多类似的文章,请关注我。祝你学习愉快!🚀

猜你喜欢