在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

現在您可以訪問您的應用程序了。打開您喜歡的瀏覽器,指向已配置的Nginx代理的FQDN或IP地址和端口。 http:// :9090。將顯示以下頁面。

lxcapache應用

結論

最終安裝,管理和管理 lxd / lxc 在一個容器中託管一個簡單的應用程序,其中之一。我希望該指南能像預期的那樣提供有用的信息,並且一切正常。在博客上與您會面足以使我們訪問並感謝您的瘋狂支持。查看以下其他精美指南。

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

使用Podman和Libpod運行Docker容器

如何將Docker / Podman容器作為Systemd服務運行

Sidebar