在CentOS 8上使用LXC / LXD运行Linux容器

“这不是我们所说的祝福,而是我们如何使用它们是对我们感恩的真正衡量。”-WT Purkiser

揭开LXC的神秘面纱

Linux容器项目(LXC)是一个开源容器平台,提供了一组工具,模板,库和语言绑定。它提供了一个包含完整Linux系统(例如VM)的容器,该系统具有自己的文件系统,网络和多个应用程序。 LXC具有简单的命令行界面,可增强启动容器时的用户体验(RedHat,2020年)。强大的API和简单的工具使Linux用户可以轻松创建和管理系统或应用程序容器。在进行容器化之前,Docker是在LXC之上构建的,但是此后已经进行了容器化。

LXC的功能

当今的LXC使用以下内核功能来包含进程:资料来源:LinuxContainers

  • 内核名称空间(ipc,uts,mount,pid,网络,用户)
  • Apparmor和SELinux配置文件
  • 安全策略
  • chroot(使用pivot_root)
  • 内核功能
  • CGroups(对照组)

揭开LXD的神秘面纱

LXD是下一代系统容器管理器。这是用于管理LXC系统容器的出色界面,不应将其误认为平台或容器类型。 LXD功能包括快照和图像控制。可以想象,LXD增强了LXC技术的功能。它提供了类似于虚拟机的用户体验,但是使用了Linux容器。

LXD功能来源:LinuxContainers

LXD的一些最大功能是:

  • 通过设计进行安全保护(无特权的容器,资源限制等)
  • 可扩展(从便携式计算机上的容器到数千个计算节点)
  • 直观(简单明了的API和清晰的命令行体验)
  • 基于映像(使用每天发布的各种Linux发行版)
  • 支持跨主机的容器和图像传输(包括使用CRIU的实时迁移)
  • 高级资源控制(CPU,内存,网络I / O,块I / O,磁盘使用率,内核资源)
  • 设备直通(USB,GPU,UNIX字符和块设备,NIC,磁盘,路径)
  • 网络管理(构建和配置网桥,跨主机隧道等)
  • 存储管理(支持多个存储后端,存储池和存储卷)

在CentOS8上安装LXC / LXD

如果您想在CentOS8服务器上尝试LXC / LXD并运行某些应用程序,以下步骤将帮助您尽快启动并运行该平台。

步骤1:更新并准备服务器

这是非常重要的一步,您可以通过安装最新的补丁程序和软件包来确保自己的家设备齐全。通过运行以下命令来准备服务器:

sudo dnf update -y && sudo dnf upgrade -y
sudo dnf install -y vim curl nano 

禁用SELinux

如果您擅长管理SELinux上下文,那么这是一个可选步骤。要使其可接受,请运行以下命令

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

步骤2:启用并配置EPEL存储库

运行以下命令以在CentOS 8上安装并启用EPEL存储库,并更新服务器以从Epel获取最新软件包。

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo dnf update

步骤3:在CentOS 8上安装快照

此安装程序将安装Snappy的LXD软件包,以简化并支持Snap软件包。因此,您需要按以下步骤在服务器上安装snapd:

sudo yum install snapd -y

安装完成后,您需要启用管理主快照通讯插槽的systemd单元。

sudo systemctl enable --now snapd.socket

要启用传统的快照支持,请输入以下内容在/ var / lib / snapd / snap和/ snap之间创建符号链接:

sudo ln -s /var/lib/snapd/snap /snap

注销并重新登录,或重新启动系统,并确保正确更新了快照路径。快速安装完成后,请继续下一步。

步骤4:添加内核参数

您需要在服务器上启用LXD的一些重要内核选项。在终端中运行以下命令进行配置。..

$ sudo su -

# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# grubby --args="namespace.unpriv_enable=1" --update-kernel="$(grubby --default-kernel)"
# echo "user.max_user_namespaces=3883" | sudo tee -a /etc/sysctl.d/99-userns.conf

配置这些设置后,内核的核心功能已更改,您将需要重新启动服务器。重新启动服务器。

sudo reboot

步骤5:在CentOS 8上安装lxd snap

最后,备份服务器后,从Snap存储中删除已安装的软件包LXD。 这与创建Snap一样简单,但是只需运行以下命令即可安装LXD。

$ sudo snap install --classic lxd

步骤6:启动测试LXD容器

到目前为止,已经安装了LXC / LXD,但是仍然没有容器可以容纳要部署的应用程序。因此,在启动某些容器之前,请将用户帐户添加到组lxd中,以便您可以在没有权限限制的情况下管理LXD容器。

