如何在 CentOS 8.x / RHEL 8.x 上设置和使用 LXD
Linux 容器提供的环境尽可能接近您从 VM 获得的环境,但没有运行单独的 Linux 内核和模拟所有硬件所带来的开销。您可以运行您最喜欢的 Linux 发行版,如 Debian、Ubuntu、Arch、Gentoo、CentOS、Oracle、OpenSUSE 等。LXD 是 lxc 的强化版,具有强大的安全性。LXD 不是 LXC 的重写。在底层,LXD 通过 liblxc 及其 Go 绑定使用 LXC。本教程向您展示如何在 CentOS 8.x 云服务器和基于 RHEL 8.x 的机器上设置和使用 LXD。
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 是的 |
要求 | CentOS/RHEL |
操作系统兼容性 | Alma • CentOS • RHEL • Rocky • Stream |
预计阅读时间 | 8 分钟 |
更新 RHEL/CentOS 8.x 服务器
执行以下yum 命令:有关更多信息,
请参阅如何在CentOS 8和RHEL 8上更新和安装安全软件包。
$ sudo yum update
## reboot Linux box if kernel updated ##
$ sudo reboot
启用并配置 EPEL 仓库
运行以下命令在 CentOS Linux 8.x 上启用并安装 EPEL repo:有关更多信息,
请参阅“如何在 RHEL 8.x 上安装 EPEL Repo ”。
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ sudo yum update
在 CentOS / RHEL 8 上安装 snapd
现在 EPEL repo 已启用,是时候安装 snapd 了。我们将使用 snap 命令在 CentOS / RHEL 8 上安装 LXD。因此,我们必须从 EPEL repo 安装 snapd。
搜索 snapd
使用以下任何一个yum 命令/dnf 命令:
我们可以通过执行以下命令获取有关 snapd 包的详细信息:
输出:
$ sudo yum search snapd
$ sudo yum list snapd
$ sudo yum info snapd
Last metadata expiration check: 0:23:43 ago on Sunday 01 March 2020 11:21:36 AM UTC. Available Packages Name : snapd Version : 2.42.2 Release : 1.el8 Architecture : x86_64 Size : 18 M Source : snapd-2.42.2-1.el8.src.rpm Repository : epel Summary : A transactional software package manager URL : https://github.com/snapcore/snapd License : GPLv3 Description : Snappy is a modern, cross-distribution, transactional package : manager designed for working with self-contained, immutable : packages.
为 Linux 容器启用并增加用户命名空间
我们需要使用 grubby 命令来配置引导加载程序和 Linux 内核启动时选项,例如用户命名空间:
$ sudo grubby --args="namespace.unpriv_enable=1" --update-kernel="$(grubby --default-kernel)"
确保2147483647根据需要在以下示例中进行替换。换句话说,更高的数字有助于运行更多 Linux 容器:
$ sudo sh -c 'echo "user.max_user_namespaces=2147483647" >> /etc/sysctl.d/99-userns.conf'
重新启动 Linux 系统,运行:
$ sudo shutdown -r now
或者
$ sudo reboot
重新启动后,通过键入以下cat 命令验证命名空间是否已启用并处于活动状态:
$ cat /proc/cmdline
示例输出:
BOOT_IMAGE=(hd0)/boot/vmlinuz-4.18.0-147.5.1.el8_1.x86_64 root=/dev/sda namespace.unpriv_enable=1 ro console=ttyS0,19200n8 net.ifnames=0 crashkernel=auto rhgb
安装 snapd
让我们安装 snapd,运行:
$ sudo yum install snapd
确保使用 ln 命令启用经典 snap 支持:
$ sudo ln -s /var/lib/snapd/snap /snap
接下来,使用 systemctl 命令激活并启用 snapd.socket 服务:
$ sudo systemctl enable --now snapd.socket
验证 snapd.socket 和服务是否正在运行:
如果 snapd.service 没有运行,请键入以下命令:
您可以选择重新启动服务器并在安装 LXD 之前验证这两个服务是否上线:
$ sudo systemctl status snapd.socket
$ sudo systemctl status snapd.service
$ sudo systemctl enable snapd.service
$ sudo systemctl start snapd.service
$ sudo reboot
在 CentOS 8.x 或 RHEL 8.x 上安装 LXD
现在一切都已设置并正确运行,是时候使用 snap 命令安装 LXD 了:
$ sudo snap install lxd
在 CentOS / RHEL 8.x 服务器上安装 LXD
配置 LXD 服务器
您无需 root 用户帐户即可管理和使用 LXD。避免一直使用 root 是一种很好的安全做法。您所要做的就是将管理员用户帐户(例如 vivek)添加到 lxd 组。将现有用户添加到 Linux 组的命令如下:使用id 命令和 newgrp 命令
$ sudo usermod -a -G lxd vivek
进行验证:
确保“vivek”用户可以与我们的 lxd 服务器通信:
示例输出表明用户 vivek 可以与我们的 LXD 服务器通信:
$ newgrp lxd
$ id
$ lxc list
If this is your first time running LXD on this machine, you should also run: lxd init
To start your first instance, try: lxc launch ubuntu:18.04
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+
最后,我们需要在 CentOS/RHEL 8 上配置 LXD,运行:
$ lxd init
请注意,Btrfs 或 ZFS 文件系统包在 CentOS/RHEL 8.x 服务器上默认未安装。因此,请使用 LVM 作为所有容器的后端存储:
Firewalld 允许通过 lxdbr0 传入连接
我们为您的 CentOS 8 设置防火墙,并借助防火墙-cmd 命令进行管理。让我们列出所有活动区域:
$ sudo firewall-cmd --get-active-zones
如果未列出 lxdbr0,请将其添加到受信任区域,以便连接通过。换句话说,允许所有通过 lxdbr0 的传入流量:
$ sudo firewall-cmd --add-interface=lxdbr0 --zone=trusted
验证它:
$ sudo firewall-cmd --get-active-zones
示例输出:
public interfaces: eth0 trusted interfaces: lxdbr0
有关更多信息,请参阅“如何在 RHEL 8 上使用 FirewallD 设置防火墙”。
创建并启动您的第一个容器
您可以使用以下命令列出所有容器映像:
$ lxc image list images:
列出所有图像
$ lxc image list images: | grep -i centos
$ lxc image list images: | egrep -i 'ubuntu|debian'
如何使用 LXD 创建并设置你的第一个容器
要从图像创建和启动容器,请使用启动命令,如下所示:
lxc launch images:{distro}/{version}/{arch} {container-name-here}
让我们看一些示例,根据您的需要从各种 Linux 发行版图像创建和启动容器。
CentOS Linux 6/7/8 容器
$ lxc launch images:centos/6/amd64 cenots-c6
$ lxc launch images:centos/7/amd64 cenots-c7
$ lxc launch images:centos/8/amd64 cenots-db
Debian Linux 18.4 LTS
$ lxc launch images:ubuntu/18.04/amd64 ubuntu-www1
Fedora Linux 31
$ lxc launch images:fedora/31/amd64 fedora31-c1
好的,我已经在 CentOS/RHEL 8.x 上设置并使用 LXD,下一步做什么?
列出您的容器:
$ lxc list
示例输出:
+-------------+---------+-----------------------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-------------+---------+-----------------------+------+-----------+-----------+ | cenots-c6 | RUNNING | 10.187.112.165 (eth0) | | CONTAINER | 0 | +-------------+---------+-----------------------+------+-----------+-----------+ | cenots-c7 | RUNNING | 10.187.112.26 (eth0) | | CONTAINER | 0 | +-------------+---------+-----------------------+------+-----------+-----------+ | cenots-db | RUNNING | 10.187.112.118 (eth0) | | CONTAINER | 0 | +-------------+---------+-----------------------+------+-----------+-----------+ | fedora31-c1 | RUNNING | 10.187.112.226 (eth0) | | CONTAINER | 0 | +-------------+---------+-----------------------+------+-----------+-----------+ | ubuntu-www1 | RUNNING | 10.187.112.125 (eth0) | | CONTAINER | 0 | +-------------+---------+-----------------------+------+-----------+-----------+
要启动/停止/重新启动容器,请使用:
移除或删除容器
获取有关容器的信息:
在实例/容器中执行命令:
传递以在 centos-c7 中以 vivek 用户身份运行命令:
获取 root shell:
$ lxc start container-name
$ lxc stop container-name
$ lxc restart container-name
$ lxc restart ubuntu-www1
$ lxc delete container-name
## stop and delete container named fedora31-c1 ##
$ lxc stop fedora31-c1
$ lxc delete fedora31-c1
$ lxc info container
$ lxc info centos-db
$ lxc exec container command
$ lxc exec ubuntu-www1 ls /
$ lxc exec ubuntu-www1 -- apt -y update
$ lxc exec ubuntu-www1 -- apt-get -y upgrade
$ lxc exec cenots-db -- yum -y update
--user
$ lxc exec centos-c7 --user vivek -- command1
$ lxc exec centos-c7 --user www-data -- my-app-server --debug
$ lxc exec container sh
$ lxc exec centos-db sh
$ lxc exec ubuntu-www1 bash
如何设置防火墙命令规则来重定向流量
现在基于 LXD 的容器和服务正在运行。如何从外部世界访问内部容器?您有两种选择:
- 使用反向代理服务器,例如 Nginx
- 设置防火墙规则将端口重定向到容器
示例(在主机上输入)
查找默认区域:
为公共区域打开端口 443
将端口 443 转发到 LXD 服务器 10.187.112.125:443
重新加载防火墙:
测试它。启动 Web 浏览器并根据您的设置输入 URL:
$ sudo firewall-cmd --get-default-zone
public
$ sudo firewall-cmd --zone=public --add-service=https --permanent
$ sudo firewall-cmd --permanent --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=10.187.112.125
$ sudo firewall-cmd --reload
https://your-ip-here
https://your-domain-here
结论
我们刚刚学习并在 CentOS 8.x 机器上部署了 LXD,并在 RHEL 8.x 服务器上部署了 LXD。现在,您可以将容器用作与主主机隔离的独立监狱或应用服务器。您可以使用防火墙将流量重定向到容器 TCP/UDP 端口。有关更多信息,请参阅此处和此处的官方项目主页。
- 在 Ubuntu 16.04 LTS 上安装 LXD 容器管理程序
- 如何在 Fedora Linux 26 上安装和设置 LXC(Linux 容器)
- 在KVM或Xen虚拟机下设置LXD容器
- 列出 LXD(Linux 容器)中的 VM 映像
- 升级由 Ubuntu/Debian 或 CentOS Linux 驱动的 LXD 容器
- 在 Linux 启动时自动启动 LXD 容器
- 重命名 LXD / LXC 容器的命令
- 在配置启动时在 Linux 容器 (LXD) 实例上运行命令
- 在云实例启动时,使用 shell 脚本中的 LXD(Linux 容器)创建 VM
- 将 LXD VM 移动/迁移到 Linux 上的另一台主机
- Fedora 安装并设置 LXD
- CentOS 7.x 安装并设置 LXD 服务器
- 在 Ubuntu 18.04 LTS 上安装 LXD 纯容器管理程序
- 使用 lxc 命令为 LXD 创建快照
- 在 CentOS/RHEL 8 上设置并安装 LXD
- Ubuntu 20.04 LTS 安装并设置 LXD
- 完整备份和恢复 LXD 容器
- 禁用 LXD 桥上的防火墙和 NAT 规则
- 使用 lxc 删除或移除 LXD 容器
- Linux 文件系统错误:事务失败解决方案
- Ubuntu 22.04 LTS 设置 LXD
- Debian 11 设置 LXD