揭秘 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 <your-username>
newgrp lxd

注:使用newgrp该命令用于登录会话期间改变当前组ID。如果给出了可选标志,则用户的环境将被重新初始化,就像用户已经登录一样,否则当前环境(包括当前工作目录)保持不变。newgrp 将当前的真实组 ID 更改为命名组。

接下来,我们通过运行以下命令来配置或“初始化”LXD 环境。它会带你解决几个问题。请根据您的环境需要回答。我使用默认值作为空白值。

$ lxd initWould 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 cent8Creating cent8
Retrieving image: Unpack: 100% (4.22GB/s)
Starting cent8

通过运行以下命令启动 Ubuntu 容器:

$ lxc launch ubuntu:20.04 ubuntu20Creating 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 <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    veth975e84ffeth0: inet6   fd42:b3a2:efa8:5aa5:216:3eff:fe1d:38c3  veth975e84ffeth0: inet6   fe80::216:3eff:fe1d:38c3        veth975e84ff        lo:   inet    127.0.0.1lo:   inet6   ::1
Resources:Processes: 13Disk usage:root: 737.98MBCPU usage:CPU usage (in seconds): 1Memory usage:Memory (current): 93.32MBMemory (peak): 98.56MBNetwork usage:eth0:Bytes received: 3.57kBBytes sent: 2.22kBPackets received: 30Packets sent: 22lo:Bytes received: 0BBytes sent: 0BPackets received: 0Packets sent: 0

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

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

$ lxc exec <container-name> <command>

执行命令示例如下:

$ lxc exec cent8 -- yum -y updateCentOS-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 httpdLast 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 ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)Active: active (running) since Sat 2020-11-07 12:58:09 UTC; 5s agoDocs: man:httpd.service(8)Main PID: 175 (httpd)Status: "Started, listening on: port 80"Tasks: 213 (limit: 11069)Memory: 27.6MCGroup: /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

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

好吧,既然您已将应用程序部署在给定的容器(例如,上述命令中的 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 Upstreamsupstream 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 settingsproxy_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 domainlocation / {proxy_redirect off;proxy_pass https://app1;}# Gzipgzip_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。您应该会看到类似于以下内容的页面。

综上所述

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

在 CentOS 8 上使用 LXC / LXD 运行 Linux 容器相关推荐

  1. linux运行容器,容器与云|如何在 Windows 上运行 Linux 容器

    1.概述 现在能够在 Windows 10 和 Windows 服务器上运行 Docker 容器了,它是以 Ubuntu 作为宿主基础的. 想象一下,使用你喜欢的 Linux 发行版--比如 Ubun ...

  2. linux容器怎么运行到windows,如何在 Windows 上运行 Linux 容器?

    首先,我们来做一下准备工作,计算机的大概配置内存8GB和64 位的计算机,可以运行 Windows 10 或 Windows Server.已经加入了 Windows 预览体验计划(Insider), ...

  3. linux 在沙盒中运行,Linux容器的细粒度沙盒策略执行方法与流程

    本发明专利属于计算机技术领域,涉及云计算安全方向.更具体的讲,本发明专利涉及一种Linux容器的细粒度沙盒策略执行方法. 背景技术: Linux容器技术采用命名空间将进.文件.设备等资源进行隔离,为用 ...

  4. lxc服务器性能,Linux 容器 (LXC)

    Linux 容器 (LXC) 借助于namespace的隔离机制和cgroup限额功能,LXC提供了一套统一的API和工具来建立和管理container, LXC利用了如下 kernel 的featu ...

  5. lxc/lxd容器使用

    lxd版本:4.0.5 Liunux:Ubuntu 20.04.1 LTS lxc是Linux Container的简称,也就是Linux容器.lxc/lxd和docker容器相比,更接近虚拟机的环境 ...

  6. 赛灵思运行linux,玩转赛灵思Zedboard开发板(6):如何在Zedboard上运行linux下的应用程序?...

    描述 电子发烧友网讯:ZedBoard开发板上的Zynq是一个ARM PS(processing system, 双核A9 + 存储管理 + 外设)+ PL(programable Logic) 结构 ...

  7. Linux 容器 (LXC) 介绍

    自云计算兴起以来,微服务一直在稳步流行.亚马逊和 Netflix 等公司正在使用云平台来提供他们最需要的服务.容器是此类云原生应用程序的核心.容器是一个隔离的环境,可促进微服务并提供卓越的扩展性和快速 ...

  8. abp 打包部署到ubuntu_如何在Ubuntu中安装Docker和运行 Docker容器

    Docker是一种开源且流行的操作系统级虚拟化(俗称"容器化")技术,主要在Linux和Windows上运行. Docker使用容器可以更轻松地创建,部署和运行应用程序. 使用容器 ...

  9. 在PC机上运行的linux系统是,Docker Desktop如何在Windows计算机上运行linux容...

    1)我的Windows 10计算机具有Windows内核.对? 答:可以. 2)当我选择运行Linux容器的选项时,我认为Linux VM在Windows 10计算机的顶部运行,并且在Linux容器的 ...

最新文章

  1. 保护嵌入式802.11 Wi-Fi设备时需要考虑的10件事
  2. inno setup修改properties格式内容_linux内核修炼之setup
  3. python 获取网络图片的大小
  4. 【原创】Android VMP加壳 POC
  5. 2017年10月23日23:58:04
  6. PHP页面运行一半,在PHP中仅缓存页面的一部分
  7. android jar 加密
  8. uva 12222——Mountain Road
  9. (转)SpringMVC学习(七)——Controller类的方法返回值
  10. NUC1937 B.函数【水题】
  11. 腕能助手android9,腕间应用助手(com.gmf.watchapkassistant) - 1.7 - 应用 - 酷安
  12. MCU中RS485接口设计
  13. 【转载】蜗牛星际矿渣黑群晖安装折腾路以及指引
  14. 计算机处理器天梯,cpu天梯图2020_笔记本cpu天梯排名图2020
  15. 儿童定位手表、定位器、老人健康手表的工作原理
  16. HTTPS访问Git远程仓库,上报SSL证书错误解决方法
  17. 情报分析-diamond_threat_model
  18. 达达-高性能服务端优化之路
  19. 北大教授告诉你什么是 C语言!指点迷津
  20. 可能是全网最全,JAVA日志框架适配、冲突解决方案,可以早点下班了!

热门文章

  1. 七种主要的材料结构分析方法 - 热分析
  2. UNIX/LINUX 哲学
  3. 苹果拍照或者获取相册簿UIImagePickerController
  4. linux命令行处理图片基础,linux下命令行图片处理工具ImageMagick
  5. 20种拉新方式!——平台运营入门(一)
  6. cocos实现触摸屏幕关掉界面
  7. PNM介绍以及FFMPEG如何去decode encode PNM
  8. Python线性规划实践
  9. errno 10054
  10. opencv 读取 16bit tif文件