2024年11月

Linux 容器技术

Linux 容器 已逐渐成为一种关键的开源应用程序打包和交付技术,将轻量级应用程序隔离与基于镜像的部署方法的灵活性相结合。Red Hat Enterprise Linux 使用核心技术实现 Linux 容器,例如:


控制组(cgroups)用于资源管理

命名空间(namespace)用于进程隔离

SELinux 用于安全性

安全多租户

这些技术一定程度上降低了安全漏洞的可能性,并为您提供了生成和运行企业级容器的环境。


Podman 简介

Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。 Podman 提供与 Docker 非常相似的功能。Podman 提供了一个与 Docker 兼容的 CLI 工具(命令行界面),可以这样说,会使用 docker 基本就会使用 podman。


Podman 是一种 无守护进程 的容器引擎,可以创建、管理和运行 OCI 容器,容器可以以非 root 身份运行(也可以使用 root 身份运行)。Podman 是由 Red Hat 开发,从 Red Hat Enterprise Linux 7 开始,Podman 成为了默认的容器引擎。


Podman 遵守了 OCI(Open Container Initiative/开放容器倡议) 规范,可以轻松查找、运行、构建、共享和部署应用程序。


相应的 Podman 也提供了一个类似 GUI 的桌面端管理工具 — Podman Desktop;




Podman 与 Docker 对比

Podman 与其他容器工具实现不同,这里描述的工具不以单一的 Docker 容器引擎和 docker 命令为中心。




相反,红帽提供了 一组命令行工具,无需容器引擎 即可操作。它们是:


podman - 用于直接管理 pod 和容器镜像(run、stop、start、ps、attach 和 exec ,等等);

buildah - 用于构建、推送和签名容器镜像;

skopeo - 用于复制、检查、删除和签名镜像;

runc - 为 podman 和 buildah 提供容器运行和构建功能;

crun - 可选运行时,可以配置,并为 rootless 容器提供更大的灵活性、控制和安全性;

由于这些工具与开放容器项目(OCI)兼容,因此它们可用于管理由 Docker 和其他兼容 OCI 的容器引擎生成和管理的相同的 Linux 容器。然而,它们特别适用于直接在 Red Hat Enterprise Linux 中运行在单节点用例。


Podman 的一组模块化工具

Podman、Skopeo 和 Buildah 工具被开发来取代 Docker 命令功能。这种场景中的每个工具都是非常轻量级且模块化的,并专注于功能的子集。


Podman、Skopeo 和 Buildah 工具的主要优点包括:

以无根模式运行 - rootless 容器更安全,因为它们在运行时不需要添加任何特权;

不需要守护进程 - 这些工具在空闲时对资源的要求要低得多,因为如果您没有运行容器,Podman 就不会运行。相反,Docker 有一个始终运行的守护进程;

原生 systemd 集成 - Podman 允许您创建 systemd 单元文件,并作为系统服务运行容器;

Podman、Skopeo 和 Buildah 的特点包括:

Podman、Buildah 和 CRI-O 容器引擎都使用 相同的后端存储目录,/var/lib/containers,而不是默认使用 Docker 存储位置 /var/lib/docker。

虽然 Podman、Buildah 和 CRI-O 共享相同的存储目录,但它们不能相互交互。这些工具可以 共享镜像。

要以编程方式与 Podman 进行交互,您可以使用 Podman v2.0 RESTful API,它可以在有根和无根的环境中工作。如需更多信息,请参阅 使用容器-工具 API 章节。

使用 container-tools API,https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index#using-the-container-tools-api


Podman 与 Docker 的主要区别



守护进程(deamon):Docker 使用守护进程来创建镜像和运行容器,而 Podman 则没有守护进程,可以在启动容器的用户下直接运行容器。这意味着 Podman 中的容器默认情况下不具有 Root 访问权限,在 Root 级别和 Rootless 级别之间添加了一个自然屏障,提高了安全性。


安全性:Podman 支持 rootless 容器,这种容器被认为比具有 Root 访问权限的容器更安全。在 Docker 中,守护进程拥有 Root 权限,这使得它们易成为攻击者的首选入侵点。


镜像构建:作为一款自给自足的工具,Docker 可以自己构建容器镜像。而 Podman 需要使用另一种名为 Buildah 的工具来构建镜像。


多合一和模块化:Docker 是一个独立的、强大的工具,在整个循环中处理所有的容器化任务,有优点也有缺点。而 Podman 采用 模块化 的方法,依靠一组专门的工具(podman、skopeo、buildah,runc )来完成特定的任务。


适用平台:Docker 在 MacOS 和 Windows 上也能够运行,而 Podman 主要面向 Linux 系统。但是 podman 也对 Windows 和 MacOS 做了支持(需要借助虚拟机来实现,称为 podman machine,在 MacOS 上借助 QEMU 虚拟机,在 Windows 上借助 Linux 子系统 WSL2)。


Podman 支持多种操作系统

Podman 支持多种操作系统,包括 Linux、macOS 和 Windows。