sudo usermod -aG lxd <your-username>
newgrp lxd

注意: 该· newgrp 该命令用于在登录会话期间更改当前组ID。可选的–标志重新初始化用户的环境,就像用户登录一样。如果未指定,则当前环境(包括当前工作目录)不变。 newgrp将当前的实际组ID更改为命名组。

然后配置LXD环境或运行以下命令以对其进行“初始化”。回答几个问题。请根据您的环境需要回答。我将默认值用于空白值。

$ lxd init

Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, dir, lvm, ceph) [default=btrfs]: lvm
Create a new LVM pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=9GB]: 5GB
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

上面的命令创建了一个桥梁 lxdbr0..将此网桥接口添加到可信区域,以允许连接通过。换句话说,我们允许所有传入的流量通过 lxdbr0..运行以下防火墙命令

sudo firewall-cmd --add-interface=lxdbr0 --zone=trusted --permanent
sudo firewall-cmd --reload

创建一个容器

初始化lxd并授权用户启动和管理容器后, x 让我们创建命令和容器。您可以使用以下语法作为指导。

lxc launch images:[distro]/[version]/[architecture] [your-container-name]

这给了我足够的知识。毫不费力地运行以下命令来创建CentOS 8和Ubuntu 20.04容器进行测试。

$ lxc launch images:centos/8/amd64 cent8

Creating cent8
Retrieving image: Unpack: 100% (4.22GB/s)
Starting cent8

通过执行以下操作启动Ubuntu容器:

$ lxc launch ubuntu:20.04 ubuntu20

Creating ubuntu20
Starting ubuntu20

一旦启动它们,您可以轻松地列出容器,如下所示:

$ lxc list

+-------+---------+---------------------+-----------------------------------------------+-----------+-----------+
| NAME  |  STATE  |        IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-------+---------+---------------------+-----------------------------------------------+-----------+-----------+
| cent8 | RUNNING | 10.80.35.177 (eth0) | fd42:b3a2:efa8:5aa5:216:3eff:fe1d:38c3 (eth0) | CONTAINER | 0         |
+-------+---------+---------------------+-----------------------------------------------+-----------+-----------+

您还可以停止,启动,重新启动,删除和查看有关容器的详细信息,如下所示:这里,是lxclist命令中显示的容器的名称。

lxc start <container>
lxc stop <container>
lxc restart <container>
lxc delete <container>

例如

lxc stop ubuntu20
lxc delete ubuntu20

请注意,您需要先停止正在运行的容器,然后才能将其删除。

使用info命令选项获取有关容器的信息

$ lxc info container

##For example
$ lxc info cent8

出色的输出样本:

Name: cent8
Location: none
Remote: unix://
Architecture: x86_64
Created: 2020/11/07 11:25 UTC
Status: Running
Type: container
Profiles: default
Pid: 2724
Ips:
  eth0: inet    10.80.35.177    veth975e84ff
  eth0: inet6   fd42:b3a2:efa8:5aa5:216:3eff:fe1d:38c3  veth975e84ff
  eth0: inet6   fe80::216:3eff:fe1d:38c3        veth975e84ff        
  lo:   inet    127.0.0.1
  lo:   inet6   ::1
Resources:
  Processes: 13
  Disk usage:
    root: 737.98MB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 93.32MB
    Memory (peak): 98.56MB
  Network usage:
    eth0:
      Bytes received: 3.57kB
      Bytes sent: 2.22kB
      Packets received: 30
      Packets sent: 22
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

步骤7:在容器上运行ad hoc命令。

就像你可以的方式执行您还可以通过在Docker容器中添加“”来在lxd容器中执行命令。语法就是这样。

$ lxc exec <container-name> <command>

以下是执行命令的示例。

$ lxc exec cent8 -- yum -y update

CentOS-8 - AppStream                                                                                  538 kB/s | 5.8 MB     00:11    
CentOS-8 - Base                                                                                       619 kB/s | 2.2 MB     00:03    
CentOS-8 - Extras                                                                                     8.1 kB/s | 8.1 kB     00:01    
Dependencies resolved.
Nothing to do.
Complete!     

让我们在容器中安装Apache

$ lxc exec cent8 -- yum -y install httpd

