无论您对容器感兴趣是因为工作需要、未来的工作机会,还是仅仅出于对新技术的兴趣,即使对于经验丰富的系统管理员来说,容器也可能显得非常复杂。那么,您实际上是如何开始使用容器的呢?从容器到 Kubernetes 的路径是什么?此外,为什么会存在从一个到另一个的路径呢?正如您可能预料的那样,最好的起点是从头开始。
1. 理解容器
再想一想,从头开始可以说可以追溯到早期的 BSD 及其特殊的 chroot 监狱,所以跳到中间部分吧。
不久前,Linux 内核引入了 cgroups,它使您能够用称为命名空间的东西“标记”进程。当您将进程分组到一个命名空间中时,这些进程的表现就好像该命名空间之外不存在任何东西一样。这就像您将这些进程放入某种容器中。当然,容器是虚拟的,它存在于您的计算机内部。它与操作系统的其余部分运行在相同的内核、RAM 和 CPU 上,但您已经包含了这些进程。
预制容器的发行版只包含运行其包含的应用程序所必需的内容。借助容器引擎,例如 Podman、Docker 或 CRI-O,您可以运行容器化的应用程序,而无需以任何传统意义上的方式安装它。容器引擎通常是跨平台的,因此即使容器运行的是 Linux,您也可以在 Linux、macOS 或 Windows 上启动容器。
更重要的是,当对同一应用程序的需求很高时,您可以运行同一应用程序的多个容器。
现在您已经了解了什么是容器。下一步是运行一个容器。
[ 获取速查表: pod、集群和容器之间有什么区别? ]
2. 运行容器
在运行容器之前,您应该有一个运行容器的理由。您可以编造一个理由,但这个理由最好能引起您的兴趣,这样您就会受到启发实际使用您运行的容器。毕竟,运行一个容器但从不使用它提供的应用程序只能证明您没有注意到任何故障,而使用容器则证明它有效。
我推荐 WordPress 作为入门。它是一个流行的 Web 应用程序,易于使用,因此您可以在容器运行后试用该应用程序。虽然您可以轻松设置 WordPress 容器,但有很多配置选项,这可以引导您发现更多容器选项(例如运行数据库容器)以及容器如何通信。
我使用 Podman,它是一个友好、方便且无守护进程的容器引擎。如果您没有 Podman,可以使用 Docker 命令代替。两者都是很棒的开源容器引擎,它们的语法是相同的(只需输入 docker
而不是 podman
)。由于 Podman 不运行守护进程,因此它比 Docker 需要更多设置,但运行无根无守护进程容器的能力是值得的。
如果您要使用 Docker,您可以跳到 WordPress 子标题。否则,打开终端安装和配置 Podman
$ sudo dnf install podman
容器会产生许多进程,通常只有 root 用户才有权创建数千个进程 ID。通过创建一个名为 /etc/subuid
的文件,并定义一个适当高的起始 UID 和一个适当大的允许 PID 数量,为您的用户添加一些额外的进程 ID
seth:200000:165536
对您组中的文件 /etc/subgid
执行相同的操作。在本例中,我的主组是 staff
(对于您来说可能是 users
,或者与您的用户名相同,具体取决于您如何配置系统。)
staff:200000:165536
最后,确认您的用户也被允许管理数千个命名空间
$ sysctl --all --pattern user_namespaces
user.max_user_namespaces = 28633
如果您的用户没有管理至少 28,000 个命名空间的权限,请通过创建文件 /etc/sysctl.d/userns.conf
并输入来增加数量
user.max_user_namespaces=28633
以容器形式运行 WordPress
现在,无论您使用 Podman 还是 Docker,您都可以从在线容器注册表中拉取 WordPress 容器并运行它。您可以使用单个 Podman 命令完成所有这些操作
$ podman run --name mypress \
-p 8080:80 -d wordpress
给 Podman 一点时间来查找容器,从互联网复制它并启动它。
在您获得终端提示后启动 Web 浏览器,并导航到 localhost:8080
。WordPress 正在运行,等待您进行设置。

(Seth Kenlon,CC BY-SA 4.0)
不过,很快就会遇到下一个障碍。WordPress 使用数据库来跟踪数据,因此您需要为其提供一个数据库来存储其信息。
在继续之前,停止并删除 WordPress 容器
$ podman stop mypress
$ podman rm mypress
3. 在 pod 中运行容器
容器在设计上并且顾名思义是自包含的。在容器中运行的应用程序不应与其容器外部的应用程序或基础设施交互。因此,当一个容器需要另一个容器才能运行时,一种解决方案是将这两个容器放入一个更大的容器中,称为 pod。pod 确保其容器可以共享重要的命名空间以相互通信。
创建一个新的 pod,提供 pod 的名称以及您想要能够访问的端口
$ podman pod create \
--name wp_pod \
--publish 8080:80
确认 pod 存在
$ podman pod list
POD ID NAME STATUS INFRA ID # OF CONTAINERS
100e138a29bd wp_pod Created 22ace92df3ef 1
向 pod 添加容器
现在您已经为您的相互依赖的容器创建了一个 pod,您可以通过指定 pod 来在其中运行每个容器。
首先,启动一个数据库。您可以编造自己的凭据,只要您在从 WordPress 连接到数据库时使用相同的凭据即可。
$ podman run --detach \
--pod wp_pod \
--restart=always \
-e MYSQL_ROOT_PASSWORD="badpassword0" \
-e MYSQL_DATABASE="wp_db" \
-e MYSQL_USER="tux" \
-e MYSQL_PASSWORD="badpassword1" \
--name=wp_db mariadb
接下来,将 WordPress 容器启动到同一个 pod 中
$ podman run --detach \
--restart=always --pod=wp_pod \
-e WORDPRESS_DB_NAME="wp_db" \
-e WORDPRESS_DB_USER="tux" \
-e WORDPRESS_DB_PASSWORD="badpassword1" \
-e WORDPRESS_DB_HOST="127.0.0.1" \
--name mypress wordpress
现在启动您最喜欢的 Web 浏览器并导航到 localhost:8080
。
这一次,设置按预期进行。WordPress 连接到数据库,因为您在启动容器时传递了这些环境变量。

(Seth Kenlon,CC BY-SA 4.0)
创建用户帐户后,您可以登录以查看 WordPress 仪表板。

(Seth Kenlon,CC BY-SA 4.0)
下一步
您已经创建了两个容器,并且已在 pod 中运行它们。现在您已经掌握了足够的知识来在您自己的服务器上运行容器中的服务。如果您想迁移到云端,容器当然非常适合。借助 Kubernetes 和 OpenShift 等工具,您可以自动化在集群上启动容器和 pod 的过程。如果您正在考虑采取下一步,请阅读 Kevin Casey 的开始使用 Kubernetes 的 3 种方法,并尝试他提到的 Minikube 教程。
1 条评论