OS 系统平台 Podman 后端运行环境 是否借助虚拟机(podman machine)

Linux 原生后端运行 否

macOS 使用 Lima 后端来运行 QEMU

Windows 使用 WSL(Windows Subsystem for Linux)作为后端来运行 WSL2

QEMU 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备。


因此,无论您使用的是哪种操作系统,只要安装了相应的后端和依赖项,您都可以使用 Podman 来管理和运行容器。


Podman 配置国内镜像

由于国内网络环境被墙原因,默认使用 podman 的镜像源是无法访问的,因此我们需要修改为国内可访问的镜像源替代。


配置 registries.conf 的两种方式:


podman 全局配置文件:/etc/containers/registries.conf

用户单独配置文件:~/.config/containers/registries.conf

注意:配置文件有两种版本格式,v1 和 v2,两种格式的配置不能混用,混用会提示错误。


registries.conf v2 格式

# 例:使用 podman pull registry.access.redhat.com/ubi8-minimal 时,

# 仅仅会从registry.access.redhat.com去获取镜像。

# 如果直接使用 podman pull ubuntu 时,没有明确指明仓库的时候,使用以下配置的仓库顺序去获取

unqualified-search-registries = ["docker.io", "registry.access.redhat.com"]

 

# 配置仓库的地址,可以直接在location里配置国内镜像例如:docker.mirrors.ustc.edu.cn

# 直接在location里配置的时候,可以不需要后面的 [[registry.mirror]] 内容,

# 但是这样只能配置一个镜像地址,这个镜像挂了就没法尝试其它镜像。

# prefix的值与unqualified-search-registries里配置的得一样,但是可以支持通配符。

# prefix不写的情况下,默认与location的指一样。

[[registry]]

prefix = "docker.io"

location = "docker.io"

 

# 在这里可以配置多个镜像地址,前提是至少有一个[[registry]]配置。

# 需要注意的是,无论 unqualified-search-registries 选择了哪个仓库,

# 都会先从这里的上下顺序开始去拉取镜像,最后才会去匹配上[[registry]]里prefix对应的location位置拉取镜像。

# 所以这里需要注意,上面配置的不同仓库类型,这里配置的镜像并不能是通用的,所以 unqualified-search-registries 配置了多个仓库的时候,就最好直接使用[[registry]] 的 location 指定镜像地址,不要配置 [[registry.mirror]] 了。

# redhat 的国内镜像暂未发现。

[[registry.mirror]]

location = "docker.nju.edu.cn"

[[registry.mirror]]

location = "docker.mirrors.sjtug.sjtu.edu.cn"

 

# 当使用 podman pod create 命令时候,因需要从k8s.gcr.io拉取 pause 镜像,但是该站点在国内被墙了。

# 所以给该站点搞个镜像。以下镜像是阿里云第三方用户,非官方。

# 或者 registry.aliyuncs.com/googlecontainersmirror ,也是第三方用户。

# 目前没找到国内官方的镜像。gcr.mirrors.ustc.edu.cn 返回403不能用了

[[registry]]

prefix = "k8s.gcr.io"

location = "registry.aliyuncs.com/google_containers"

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

registries.conf v1 格式

# 使用tls

[registries.search]

registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io']

 

# 不使用tls

[registries.insecure]

registries = []

 

# 不允许使用的

[registries.block]

registries = []

1

2

3

4

5

6

7

8

9

10

11

此处我们以 registries.conf v2 格式举例,使用如下命令方式修改:


sudo tee /etc/containers/registries.conf <<-'EOF'

> unqualified-search-registries = ["docker.io"]

> [[registry]]

> prefix = "docker.io"

> location = "y55otr6h.mirror.aliyuncs.com"

> EOF

1

2

3

4

5

6

7

Linux tee 命令用于读取标准输入的数据,并将其内容输出成文件。

tee 指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

注意:和 docker 修改镜像源不同的是,【location】这不需要写【http://】。


Podman 使用

运行 nginx 的简单示例

以 nginx 为例,使用 Podman 拉取 Nginx 镜像并建立容器的示例如下:


# 拉取 Nginx 镜像

podman pull nginx:latest


# 创建并启动 Nginx 容器

podman run -d --name mynginx nginx


# 停止 mynginx 容器

podman stop mynginx


# 重启 mynginx 容器

podman restart mynginx


# 进入 mynginx 容器

podman exec -it mynginx /bin/bash


# 查看 mynginx 容器日志

podman logs mynginx


# 删除 mynginx 容器

podman rm mynginx


# 删除 Nginx 镜像

podman image rm nginx:latest

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

通过上面简单应用的举例,你是不是有种很熟悉的感觉呢,似曾相识 Podman 归来。


podman 常见命令

您可以使用以下基本命令,使用 podman 工具管理镜像、容器和容器资源。


attach,附加到正在运行的容器。

commit,从更改的容器创建新镜像。

compose,通过外部提供程序(如 docker compose 或 podman-compose)运行compose工作负载。

