如何在5分钟内搭建起容器实验室?

容器是如今IT界的一个重要组成部分,而家庭实验室是开始使用容器的好方法。

作者:Damon Garn(Red Hat)和Seth Kenlon(Red Hat) 编译:沈建苗

家庭实验室是学习和试用新技术的好方法。Enale Sysadmin此前刊发过多篇文章,介绍通过脚本和Ansible使用虚拟机部署家庭实验室,包括Alex Callejas撰写的《使用三个简单命令,在5分钟内搭建起实验室》(https://www.redhat.com/sysadmin/build-lab-quickly)和Ricardo Girardi撰写的《使用Ansible,在36秒内搭建起实验室》(https://www.redhat.com/sysadmin/build-VM-fast-ansible)。您可以用容器做类似的事情。

容器是如今IT界的一个重要组成部分,在家庭实验室环境中很容易开始使用容器。您可能有一个小项目需要几个基本容器来完成一些简单任务。

在这个示例项目中,您将学到如何快速部署Linux环境,学生可以使用这类环境完成简单的专项实验室活动。具体来说,参与者需要使用Nano编辑器(https://www.redhat.com/sysadmin/getting-started-nano)来处理文件。虚拟机足以胜任,但学生们还是应该尽早了解容器。

选择一种容器平台

Podman(http://podman.io/)是一种灵活的现代容器环境,因此首先在您的主机上安装Podman。视主机发行版而定,一些步骤可能略有不同,但在Fedora、CentOS Stream和 Red Hat Enterprise Linux(RHEL)上很简单,只需执行这个命令:

$ sudo dnf install podman

启用无根容器

默认情况下,您需要管理员权限才能使用Podman运行容器。这是为拥有无守护进程的容器引擎付出代价的一部分,但这绝不是永久性的限制。

使用usermod命令,将一系列用户和用户组ID添加到您的用户帐户:

$ sudo usermod \
--add-subuids 200000-215000 \
--add-subgids 200000-215000 \
$USER

您还应该验证用户有权访问几千个命名空间:

$ sysctl --all --pattern user_namespaces
user.max_user_namespaces = 28633

如果您的发行版没有该属性,或者将其设置得很低,可以创建它,只需将该文本输入到文件/etc/sysctl.d/userns.conf

user.max_user_namespaces=28633

然后加载该设置:

$ sudo sysctl -p /etc/sysctl.d/userns.conf

我更喜欢在这番配置后重新启动,确保针对用户的更改和针对内核参数的更改都已加载。

重新启动后,试着使用Podman运行RHEL通用基础镜像(UBI):

$ podman run ubi8/ubi cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="8.5 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.5"
PLATFORM_ID="platform:el8"
[...]

创建Dockerfile

现在您可以创建一个Dockerfile来指定如何构建新的容器镜像。首先,为您的Dockerfile文件创建一个目录:

$ mkdir ~/mycontainer
$ cd !$

创建一个含有以下内容的文件,在Nano文本编辑器安装的情况下,构建基于UBI的镜像:

FROM ubi8/ubi:latest
RUN dnf install -y nano

构建镜像:

$ podman build --tag rhel-with-nano .

注意不要漏掉代表构建过程中“此处”的末尾那个点。

确认镜像已创建:

$ podman images

现在您可以运行容器了。先在原始的UBI镜像上运行命令以创建基准:

$ podman run ubi8/ubi which nano
which: no nano in (/usr/local/sbin:...

默认情况下,Nano文本编辑器未安装在UBI中。

现在在您的自定义容器中运行同一个命令:

$ podman run rhel-with-nano which nano/usr/bin/nano

Nano现已安装在自定义容器中。

您还能以交互方式运行容器:

$ podman run -it rhel-with-nano
[root@be54cb4780a1 /]# ls
bin   dev  home  lib64      media  opt   root sbin  sys  usr
boot  etc  lib lost+found  mnt    proc  run srv   tmp  var

您可以切换到不同的终端选项卡或打开新的终端,查看有关运行中容器的一些基本信息。

$ docker ps

输入exit以关闭容器。

试着采用同一个过程来构建和运行Fedora容器镜像,以加深对这些步骤的了解。现在您已安装了Podman,这个过程就像提取现有镜像或构建自己的镜像一样简单。

存储

使用容器的新用户常感到困惑的一点是容器的短暂性。容器被明确设计为一次性环境。比如说,启动自定义镜像的实例,并在主目录中创建并保存文件。以交互方式执行该操作,以便您能确认您的操作指令得到了遵循:

$ podman run -it rhel-with-nano
[root@8b0929c40fb9 /]# cd home/
[root@8b0929c40fb9 home]# ls
[root@8b0929c40fb9 home]# touch test.txt
[root@8b0929c40fb9 home]# ls
test.txt
[root@8b0929c40fb9 home]# exit

您创建了一个名为test.txt的文件,并确认它已创建好。但您退出了容器,导致它停止运行。启动一个新容器,寻找您的文件:

$ podman run -it rhel-with-nano
[root@ed75875cfa3d /]# ls home/
[root@ed75875cfa3d /]# exit

如果您需要持久性存储,可以创建本地目录,并将它作为容器的挂载选项来绑定。先创建存储目录:

$ mkdir data

然后启动您的容器,使用存储目录作为某个相关挂载点。该示例将本地目录绑定到名为/storage的位置,但您可以将它绑定到/opt/home或所需的任何目录。

您必须往目录位置追加:Z(冒号和大写Z),那样SELinux可以在您的主机与Podman之间转换上下文。

$ podman run -it --volume ./data:/storage:Z rhel-with-nano
[root@c0c2fbdc7145 /]# ls
bin   dev  home  lib64      media  opt   root sbin  storage sys
boot  etc  lib lost+found  mnt    proc  run srv   tmp  usr var
[root@c0c2fbdc7145 /]# touch /storage/test.txt
[root@c0c2fbdc7145 /]# exit

您在容器的/storage目录中创建和保存的任何数据都保存到持久性data位置,然后可以从使用该卷进行存储的任何容器再次访问。

使用现有镜像

到目前为止,您已部署了两个带本地应用程序的简单容器。容器还能做什么? 答案似乎是几乎无所不能。

多年前,有一款名为Nethack的出色游戏。按今天的标准来看,Nethack根本称不上处于游戏技术的前沿,但它很有趣。事实证明,有一个预构建的Nethack镜像(https://github.com/matsuu/docker-nethack)。

$ podman pull matsuu/nethack
$ podman run -it matsuu/nethack

图1. 无论Nethack是不是在容器中运行,您都要当心穴居人(Wintersfury the Troglodyte)。

没有什么比使用现代技术玩30年前的款游戏更酷的了。

考虑部署一台基于容器的Web服务器(比如Apache),处理与如今的系统管理任务更密切相关的事务。

结语

这个过程大约需要5分钟的时间来配置,简单地介绍了使用容器作为Vim、Nano和Apache(以及Nethack!)等工具的实验室环境。如果您掌握了这些基本知识,并探究 Dockerhub,就能研究您可以在基于容器的实验室环境中开始学习另外哪些有用的技术。不妨考虑Podman、Python、MariaDB,或自行创建独特的东西。

文章来源:https://www.redhat.com/sysadmin/build-container-lab-quickly

K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址