如何在CentOS 8.x/RHEL 8.x上设置和使用LXD
如何在CentOS Linux 8.x或者RHEL 8.x(Red Hat Enterprise Linux)上安装,配置和设置LXD(轻量级Linux容器)?
Linux容器提供的环境与您从VM获得的环境尽可能接近,但没有运行单独的Linux内核并模拟所有硬件所带来的开销。
您可以运行自己喜欢的Linux发行版,例如Debian,Ubuntu,Arch,Gentoo,CentOS,Oracle,OpenSUSE等。
LXD不是LXC的重写。
在幕后,LXD通过liblxc及其Go绑定使用LXC。
本教程向您展示如何在CentOS 8.x云服务器和基于RHEL 8.x的计算机上设置和使用LXD。
更新RHEL/CentOS 8.x服务器
执行以下yum命令:
$ sudo yum update ## reboot Linux box if kernel updated ## $ sudo reboot
有关更多信息,请参见如何在CentOS 8和RHEL 8上更新和安装软件包以确保安全。
启用和配置EPEL存储库
运行以下命令以在CentOS Linux 8.x上启用和安装EPEL存储库:
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm $ sudo yum update
有关更多信息,请参见如何在RHEL 8.x上安装EPEL Repo。
在CentOS/RHEL 8上安装snapd
现在启用了EPEL repo,现在该安装snapd了。
我们将使用snap命令在CentOS/RHEL 8上安装LXD。
因此,我们必须安装EPEL存储库中的snapd。
搜索snapd
使用以下任一yum命令/dnf命令:
$ 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命令启用经典快照支持:
$ sudo ln -s /var/lib/snapd/snap /snap
接下来,使用systemctl命令激活并启用snapd.socket服务:
$ sudo systemctl enable --now snapd.socket
验证snapd.socket和服务是否正在运行:
$ sudo systemctl status snapd.socket $ sudo systemctl status snapd.service
如果snapd.service没有运行它,请执行以下命令:
$ sudo systemctl enable snapd.service $ sudo systemctl start snapd.service
(可选)您可以重新引导服务器并在安装LXD之前验证这两项服务是否联机:
sudo reboot
在CentOS 8.x或者RHEL 8.x上安装LXD
现在一切都已正确设置并运行,现在是时候使用snap命令安装LXD了:
$ sudo snap install lxd
在CentOS/RHEL 8.x服务器上安装LXD
配置LXD服务器
您无需root用户帐户即可管理和使用LXD。
避免一直使用root用户是一种很好的安全措施。
您要做的就是将admin用户帐户(例如Hyman)添加到lxd组。
将现有用户添加到Linux组的命令如下:
$ sudo usermod -a -G lxd Hyman
使用id命令验证它:
$ newgrp lxd $ id
确保Hyman用户可以与我们的lxd服务器对话:
$ lxc list
指示用户Hyman可以与我们的LXD服务器对话的输出示例:
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
请注意,默认情况下未在CentOS/RHEL 8.x服务器上安装Btrfs或者ZFS文件系统软件包。
因此,将LVM用作所有容器的后端存储:
Firewalld允许通过lxdbr0进入竞争
我们为您的CentOS 8设置了防火墙,并通过firewall-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:
列出所有图片
当然,您也可以使用grep命令/egrep命令来过滤出镜像:
$ lxc image list images: | grep -i centos $ lxc image list images: | egrep -i 'ubuntu|debian'
如何使用LXD创建和设置您的第一个容器
要从镜像创建和启动容器,请使用launch命令,如下所示:
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 | +-------------+---------+-----------------------+------+-----------+-----------+
要启动/停止/重新启动容器,请使用:
$ 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
以在centos-c7中以Hyman用户身份运行命令:
$ lxc exec centos-c7 --user Hyman -- command1 $ lxc exec centos-c7 --user www-data -- my-app-server --debug
获得root shell:
$ lxc exec container sh $ lxc exec centos-db sh $ lxc exec ubuntu-www1 bash
如何设置firewall-cmd规则以重定向流量
现在,基于LXD的容器和服务正在运行。
您如何到达外界的内部容器?
您有两种选择:
- 使用反向代理服务器,例如Nginx
- 设置防火墙规则以将端口重定向到容器
示例(主机上的类型)
查找默认区域:
$ sudo firewall-cmd --get-default-zone `public`
为公共区域打开端口443
$ sudo firewall-cmd --zone=public --add-service=https --permanent
将端口443转发到LXD服务器10.187.112.125:443
$ 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