container,管理容器。

build,使用 Containerfile 指令构建镜像。

create,创建但不启动容器。

diff,检查容器的文件系统上的变化。

exec,在正在运行的容器中运行一个进程。

export,将容器的文件系统内容导出为 tar 存档。

help, h,显示某个命令的命令列表或帮助。

healthcheck,运行容器健康检查。

history,显示指定镜像的历史记录。

images,列出本地存储中的镜像。

import,导入一个 tar 包以创建一个文件系统镜像。

info,显示系统信息。

inspect,显示容器或镜像的配置。

kill,向一个或多个正在运行的容器发送一个特定的信号。

kube generate,根据容器、Pod 或卷生成 Kubernetes YAML。

kube play,根据 Kubernetes YAML 创建容器、pod 和卷。

load,从存档加载一个镜像。

login,登录到容器注册中心。

logout,退出容器注册中心。

logs,获取容器的日志。

mount,挂载一个工作容器的根文件系统。

pause,暂停一个或多个容器中的所有进程。

ps,列出容器。

port,列出容器的端口映射或特定映射。

pull,从注册中心拉取一个镜像。

push,将镜像推送到指定的目的地。

restart,重启一个或多个容器。

rm,从主机中删除一个或多个容器。如果要运行,添加 -f。

rmi,从本地存储删除一个或多个镜像。

run,在新容器中运行一个命令。

save,将镜像保存到存档。

search,在注册中心搜索镜像。

start,启动一个或多个容器。

stats,显示一个或多个容器的 CPU、内存、网络 I/O、块 I/O 和 PID 的百分比。

stop,停止一个或多个容器。

tag,为本地镜像添加一个额外名称。

top,显示容器的运行进程。

umount, unmount,卸载工作容器的根文件系统。

unpause,取消一个或多个容器中暂停的进程。

version,显示 podman 版本信息。

wait,阻止一个或多个容器。

要显示所有 Podman 命令的完整列表,请使用 podman -h。


PS C:\Users\Jeffrey.Chai> podman -h

Manage pods, containers and images


Usage:

  podman.exe [options] [command]


Available Commands:

  attach      Attach to a running container

  build       Build an image using instructions from Containerfiles

  commit      Create new image based on the changed container

  compose     Run compose workloads via an external provider such as docker-compose or podman-compose

  container   Manage containers

  cp          Copy files/folders between a container and the local filesystem

  create      Create but do not start a container

  diff        Display the changes to the object's file system

  events      Show podman system events

  exec        Run a process in a running container

  export      Export container's filesystem contents as a tar archive

  generate    Generate structured data based on containers, pods or volumes

  healthcheck Manage health checks on containers

  help        Help about any command

  history     Show history of a specified image

  image       Manage images

  images      List images in local storage

  import      Import a tarball to create a filesystem image

  info        Display podman system information

  init        Initialize one or more containers

  inspect     Display the configuration of object denoted by ID

  kill        Kill one or more running containers with a specific signal

  kube        Play containers, pods or volumes from a structured file

  load        Load image(s) from a tar archive

  login       Log in to a container registry

  logout      Log out of a container registry

  logs        Fetch the logs of one or more containers

  machine     Manage a virtual machine

  manifest    Manipulate manifest lists and image indexes

  network     Manage networks

  pause       Pause all the processes in one or more containers

  pod         Manage pods

  port        List port mappings or a specific mapping for the container

  ps          List containers

  pull        Pull an image from a registry

  push        Push an image to a specified destination

  rename      Rename an existing container

  restart     Restart one or more containers

  rm          Remove one or more containers

  rmi         Remove one or more images from local storage

  run         Run a command in a new container

  save        Save image(s) to an archive

  search      Search registry for image

  secret      Manage secrets

  start       Start one or more containers

  stats       Display a live stream of container resource usage statistics

  stop        Stop one or more containers

  system      Manage podman

  tag         Add an additional name to a local image

  top         Display the running processes of a container

  unpause     Unpause the processes in one or more containers

  untag       Remove a name from a local image

  update      Update an existing container

  version     Display the Podman version information

  volume      Manage volumes

  wait        Block on one or more containers


Options:

  -c, --connection string         Connection to use for remote Podman service

      --help                      Help for podman

      --identity string           path to SSH identity file, (CONTAINER_SSHKEY)

      --log-level string          Log messages above specified level (trace, debug, info, warn, warning, error, fatal, panic) (default "warn")

      --out string                Send output (stdout) from podman to a file

      --ssh string                define the ssh mode (default "golang")

      --storage-opt stringArray   Used to pass an option to the storage driver

      --url string                URL to access Podman service (CONTAINER_HOST) (default "unix:///run/podman/podman.sock")

  -v, --version                   version for podman.exe

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

总结

Podman 是一个强大、安全且易于使用的容器管理解决方案。通过无守护进程设计、开源免费、兼容性以及可扩展性等特点,Podman 为开发者、运维人员和组织提供了一个可靠的容器管理工具。一句话简单概括,Podman 是一个轻量级,模块化且功能专注的容器化管理平台。可以这么说,在一定程度上 Podman 是 Docker 的 "改良优化版"。如果您一直在寻找一个替代 Docker 的方案,那么 Podman 绝对值得考虑。