Last metadata expiration check: 0:00:41 ago on Sat Nov  7 12:56:38 2020.
Dependencies resolved.
====================================================================================================================================== Package                         Architecture        Version                                             Repository              Size 
======================================================================================================================================Installing:
 httpd                           x86_64              2.4.37-21.module_el8.2.0+494+1df74eae               AppStream              1.7 M 
Installing dependencies:
 apr                             x86_64              1.6.3-9.el8                                         AppStream              125 k 
 apr-util                        x86_64              1.6.1-6.el8                                         AppStream              105 k

安装后,您可以登录到容器,创建示例页面,启动Web服务器并检查其状态。

$ lxc exec cent8 -- /bin/bash

##We are now in the container
[[email protected] ~]# systemctl start httpd
[[email protected] ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2020-11-07 12:58:09 UTC; 5s ago
     Docs: man:httpd.service(8)
 Main PID: 175 (httpd)
   Status: "Started, listening on: port 80"
    Tasks: 213 (limit: 11069)
   Memory: 27.6M
   CGroup: /system.slice/httpd.service
           ├─175 /usr/sbin/httpd -DFOREGROUND
           ├─176 /usr/sbin/httpd -DFOREGROUND
           ├─177 /usr/sbin/httpd -DFOREGROUND
           ├─178 /usr/sbin/httpd -DFOREGROUND
           └─179 /usr/sbin/httpd -DFOREGROUND

在容器中创建Apache提供的示例页面以进行演示

[[email protected] ~]# vi /var/www/html/index.html

<!DOCTYPE html>

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title>Spoon-Knife</title>
  <LINK href="https://computingforgeeks.com/run-linux-containers-with-lxc-lxd-on-centos//styles.css" rel="stylesheet" type="text/css">
</head>

<body>

<img src="forkit.gif" id="octocat" alt="" />
<h2> About SELinux </h2><br>
<p>
  SELinux gives you the ability to limit the privileges associated with executing processes and reduce the damage that could result from system and applications vulnerabilities exploitation. For this reason, it is recommended to keep SELinux in enforcing mode unless you have a good reason to disable it.
</p>
<h2> Modes</h2><br>
<p>
  The other available mode for running SELinux in enabled state is Permissive. In this mode, SELinux policy is not enforced and access is not denied but denials are logged for actions that would have been denied if running in enforcing mode.
</p>

</body>
</html>

然后在容器内重新启动Apache并退出。

[[email protected] ~]# systemctl restart httpd

步骤8:从外部访问容器中的应用程序

现在,您已经将应用程序部署到了特定的容器(例如,使用上述命令的Apache),目标受众从外部访问您托管的内容的准确性如何?您可以使用防火墙规则,或者更优雅地部署反向代理,以将流量路由到您的应用程序。

使用反向代理服务器,例如Nginx

在CentOS8主机系统上安装Nginx Web服务器。

sudo yum -y install vim nginx

为服务设置Nginx HTTP代理

创建一个新的配置文件。

sudo nano /etc/nginx/conf.d/app1.conf

修改此配置代码段以适合您的设置。 请注意,Nginx在端口9090上进行侦听,而Apache将流量重定向到在端口80上运行的容器。

##App1 Upstreams

upstream app1 {
 server 10.80.35.177:80;  ##Notice the IP of the container here.
}

server {
    listen 9090;
    server_name app1.computingforgeeks.com;
    access_log /var/log/nginx/app1_access.log;
    error_log /var/log/nginx/app1_error.log;


    # Proxy settings
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    # Request for root domain
    location / {
       proxy_redirect off;
       proxy_pass http://app1;
    }

    # Gzip
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

有效(外部)(公共)访问应用程序需要DNS记录。

检查配置语法。

$ sudo nginx  -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果设置返回正反馈,请重新启动nginx服务。

sudo systemctl restart nginx

在防火墙中允许端口9090

sudo firewall-cmd --permanent --add-port=9090/tcp
sudo firewall-cmd --reload

现在您可以访问您的应用程序了。打开您喜欢的浏览器,然后指向FQDN或配置的Nginx代理的IP地址和端口。 http:// :9090。将显示以下页面。

lxcapache应用

结论

最终安装,管理和管理 lxd / lxc 在一个容器中托管一个简单的应用程序,其中一个。我希望该指南能够像预期的那样提供有用的信息,并且一切正常。在博客上认识您就足够了我们访问并感谢您的疯狂支持。查看以下其他精美指南。

如何使用Snap将LXD部署到CentOS 7

使用Podman和Libpod运行Docker容器

如何将Docker / Podman容器作为Systemd服务运行

Sidebar