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

揭秘 LXC

Linux 容器项目 (LXC) 是一个开源容器平台,提供了一组工具、模板、库和语言绑定。它提供的容器包括一个完整的 Linux 系统,就像一个 VM,有自己的文件系统、网络和多个应用程序。LXC 有一个简单的命令行界面,可以改善启动容器时的用户体验(RedHat,2020)。通过强大的 API 和简单的工具,它使 Linux 用户能够轻松创建和管理系统或应用程序容器。在容器化之前,Docker 是建立在 LXC 之上的,但从那时起,它们已经转向容器化。

LXC 的特点

当前的 LXC 使用以下内核函数来包含进程:来源:LinuxContainers

  • 内核命名空间(ipc、uts、mount、pid、network 和 user)
  • Apparmor 和 SELinux 配置文件
  • 安全政策
  • chroots(使用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、磁盘和路径)
  • 网络管理(网桥创建和配置、跨主机隧道等)
  • 存储管理(支持多个存储后端、存储池和存储卷)

在 CentOS 8 上安装 LXC / LXD

如果您想在CentOS 8 服务器上尝试 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 repo,然后更新服务器以从 Epel 获取最新的包。

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

第 3 步:在 CentOS 8 上安装snap

在这个设置中,我们将安装 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

注销并重新登录,或重新启动系统以确保快照路径更新正确。安装快照后,让我们继续下一步。

第四步:添加内核参数

LXD 需要一些重要的内核选项,我们将在服务器上启用这些选项。通过在终端上运行以下命令来配置它们:root

$ 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

第六步:启动测试LXD容器

到目前为止,我们已经安装了 LXC/LXD,但是没有一个容器可以容纳我们感兴趣的应用程序。因此,在启动一些容器之前,我们先将用户帐号加入lxd组,这样它就可以不受权限限制地管理LXD容器。

sudo usermod -aG lxd 
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。我们把这个bridge接口加入到trusted zone中,这样连接就可以通过了,也就是说,我们将允许所有传入的流量通过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         |
+-------+---------+---------------------+-----------------------------------------------+-----------+-----------+

还可以停止、启动、重启、删除和查看容器的更多信息,如下图,其中是容器的名称,如 lxc list 命令中所示。

lxc start 
lxc stop 
lxc restart 
lxc delete 

例如

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

第七步:在容器中执行临时命令:

就像你可以“在 Docker 容器中进行”一样,你也可以在 lxd 容器中运行命令。语法是这样的。

$ lxc exec  

执行命令示例如下:

$ 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





  
  Spoon-Knife
  





About SELinux


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.

Modes


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.

然后在容器中重启Apache并退出。

[[email protected] ~]# systemctl restart httpd

第八步:从外部访问容器中的应用

好吧,既然您已将应用程序部署在给定的容器(例如,上述命令中的 Apache)上,目标受众将如何从外部访问您的托管内容?您可以使用防火墙规则,也可以使用更优雅的方法,您可以部署反向代理来将流量路由到您的应用程序。

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

在 CentOS 8 主机系统上安装 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 https://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。您应该会看到类似于以下内容的页面。

在 CentOS 8 上使用 LXC / LXD 运行 Linux 容器_第1张图片

综上所述

我们最终设法安装、管理和管理lxd / lxc容器并在其中一个容器中托管一个简单的应用程序。

 

你可能感兴趣的:(linux,centos,容器)