————————————————


                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

                        

原文链接:https://blog.csdn.net/ChaITSimpleLove/article/details/135868617


【导读】容器部署是实际使用和实践容器的第一步,本文结合笔者实际生产实践使用,详细梳理了Podman和Docker如何在不同环境下(在线环境及离线环境)进行安装和部署,以及在部署后如何对Docker的常用功能进行相关设置以便更好地使用,并对容器部署中可能遇到的坑进行了说明。本文适合容器初学者,可以依照步骤完成容器的部署安装及使用,为后续的深入学习打下基础。

【分享者】周飒,上海某金融单位系统架构师。从事数据中心运维工作,主要负责数据中心kubernetes容器私有云的建设及维护。


1 Linux 容器介绍

Linux容器是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由另一个镜像提供, 这意味着从开发到测试再到生产的整个过程中,Linux 容器都具有可移植性和一致性。因而,相对于依赖重复传统测试环境的开发渠道,容器的运行速度要快得多。容器比较普遍也易于使用,因此也成了 IT 安全方面的重要组成部分。

图片

容器可以确保您的应用拥有必需的库、依赖项和文件,让您可以在生产中自如地迁移这些应用,无需担心会出现任何负面影响。实际上,您可以将容器镜像中的内容,视为 Linux 发行版的一个安装实例,因为其中完整包含 RPM 软件包、配置文件等内容。

容器从出现开始,迅速成为现代数据中心的必要组成部分。目前流行的容器引擎包括Docker以及下一代符合Open Container Initiative(OCI)标准的容器。

Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单的容器使用接口,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到Linux 机器上,但Docker也有两个主要缺点:

  • Docker 需要在你的系统上运行一个守护进程;

  • Docker 是以 root 身份在你的系统上运行该守护程序。

这些缺点的存在可能有一定的安全隐患,为了解决这些问题,下一代容器化工具Podman出现了。

图片

Podman是一个开源的容器管理工具,其可在大多数Linux平台上使用,它是一种无守护程序的容器引擎,用于在Linux系统上开发,管理和运行任何符合Open Container Initiative(OCI)标准的容器和容器镜像, 提供了一个与Docker兼容的命令行前端。Podman控制下的容器既可以由root用户运行,也可以由非特权用户运行。

使用Podman,Skopeo和Buildah的新一代容器架构工具后,可以解决由于docker守护程序导致的启动和安全问题。


2 Podman 和docker主要不同之处

docker 需要在我们的系统上运行一个守护进程(docker daemon),而podman 不需要。

  • 启动容器的方式不同:docker cli 命令通过API跟 Docker Engine(引擎)交互告诉它我想创建一个container,然后docker Engine才会调用OCI container runtime(runc)来启动一个container。这代表container的process(进程)不会是Docker CLI的child process(子进程),而是Docker Engine的child process。

  • Podman是直接给OCI containner runtime(runc)进行交互来创建container的,所以container process直接是podman的child process。

  • docker需要使用root用户来创建容器,但是podman不需要。


3 Podman部署和常见操作

Podman的安装部署非常简便,参考如下:

1. Arch Linux & Manjaro Linux

sudo pacman -S podman

2. Fedora,Centos,RHEL

sudo yum -y install podman

3. Gentoo

sudo emerge app-emulation/libpod

4. MacOS

brew cask install podman

基本常用命令:

podman info

podman version

podman images

podman rmi

podman ps

Podman CLI 里面很多指令都和Docker CLI 相同,官方给出了这么个例子alias docker=podman,所以说经常使用Docker CLI的人使用Podman上手非常快。

运行一个容器

图片

列出当前所有的容器

图片

查看一个镜像信息

图片

查看容器运行的日志

图片

查看运行中容器资源使用情况

图片

图片


4 Docker部署

4.1 部署准备工作

Docker CE即社区版(Community Edition),免费使用。这里以CentOS为例来介绍Docker的部署流程。在部署前,需要具备以下环境:

  • CentOS 7 及以上版本的操作系统

  • Linux内核版本不低于3.10(CentOS 7 满足最低内核的要求)

  • 已启用centos-extras仓库(默认情况此仓库是启用的,使用yum repolist可以查看是否存在。如未启用,可安装yum-utils后执行 yum-config-manager --enable extras 进行启用)

  • 若安装了旧版本Docker相关内容,需进行卸载,旧版本的Docker称为docker或者docker-engine,卸载命令如下:(若未做说明,后续命令均以root用户执行)

图片

若服务器能够连接到互联网,可参考在线部署步骤进行Docker安装,如无法连接到互联网,可参考离线部署步骤进行Docker安装。

4.2 在线部署步骤

安装必要的软件包

先安装如下的软件包:yum-utils,方便后续配置yum仓库

图片

