如何在KVM或Xen虚拟机下安装LXD容器
您可以实施 Linux 容器 (LXD/LXC) 来分区您的云服务器。云服务器及其文件和资源都只能访问正确的服务,例如 Apache、Nginx、MySQL、Proxy、Memcached 等。Canonical 的 LXD 是一个纯容器管理程序,它以惊人的速度和密度运行未经修改的 Linux 操作系统和具有 VM 样式操作的应用程序。在本快速教程中,您将学习如何在 Linode 托管的 KVM 云服务器下安装最新稳定版本的 LXD 容器,以便在 Ubuntu Linux 16.04.xx LTS 服务器上实现安全机制。
步骤 1 – LTS 版本与反向移植版本
有两个版本
- 建议在生产环境中使用LTS 版本。
- 要获取 LXD 的所有最新功能和每月更新,请使用功能发布分支。
第 2 步 - 安装 lxd
输入以下apt 命令或apt-get 命令来安装 LXD LTS 版本:
$ sudo apt-get install lxd
或者
$ sudo apt install lxd
要使用Xenial 上的反向移植安装最新的稳定版本
$ sudo apt install -t xenial-backports lxd lxd-client
,请运行:
示例输出:
Building dependency tree Reading state information... Done The following additional packages will be installed: acl dns-root-data dnsmasq-base ebtables liblxc1 liblzo2-2 libnetfilter-conntrack3 lxc-common lxcfs squashfs-tools uidmap xdelta3 Suggested packages: criu lxd-tools The following NEW packages will be installed: acl dns-root-data dnsmasq-base ebtables liblxc1 liblzo2-2 libnetfilter-conntrack3 lxc-common lxcfs lxd lxd-client squashfs-tools uidmap xdelta3 0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded. Need to get 6,275 kB/7,162 kB of archives. After this operation, 26.6 MB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://mirrors.linode.com/ubuntu xenial-updates/main amd64 ebtables amd64 2.0.10.4-3.4ubuntu2 [79.4 kB] Get:2 http://mirrors.linode.com/ubuntu xenial-backports/main amd64 lxd-client amd64 2.21-0ubuntu2~16.04.1 [2,426 kB] Get:3 http://mirrors.linode.com/ubuntu xenial/universe amd64 xdelta3 amd64 3.0.8-dfsg-1ubuntu2 [67.1 kB] Get:4 http://mirrors.linode.com/ubuntu xenial-backports/main amd64 lxd amd64 2.21-0ubuntu2~16.04.1 [3,703 kB] Fetched 6,275 kB in 0s (58.5 MB/s) Selecting previously unselected package liblzo2-2:amd64. (Reading database ... 41804 files and directories currently installed.) Preparing to unpack .../liblzo2-2_2.08-1.2_amd64.deb ... Unpacking liblzo2-2:amd64 (2.08-1.2) ... Selecting previously unselected package acl. Preparing to unpack .../acl_2.2.52-3_amd64.deb ... Unpacking acl (2.2.52-3) ... Selecting previously unselected package dns-root-data. Preparing to unpack .../dns-root-data_2015052300+h+1_all.deb ... Unpacking dns-root-data (2015052300+h+1) ... Selecting previously unselected package libnetfilter-conntrack3:amd64. Preparing to unpack .../libnetfilter-conntrack3_1.0.5-1_amd64.deb ... Unpacking libnetfilter-conntrack3:amd64 (1.0.5-1) ... Selecting previously unselected package dnsmasq-base. Preparing to unpack .../dnsmasq-base_2.75-1ubuntu0.16.04.4_amd64.deb ... Unpacking dnsmasq-base (2.75-1ubuntu0.16.04.4) ... Selecting previously unselected package ebtables. Preparing to unpack .../ebtables_2.0.10.4-3.4ubuntu2_amd64.deb ... Unpacking ebtables (2.0.10.4-3.4ubuntu2) ... Selecting previously unselected package lxc-common. Preparing to unpack .../lxc-common_2.0.8-0ubuntu1~16.04.2_amd64.deb ... Unpacking lxc-common (2.0.8-0ubuntu1~16.04.2) ... Selecting previously unselected package liblxc1. Preparing to unpack .../liblxc1_2.0.8-0ubuntu1~16.04.2_amd64.deb ... Unpacking liblxc1 (2.0.8-0ubuntu1~16.04.2) ... Selecting previously unselected package lxcfs. Preparing to unpack .../lxcfs_2.0.8-0ubuntu1~16.04.2_amd64.deb ... Unpacking lxcfs (2.0.8-0ubuntu1~16.04.2) ... Selecting previously unselected package lxd-client. Preparing to unpack .../lxd-client_2.21-0ubuntu2~16.04.1_amd64.deb ... Unpacking lxd-client (2.21-0ubuntu2~16.04.1) ... Selecting previously unselected package squashfs-tools. Preparing to unpack .../squashfs-tools_1%3a4.3-3ubuntu2.16.04.1_amd64.deb ... Unpacking squashfs-tools (1:4.3-3ubuntu2.16.04.1) ... Selecting previously unselected package uidmap. Preparing to unpack .../uidmap_1%3a4.2-3.1ubuntu5.3_amd64.deb ... Unpacking uidmap (1:4.2-3.1ubuntu5.3) ... Selecting previously unselected package xdelta3. Preparing to unpack .../xdelta3_3.0.8-dfsg-1ubuntu2_amd64.deb ... Unpacking xdelta3 (3.0.8-dfsg-1ubuntu2) ... Selecting previously unselected package lxd. Preparing to unpack .../lxd_2.21-0ubuntu2~16.04.1_amd64.deb ... Unpacking lxd (2.21-0ubuntu2~16.04.1) ... Processing triggers for man-db (2.7.5-1) ... Processing triggers for libc-bin (2.23-0ubuntu10) ... Processing triggers for dbus (1.10.6-1ubuntu3.3) ... Processing triggers for systemd (229-4ubuntu21) ... Processing triggers for ureadahead (0.100.0-19) ... Setting up liblzo2-2:amd64 (2.08-1.2) ... Setting up acl (2.2.52-3) ... Setting up dns-root-data (2015052300+h+1) ... Setting up libnetfilter-conntrack3:amd64 (1.0.5-1) ... Setting up dnsmasq-base (2.75-1ubuntu0.16.04.4) ... Setting up ebtables (2.0.10.4-3.4ubuntu2) ... update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults Setting up lxcfs (2.0.8-0ubuntu1~16.04.2) ... Setting up lxd-client (2.21-0ubuntu2~16.04.1) ... Setting up squashfs-tools (1:4.3-3ubuntu2.16.04.1) ... Setting up uidmap (1:4.2-3.1ubuntu5.3) ... Setting up xdelta3 (3.0.8-dfsg-1ubuntu2) ... Setting up liblxc1 (2.0.8-0ubuntu1~16.04.2) ... Setting up lxd (2.21-0ubuntu2~16.04.1) ... Setting up lxd dnsmasq configuration. To go through the initial LXD configuration, run: lxd init Old bridge configuration detected in /etc/default/lxd-bridge, upgrading Unsetting deprecated profile options Attempting to kill current lxd-bridge Bringing down and renaming existing bridge lxdbr0 to lxd-upgrade Creating a new LXD bridge Network lxdbr0 created Moving the old bridge into place Configuring the new LXD bridge Setting IPv4 network to 10.119.191.1/24 Setting IPv4 DHCP range to 10.119.191.2-10.119.191.254 Enabling IPv4 NAT Done converting your bridge, renaming old configuration Cleaning up lxd-bridge state files Setting up lxc-common (2.0.8-0ubuntu1~16.04.2) ... Processing triggers for libc-bin (2.23-0ubuntu10) ... Processing triggers for dbus (1.10.6-1ubuntu3.3) ... Processing triggers for systemd (229-4ubuntu21) ... Processing triggers for ureadahead (0.100.0-19) ...
步骤 3 - 为 lxd 添加用户账户
键入以下命令添加名为 vivek 的用户,运行:
$ sudo adduser vivek
确保vivek 是名为 lxd 组的辅助组的一部分,输入:
$ sudo usermod -a -G lxd vivek
验证它,运行id 命令如下:
$ id vivek
示例输出:
uid=1002(vivek) gid=1002(vivek) groups=1002(vivek),118(lxd)
步骤 4 - 配置 lxd
要完成初始 LXD 配置,请运行:
$ sudo lxd init
示例输出:
步骤 5 - 创建并使用你的第一个容器
首先以 vivek 用户身份登录:
$ ssh vivek@server1.example.com
或者
$ su - vivek
验证 lxc 客户端是否正在与 LXD 守护进程通信:
$ lxc list
示例输出:
+------+-------+------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+-------+------+------+------+-----------+
创建第一个容器的语法如下:
lxc launch images:{distro}/{version}/{arch} {container-name-here}
要列出各种 Linux 发行版的所有可用映像,请运行:
$ lxc image list images:
要创建 CentOS Linux v7.x 容器:
$ lxc launch images:centos/7/amd64 my-cenots
示例输出:
Creating my-cenots Retrieving image: 100% (16.80MB/s) Starting my-cenots
要创建 Ubuntu Linux 16.4 LTS 容器:
$ lxc launch images:ubuntu/xenial/amd64 my-ubuntu
示例输出:
动画 gif.01:Lxc 创建你的 VM
步骤 6 – 登录你的第一个容器
输入以下命令:
您现在可以更新您的容器或安装所需的软件。
$ lxc exec my-centos bash
$ lxc exec my-ubuntu bash
步骤 6 - 锁定 root 用户
您不需要在容器中创建 root 用户或默认用户(例如 ubuntu/centos):
$ lxc exec my-ubuntu bash
锁定 root 帐户访问权限,运行:
# passwd -l root
使用 userdel 命令删除不需要的用户帐户,运行:
# userdel -r ubuntu
步骤 7 - 基本 Linux 容器管理命令
让我们看看管理容器的重要命令。
启动容器
$ lxc start containerName
停止容器
$ lxc stop containerName
重启容器
$ lxc restart containerName
删除容器
$ lxc delete containerName
获取正在运行的容器的信息
$ lxc info containerName
在容器中运行指定命令
$ lxc exec containerName command1
$ lxc exec containerName command1 opt1
$ lxc exec containerName date
$ lxc exec containerName -- command1 -arg1 -arg2
$ lxc exec my-cenots -- yum update -y
启动时自动启动 LXD VM
$ lxc config set containerName boot.autostart true
$ lxc config set my-centos boot.autostart true
创建容器的只读快照
$ lxc snapshot containerName snapShotName
$ lxc snapshot my-cenots snap0
$ lxc info my-cenots
将容器的状态还原到之前的快照
$ lxc restore containerName snapShotName
$ lxc restore my-cenots snap0
$ lxc info my-cenots
$ lxc exec my-cenots bash
我建议你让内置 DHCP 根据名称或 MAC 地址为 LXD 容器/VM 分配一个静态 IP,以便于管理,包括相互通信。我建议你按如下方式设置 LAMP 堆栈:
一旦 LXC VM 启动并运行。登录每个容器并设置服务,即在 apache-php1 VM 上安装 Apache 和 PHP。使用云服务器上的 Nginx(或任何其他代理服务器)或 iptables 将流量从你的公共 IP 地址重定向到容器服务的端口 80/443。
$ lxc launch images:ubuntu/xenial/amd64 db1
$ lxc launch images:ubuntu/xenial/amd64 nginx1
$ lxc launch images:ubuntu/xenial/amd64 apache-php1
$ lxc launch images:ubuntu/xenial/amd64 memcached
就是这样。LXD 容器/VM 正在为每项服务(例如 Web 服务器、MySQL、Memcached、Proxy 等)运行。所有服务都在单独的 LXD vm 实例上运行。当然,如果攻击者能够成功利用一项网络服务中的软件漏洞,这会限制可以破解的其他服务的数量。
参见
- 在 Ubuntu 16.04 LTS 上安装 LXD 容器管理程序
- 如何在 Fedora Linux 26 上安装和设置 LXC(Linux 容器)
- 在KVM或Xen虚拟机下设置LXD容器
- 列出 LXD(Linux 容器)中的 VM 映像
- 升级由 Ubuntu/Debian 或 CentOS Linux 驱动的 LXD 容器
- 在 Linux 启动时自动启动 LXD 容器
- 重命名 LXD / LXC 容器的命令
- 在配置启动时在 Linux 容器 (LXD) 实例上运行命令
- 在云实例启动时,使用 shell 脚本中的 LXD(Linux 容器)创建 VM
- 将 LXD VM 移动/迁移到 Linux 上的另一台主机
- Fedora 安装并设置 LXD
- CentOS 7.x 安装并设置 LXD 服务器
- 在 Ubuntu 18.04 LTS 上安装 LXD 纯容器管理程序
- 使用 lxc 命令为 LXD 创建快照
- 在 CentOS/RHEL 8 上设置并安装 LXD
- Ubuntu 20.04 LTS 安装并设置 LXD
- 完整备份和恢复 LXD 容器
- 禁用 LXD 桥上的防火墙和 NAT 规则
- 使用 lxc 删除或移除 LXD 容器
- Linux 文件系统错误:事务失败解决方案
- Ubuntu 22.04 LTS 设置 LXD
- Debian 11 设置 LXD