Total Pageviews

Saturday, 18 April 2020

使用LXD搭建Web网站

介绍

Linux的容器是Linux的一组进程,通过使用Linux内核功能与系统隔离。它是一个类似于虚拟机的构造,但它的更轻量级。您可以在同一台服务器上轻松创建多个容器。使用Linux容器,您可以在同一服务器上运行多个实例,或者将应用程序及其依赖项捆绑到容器中,而不会影响系统的其余部分。
假设您有一台服务器,并且已为您的客户设置了多项服务,按照Web应用来说,每个Web站点都是Apache或NginxWeb服务器的同一实例的虚拟主机。但是对于Linux容器,每个网站都在其自己的容器中配置,并具有自己的Web服务器。我们可以使用LXD来创建和管理这些容器。LXD提供管生命周期的容器管理。
在本教程中,您将使用LXD在同一服务器上安装两个基于Nginx的网站,每个网站都限制在自己的容器中。然后,您将在第三个容器中安装HAProxy,该容器将充当反向代理。然后,您将网站路由到HAProxy容器,以便从Internet访问这两个网站。

准备

要完成本教程,您需要以下内容:
  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器
  • 两个域名,如果你没有域名,建议您先去这里注册一个域名,您需要将域名解析到您的服务器,您可以使用腾讯云云解析进行快速设置。
  • 20GB以上存储空间,建议您使用腾讯云的云硬盘进行扩容。

第一步 – 将您的用户添加到lxd组

使用非root用户帐户登录服务器。我们将使用此帐户执行所有容器管理任务。为此,您必须先将此用户添加到lxd组。使用以下命令执行此操作:
sudo usermod --append --groups lxd sammy
注销服务器并重新登录,以便使用新的组成员身份更新新的SSH会话。登录后,您可以开始配置LXD。

第二步 – 配置LXD

需要先配置LXD才能使用,最重要的配置取决于存储容器的后端类型。LXD的推荐存储后端是ZFS文件系统,请安装zfsutils-linux包:
sudo apt-get update  sudo apt-get install zfsutils-linux
安装完成后,您就可以初始化LXD了。在初始化期间,系统将提示您指定ZFS存储后端。接下来有两个部分,具体取决于您是要使用预分配文件还是块存储。按照适合您情况的步骤进行操作。指定存储机制后,您将为容器配置网络选项。

使用预分配的文件

请按照以下步骤配置LXD以使用预分配的文件来存储容器。首先,执行以下命令以启动LXD初始化:
sudo lxd init
系统将提示您提供信息,如以下输出所示。我们将选择默认值,包括预分配文件的建议大小。
Name of the storage backend to use (dir or zfs) [default=zfs]: zfs  Create a new ZFS pool (yes/no) [default=yes]? yes  Name of the new ZFS pool [default=lxd]: lxd  Would you like to use an existing block device (yes/no) [default=no]? no  Size in GB of the new loop device (1GB minimum) [default=15]: 15  Would you like LXD to be available over the network (yes/no) [default=no]? no  Do you want to configure the LXD bridge (yes/no) [default=yes]? yes  Warning: Stopping lxd.service, but it can still be activated by:    lxd.socket  LXD has been successfully configured.
建议的大小将根据服务器的可用磁盘空间自动计算。配置设备后,您将配置网络设置。

配置网络

初始化过程将为我们提供一个GUI,如下图所示,让我们为容器配置网络桥接,以便它们可以获取私有IP地址,相互通信以及访问网络。
img
使用每个选项的默认值,但当被问及IPv6网络时,请选择,因为国内环境暂时不允许。
完成网络配置后,您就可以创建容器了。

第三步 – 创建容器

我们已成功配置LXD。我们指定了存储后端的位置,并为任何新创建的容器配置了默认网络。我们将准备创建和管理一些容器,我们将使用lxc命令。
让我们尝试我们的第一个命令,它列出了可用的已安装容器:
lxc list
您将看到以下输出:
Generating a client certificate. This may take a minute...  If this is your first time using LXD, you should also run: sudo lxd init  To start your first container, try: lxc launch ubuntu:16.04    +------+-------+------+------+------+-----------+  | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |  +------+-------+------+------+------+-----------+
由于这是lxc命令第一次与LXD管理程序通信,因此输出让我们知道该命令会自动创建客户端证书与LXD进行安全通信。然后,它显示了有关如何启动容器的一些信息。最后,该命令显示了一个空的容器列表,这很正常,我们尚未创建任何容器。
让我们来创建三个容器。我们将创建两个web容器,并为反向代理创建第三个容器。反向代理的目的是将来自网络的传入连接定向到容器中的正确Web服务器。
我们将使用lxc launch命令创建并启动名为web1的Ubuntu 16.04(ubuntu:x)容器。ubuntu:x是预先配置的LXD镜像存储库的标识符
注意:您可以通过运行lxc image list images:来运行镜像, lxc image list ubuntu:命令找到所有可用Ubuntu映像的完整列表。
执行以下命令以创建容器:
lxc launch ubuntu:x web1  lxc launch ubuntu:x web2  lxc launch ubuntu:x haproxy
因为这是我们第一次创建容器,所以第一个命令从网络下载容器映像。接下来的两个容器创建速度要快得多。
在这里,您可以看到创建容器web1的示例输出结果。
Creating web1  Retrieving image: 100%  Starting web1
现在我们已经创建了三个空的vanilla容器,让我们使用lxc list命令来显示有关它们的信息:
lxc list
输出结果显示为一个表,其中包含每个容器的名称,其当前状态,IP地址,类型以及是否存在快照。
+---------+---------+-----------------------+------+------------+-----------+  |  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |  +---------+---------+-----------------------+------+------------+-----------+  | haproxy | RUNNING | 10.10.10.10 (eth0)    |      | PERSISTENT | 0         |  +---------+---------+-----------------------+------+------------+-----------+  | web1    | RUNNING | 10.10.10.100 (eth0)   |      | PERSISTENT | 0         |  +---------+---------+-----------------------+------+------------+-----------+  | web2    | RUNNING | 10.10.10.200 (eth0)   |      | PERSISTENT | 0         |  +---------+---------+-----------------------+------+------------+-----------+
记下容器名称及其对应的IPv4地址。您需要它们来配置您的服务。

第四步 – 配置Nginx容器

让我们连接到web1容器并配置第一个Web服务器。
要进行连接,我们使用 lxc exec命令,该命令需要容器的名称和要执行的命令。执行以下命令以连接到容器:
lxc exec web1 -- sudo --login --user ubuntu
字符串表示该命令参数应该停在那里,如在容器内将要执行的命令的行的其余部分将被传递。该命令是,它为容器内的预配置帐户ubuntu提供登录shell 。