配置docker-ce稳定仓库

图片

注意,docker-ce.repo中也包含了nightly及test仓库,默认没有启用,可以使用 sudo yum-con-fig-manager --enable docker-ce-nightly 进行启用,一般无需启用。

安装最新版本的docker-ce

图片

该命令默认安装了最新版本的docker-ce,安装过程中如需校验GPG key,输入"y"确认即可。

执行完成后,Docker已经成功安装,但是还未启动,建议先不要启动,完成后续“部署完成后相关设置”后再启动Docker。

安装指定版本的docker-ce

首先使用如下命令查看docker-ce.repo中有哪些docker-ce版本。

图片

第二列的部分字符串(冒号之后连接号之前)是版本号,例如可以使用如下命令安装指定版本:

图片

该命令会安装指定版本的docker-ce,安装中如需校验GPG key,输入"y"确认即可。

执行完成后,Docker已经成功安装,但是还未启动,建议先不要启动,完成后续“部署完成后相关设置”后再启动Docker。

4.3 离线部署步骤

执行完成后,Docker已经成功安装,但是还未启动,建议先不要启动,完成后续“部署完成后相关设置”后再启动Docker。

官方步骤及存在的坑

安装18.09.1版本:

官方给的文档说明是,到Docker官网下载指定版本的rpm包 https://download.docker.com/linux/centos/7/x86_64/stable/Packages/,然后再使用yum进行安装。

这种方式会存在一个问题,在完全离线的环境中,直接安装docker官网下载的rpm包会缺少很多依赖,这些依赖需要手动去下载相应的rpm包进行升级或者安装,非常麻烦。因此这里推荐以下方法进行离线安装。

下载所有的rpm包到本地

(1)在可以上网的环境(例如个人电脑),安装一台与离线环境机器相同操作系统的虚拟机,确保该虚拟机能够访问互联网,在安装虚拟机操作系统时最好选择最小化安装。假设操作系统为CentOS。

(2)安装完毕后,配置机器的yum源(建议配置阿里云的镜像),先备份/etc/yum.repos.d/。

图片

(3)然后配置CentOS-Base.repo及docker-ce.repo

图片

(4)下载docker-ce相关的rpm包。

图片

创建repo仓库

在以上能联网的虚机上安装createrepo创建仓库。

图片

此时会在 /tmp/rpm_download 下生成repodata仓库数据文件夹。

在离线环境进行安装

拷贝以上文件到离线环境的机器上,配置本地yum源进行安装。

将以上文件夹拷贝到离线环境的机器上,假设目录也为/tmp/rpm_download

配置离线环境机器的本地yum源。

图片

至此,完成了离线环境下docker的安装。

4.4 部署完成后相关设置

配置非root用户使用Docker命令

Docker daemon默认监听一个Unix套接字(/var/run/docker.sock),这个Unix套接字默认属于用户root,其他用户如果要使用docker命令行与daemon通信,则必须使用sudo。

非root用户每次都使用sudo比较麻烦,可以创建一个名为“docker”的组(安装完docker后默认就有),然后把非root用户加入到docker组里面,就可以直接访问Docker daemon了。

图片

注意,如果已经使用了sudo,然后再把该用户加入到docker组,可能会因为目录权限的问题导致报错,使用以下命令修复即可。

图片

配置Docker开机自启动

CentOS 7中使用Systemd管理服务,执行以下命令即可。

图片

配置默认的日志驱动

Docker daemon的默认日志驱动是json-file,可以把docker容器的标注输出、标准错误输出到json文件中,也可以支持其他日志驱动,例如local、journald,通过在/etc/docker/daemon.json中配置。

图片

也可以在创建容器时,指定容器使用的日志驱动,例如:

图片

配置Docker daemon监听TCP端口

默认情况下,Docker daemon监听一个本地的Unix socket,接收来自本地docker客户端的请求。如果要从远程访问,比如docker-compose、docker-swarm之类的工具需要与Docker daemon通信,可以让Docker daemon监听一个本地的tcp端口。

CentOS系统下,修改文件/usr/lib/systemd/system/docker.service,修改如下内容:

图片

然后重启docker。

图片

使用 netstat -tnlp | grep 2375 可以看到dockerd进程监听了2375端口。

配置镜像下载加速

默认情况下Docker会从国外的镜像仓库pull镜像,可以使用国内的仓库镜像服务器以加快pull image 的速度,同时增加下载的并发数。

CentOS系统下,修改docker配置文件/etc/docker/daemon.json。

图片

然后重启docker。

图片

配置Docker的默认网桥

Docker服务启动后默认会创建一个docker0网桥,它使用的默认网段是172.xx.xx.xx,假设部署docker的机器也是用这个网段,则可能会有冲突,可以修改docker默认的网段。

CentOS系统下,修改docker配置文件/etc/docker/daemon.json

图片

然后重启docker。

图片

4.5 功能验证

启动Docker

图片

查看docker状态信息

图片

运行hello-world容器

图片

