如何在运行 Amazon Linux 2 x86 的 EC2 实例上安装 Podman 并设置无根容器?

上次更新时间:2020 年 8 月 20 日

我有一个运行 Amazon Linux 2 x86 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。如何安装并设置 Podman 以管理我的容器,而不使用 Docker 工具?

简短描述

Podman 是一种用于在 Linux 上管理容器的开源工具,可代替 Docker 工具。Podman 不需要运行守护程序,并且支持 cgroup V2。有关更多信息,请参阅 podman.IO 网站上的 podman

命令语法与 Docker 工具类似。例如,使用以下命令可启动标准的 hello-world 容器:

$ podman run --rm -it hello-world

解决方法

1.    使用 SSH 连接到 EC2 Linux 实例

2.    禁用 Docker:

$ sudo amazon-linux-extras disable docker

3.    使用 amazon-linux-extras 工具从 kernel-ng 主题安装较新的内核:

$ sudo amazon-linux-extras install kernel-ng

4.    安装 yum 插件并添加 Kubic 项目存储库,以允许访问更新后的 Podman 软件包和依赖项。有关 Kubic 项目中软件包的列表,请参阅 Build.opensuse.org 网站上的上游 github/com/containers 软件包稳定发行版

$ sudo yum check-update

$ sudo yum install -y yum-utils yum-plugin-copr

$ sudo yum-config-manager --add-repo \
   https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_7/devel:kubic:libcontainers:stable.repo
$ sudo yum copr enable -y lsm5/container-selinux

5.    安装 Podman 软件包及其依赖项:

$ sudo yum check-update

$ sudo yum install -y podman

6.    使用 grubby 工具将内核参数添加到 grub 配置中。这些参数会启用 cgroup V2 和用户命名空间:

$ sudo grubby --update-kernel=ALL \
   --args="systemd.unified_cgroup_hierarchy=1 namespace.unpriv_enable=1 user_namespace.enable=1"

7.    启用一系列命名空间。命名空间会将容器映射到容器外的某个非特权用户。

$ echo "user.max_user_namespaces=10000" | sudo tee /etc/sysctl.d/98-userns.conf

8.    将用户的条目添加到 /etc/subuid/etc/subgid 文件。这些条目向非特权用户提供了将在容器中使用的 UID 范围。假设一个用户是 ec2-user

$ echo "$(id -un):100000:65536" | sudo tee -a /etc/subuid
$ echo "$(id -un):100000:65536" | sudo tee -a /etc/subgid

9.    重新启动实例以使用最新的内核。

$ sudo systemctl reboot

10.    使用 SSH 连接到您的实例

11.    验证 Podman 的运行是否正常:

$ podman version
Version:      2.0.2
API Version:  1
Go Version:   go1.13.11
Built:        Thu Jan  1 00:00:00 1970
OS/Arch:      linux/amd64

$ podman run --rm -it hello-world
Trying to pull registry.fedoraproject.org/hello-world...
  manifest unknown: manifest unknown
Trying to pull registry.access.redhat.com/hello-world...
  name unknown: Repo not found
Trying to pull registry.centos.org/hello-world...
  manifest unknown: manifest unknown
Trying to pull docker.io/library/hello-world...
Getting image source signatures
Copying blob 0e03bdcc26d7 done
Copying config bf756fb1ae done
Writing manifest to image destination
Storing signatures

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

前面的示例输出会验证 Podman 安装是否正确并且非特权用户 ec2-user 是否能够启动容器。

13.    (可选)设置一个本地 bash 别名以便为 Docker 使用 Podman:

$ echo "alias docker=podman" >> $HOME/.bashrc
$ source $HOME/.bashrc
$ docker version
Version:      2.0.2
API Version:  1
Go Version:   go1.13.11
Built:        Thu Jan  1 00:00:00 1970
OS/Arch:      linux/amd64

14.    (可选)安装 podman-compose 工具。podman-compose 工具是一个脚本,用于使用 Podman 而不是 Docker 来运行 docker-compose.yml 文件。有关更多信息,请参阅 GitHub 网站上的 podman-compose

要安装 podman-compose 工具,请执行以下操作:

验证您的实例是否已安装 Python3 软件包:

$ sudo yum install -y python3 python3-pip

使用 Python pip 工具在本地安装 podman-compose 工具:

$ pip3 install --user --upgrade PyYAML 
$ pip3 install --user --upgrade podman-compose

您现在可以将 docker-compose.yml 文件与 Podman 结合使用:

$ echo "alias docker-compose=podman-compose" >> $HOME/.bashrc
$ source $HOME/.bashrc

这篇文章对您有帮助吗?


您是否需要账单或技术支持?