首次运行会从远程镜像仓库下载hello-world镜像,并启动一个容器,当容器运行时会输出一段信息,然后自动退出,通过 docker ps -a 可以查看。

Docker daemon的日志

systemd使用journalctl命令统一管理所有Unit的启动日志,使用以下命令可以查看Docker daemon日志。

图片

Docker卸载

图片


5 本章小结

本文介绍了容器的部署过程和简单的容器操作,分别说明了Docker和下一代容器工具Podman的区别。目前,Docker容器引擎还被很多的工程师广泛使用,但是由于其本身的局限性,未来符合OCI标准的Podman还是会逐渐成为社区主流,而被广大的开发人员、运维人员所接受。技术在不断发展,新的工具在涌现,我们可以根据相应的新的容器工具链,构建一个与 Docker 完全兼容,然而却更加轻量、灵活和安全的容器环境。

参考引用:
Podman 官网地址:https://podman.io/Podman
https://www.redhat.com/zh/topics/containers/whats-a-linux-container
https://baijiahao.baidu.com/s?id=1653853217702500436&wfr=spider&for=pc
https://www.redhat.com/zh/topics/containers/whats-a-linux-container
https://www.cnblogs.com/shoufu/p/11803010.html
原题:容器部署
本文为容器云职业技能大赛课程,点击阅读原文可下载
觉得本文有用,请转发、点赞或点击在看,让更多同行看到

 资料/文章推荐:


欢迎关注社区 “容器云”技术主题 ,将会不断更新优质资料、文章。地址:https://www.talkwithtrend.com/Topic/98447


在容器化技术不断发展的今天,Docker 和 Podman 分别作为两个主流的容器运行时,吸引了大量开发者和企业的关注。本文将从多个角度全方位地对比这两者的优缺点,以帮助您更好地了解它们的特点并做出明智的选择。

1. 简介

1.1 Docker

Docker 是目前最流行的开源容器平台,自 2013 年推出以来,已经成为容器技术的代名词。Docker 提供了一种简单、高效的方式来打包、分发和部署应用程序,使得开发、测试和生产环境更加一致。

1.2 Podman

Podman 是 Red Hat 推出的一款容器运行时,与 Docker 类似,它也支持 OCI(Open Container Initiative)标准。Podman 的设计目标是提供一个与 Docker 相似的用户体验,同时解决一些 Docker 存在的问题,如守护进程依赖和特权安全问题。

2. 架构与安全性

2.1 架构

Docker 使用客户端-服务器架构,其中包括一个守护进程(Docker Daemon)和一个命令行客户端。这种架构使得 Docker 可以方便地进行远程管理,但也带来了一定的安全隐患。

与之不同,Podman 采用无守护进程架构,它直接与容器运行时(如 runc 或 crun)进行通信。这种设计使得 Podman 更加轻量级,同时避免了守护进程可能导致的安全问题。

2.2 安全性

Docker 守护进程需要以 root 用户身份运行,这意味着容器内的进程可能具有较高的特权。尽管 Docker 提供了一些安全措施,如用户命名空间和 Seccomp,但仍然存在一定的风险。 Podman 支持 rootless 模式,即无需 root 用户即可运行容器。这大大降低了潜在的安全风险。此外,Podman 还支持 SELinux 和 CgroupsV2,为容器提供了更强大的安全保障。

3. 兼容性与生态系统

3.1 兼容性

Podman 遵循 OCI 标准,因此它与 Docker 镜像和容器完全兼容。Podman 还提供了一套与 Docker CLI 类似的命令行工具,使得从 Docker 切换到 Podman 变得非常简单。

3.2 生态系统

Docker 拥有庞大的生态系统,包括 Docker Hub、Docker Compose、Docker Swarm 等。这些工具和服务为用户提供了丰富的资源和便利的管理功能。

Podman 同样具有丰富的生态系统,包括 Buildah(用于构建容器镜像)、Skopeo(用于远程操作镜像)等。此外,Podman 也支持 Kubernetes,使得用户可以轻松地将 Podman 容器部署到 Kubernetes 集群中。

4. 性能与资源占用

由于 Podman 采用无守护进程架构,它的资源占用通常较 Docker 更低。同时,Podman 支持 CgroupsV2,可以更精确地控制容器的资源使用。 在性能方面,Docker 和 Podman 的差异并不明显。两者在容器启动、运行和停止等方面的性能都非

5. 容器编排与集群管理

5.1 Docker

Docker 提供了 Docker Swarm 作为其原生的集群管理和编排工具。Docker Swarm 具有易用性和与 Docker 集成度高的优势,可以方便地创建和管理容器集群。此外,Docker 也支持 Kubernetes,使得用户可以将 Docker 容器部署到 Kubernetes 集群中。

5.2 Podman

Podman 并没有自己的原生容器编排工具,但它与 Kubernetes 具有很好的兼容性。通过使用 Podman 生成的 Pod YAML 文件,用户可以将 Podman 容器轻松地部署到 Kubernetes 集群中。这使得 Podman 在容器编排和集群管理方面具有较高的灵活性。

6. 社区支持与发展趋势

6.1 Docker

Docker 拥有庞大的社区支持,包括丰富的文档、教程和第三方工具。这使得 Docker 成为了许多开发者和企业的首选容器平台。然而,近年来,Docker 公司的商业策略和一些竞争对手的崛起,使得 Docker 的发展面临一定的挑战。

6.2 Podman

作为一个相对较新的项目,Podman 的社区规模和资源相对较少。但是,随着 Red Hat 和其他开源社区的支持,Podman 正在迅速发展,并逐渐成为一个有力的竞争者。特别是在安全性和无守护进程架构方面,Podman 显示出了很大的潜力。

7. 适用场景

7.1 Docker

Docker 适用于各种规模的项目,从个人开发者到大型企业都可以受益于其成熟的生态系统和广泛的社区支持。对于那些希望快速上手并享受丰富资源的用户,Docker 是一个很好的选择。

7.2 Podman

Podman 适合关注安全性和资源占用的项目,尤其是在边缘计算和云原生环境中。由于 Podman 支持 rootless 模式和无守护进程架构,它在这些场景下可能比 Docker 更具优势。此外,对于那些希望将容器部署到 Kubernetes 集群的用户,Podman 也是一个不错的选择。

9. 总结

Docker 和 Podman 都是功能强大的容器运行时,各自具有独特的优势。在选择时,您需要根据项目需求、安全性、资源占用、生态系统等因素进行综合考虑。无论选择哪一个,都可以帮助您更高效地开发、部署和管理应用程序。希望本文的深度对比和全方位分析能为您的选择提供有益的参考。


当今的世界是云和容器的世界,基本的基础设施都基本基于云原生和容器。容器的地位凸显了出来,动辄一键上万个容器情况下,安全的问题却常常被忽视。通常情况下容器的编排、配置和参数配置都是出自开发人员之手,这些配置可能没有经过严格的安全审计、没有权限控制,甚至没有标准化,混乱不堪。除了在强力策略和配置管理外,其实借助更好的工具可以帮我们从根源上杜绝很多问题。

在安全容器编排上,就有一个更好的工具Podman可以用来替代Docker从而实现更现代、更标准、更安全的容器云。

概述

容器是一个独立的可执行包,其中包含应用程序运行所需的所有内容,包括代码、运行时、库和系统设置,利用容器我们可以在何时何地都能启动该应用程序,让其以同样方式运行。Java发明时候吹的“一次编译,到处运行”的牛到容器时代才算实现了!

容器很好的解决了不同机器上环境配置差异导致的运行差异的问题,即运行时一致性。

有了容器,咱们再也无需担心Python版本问题,也不用害怕npm黑洞了。

容器体系的核心是容器运行时,容器运行时用来管理和执行容器。比如docker就是一个传统的容器运行时,还有后来从docker中分离出来的containerd和OCI标准的cri-o。

优势

相比较传统的docker运行,Podman的优势明显:

无root架构:Docker运行需要,由宿主机root权限的Docker Daemon监听程序,该监听程序会开放一个对外端口2375,而且默认情况下无需授权的,利用该程序就可以远程任意启动和删除容器。

也可以利用容器逃逸漏洞,获得Docker Daemon权限,从而得到宿主机的root权限。

Podman则使用完全不同的玩法,使用子进程方式,无守护进程,从而也无需root权限。

安全漏洞:Docker中的root访问权限允许它通过读取文件、安装程序、编辑应用程序等来管理容器。然而,这也给系统带来了安全漏洞,使守护进程成为黑客的有吸引力的目标。

黑客目标:如果黑客设法破坏守护进程,就可以获得容器集群中的敏感数据、执行恶意代码、更改容器配置,甚至摧毁容器集群。

使用SELinux增强安全性:与Docker相比,Podman通过使用安全增强型 Linux (SELinux)标签启动每个容器来增强其安全性。

对其他工具的依赖:由于Podman是无root的,因此它不直接管理容器。

但是Podman支持所有OCI的云原生工具和其他工具来进行容器管理:

Systemd:Podman调用配置的容器运行时来创建正在运行的容器。但由于没有专用的守护进程,Podman可以使用systemd来进行更新并保持容器在后台运行。

Buildah:OCI的云原生工具,用于构建与开放容器计划(OCI)兼容的容器。Buildah可以创建和管理容器,而无需安装完整的容器运行时或守护程序。

Skopeo:OCI的云原生工具,Skopeo是一个命令行实用程序,用于使用容器镜像和镜像托管注册表执行各种操作,容器的轻量级解决方案。

所有以上工具各自其职,构成了以Podman为核心的新一代容器系统。

基本设置

Poman安装配置和docker一样也是非常方便容易。

安装

Podman目前支持在Linux、MacOS和Window下安装。

Linux下安装则支持yum、dnf、apt-get、pacman、apk等各发行版对应的包管理器一键安装。在window下的程序使用Podman Windows,容器系统基于WSL。

在MacOS(本文以此为基础环境,下面不在说明)下是基于QEMU容器,安装可使用Homebrew:

brew install podman

初始化

对于MacOS要运行podman需要首先初始化,可使用:

podman machine init

该命令初始化运行容器的新Linux虚拟机。自动生成SSH密钥以访问VM以及与 root帐户的系统连接并添加虚拟机内的用户帐户。

Podman-Compose

Podman-Compose是一个使用Podman运行Docker Compose的脚本,可以使用 brew install podman-compose

针对如下一个Compose配置编排

可以使用podman compose up -d,启动对应的两个数据库容器。

Podman-Desktop

Podman-Desktop为Podman提供类似Docker桌面的体验。安装它使用brew install podman-desktop

例如,可以检查Podman Desktop,查看上一步中创建的的两个镜像和运行的容器:

可以使用podman info验证Podman详细信息验证Podman的安装和配置细节,下面一个例子:

也可以用Podman CLI验证Podman的详细信息、检查其镜像并管理正在运行的容器。

安全性

对给定的三个场景场,三个Linux用户创建的容器。其中左右两边的用户使用podman创建,其容器系统为隔离的无root权限的,这些用户只能访问各自用户命名空间内的资源。该设置增强了安全性,因为它限制每个容器对其自己的命名空间的访问。

而上面的用户用了docker,用类似的命令创建了命令,由于其使用的docker底层使用的Docker Daemon,它拥有有root访问权限,可以查看主机系统上的所有资源,甚至是其名称空间之外的资源。这会带来安全风险,因为会让系统遭受潜在的攻击。相比之下,Podman这种无root架构,限制了对用户自己命名空间的访问,增强了安全性。

总结

在容器云时代,数据隐私和安全至关重要。安全不合规会导致严重后果,轻则导致数据泄露、重则集群沦为肉鸡。Podman以安全编排为基础构建,可以帮助用户实现安全、标准、合规的容器生态。

2024年了请动手更换自己的容器把,别再遗留隐患了。


简介:Podman和Docker都是流行的容器技术,但它们在架构、安全性和功能等方面存在显著的区别。本文将对两者进行比较,帮助读者选择最适合自己需求的容器引擎。

即刻调用文心一言能力

开通百度智能云千帆大模型平台服务自动获取1000000+免费tokens

立即体验

随着云计算和微服务架构的兴起,容器技术已成为现代软件开发和部署的重要组成部分。Podman和Docker作为其中的佼佼者,各自拥有独特的特点和优势。本文将深入探讨Podman和Docker的区别,并为读者提供选择建议。

一、架构差异

Docker是一个守护进程,负责创建和管理容器。它依赖于Linux内核的命名空间和控制组(cgroups)技术来实现容器之间的隔离。而Podman则采用了无守护进程的架构,所有操作都在用户空间中进行,不需要依赖于守护进程。这种架构使得Podman在安全性方面更具优势,因为它能够避免守护进程可能带来的安全风险。

二、安全性比较

Podman允许容器以Rootless特权运行,这意味着容器内的进程没有root权限,从而提高了系统的安全性。相比之下,Docker守护进程拥有root权限,这使得Docker容器可能成为攻击者的目标。因此,Podman在安全性方面表现更佳。

三、镜像管理

Docker使用Docker镜像仓库(Docker Hub)来存储和共享镜像,用户可以从远程仓库拉取镜像并推送自己的镜像。Podman则可以与多种镜像仓库交互,包括Docker Hub。此外,Podman还提供了Buildah工具,用于构建镜像。虽然Docker可以自给自足地构建容器,但Podman的模块化方法使得它在某些场景下更加灵活。

四、易用性和兼容性

Docker作为容器技术的先驱,已经拥有了广泛的用户基础和丰富的生态系统。它提供了丰富的命令行工具和API,使得用户可以轻松地创建、管理和部署容器。Podman也在逐步扩大其用户群体和生态系统,但与Docker相比,它在易用性和兼容性方面可能稍显不足。

五、选择建议

在选择Podman和Docker时,需要根据实际需求和场景进行权衡。对于安全性要求较高的环境,Podman可能是一个更好的选择,因为它能够避免守护进程带来的安全风险。同时,Podman的模块化方法使得它在某些场景下更加灵活。然而,如果你更看重易用性和广泛的生态系统,那么Docker可能更适合你。Docker拥有丰富的命令行工具和API,以及庞大的用户群体和开发者社区,这使得它成为许多企业和开发者的首选。

此外,值得注意的是,Podman和Docker在功能上存在一些重叠,但也有一些独特的特性。例如,Podman支持Rootless容器,这在某些场景下可能非常有用。因此,在选择容器引擎时,还需要根据具体需求考虑这些独特的功能。

总之,Podman和Docker都是优秀的容器引擎,各有特点和优劣。在选择哪一个时,需要综合考虑安全性、易用性、生态系统以及具体需求等因素。希望本文的比较和分析能够帮助读者做出明智的选择。