注:

在 Oracle Cloud Infrastructure 上的 Ampere A1 上部署 Nextcloud

在本教程中,您将安装 Oracle Cloud Infrastructure (OCI) 上广受欢迎的开源协作平台 Nextcloud。您将为 Nextcloud 服务器使用单个 Ampere A1 计算实例。您还将使用 Podman 将 Nextcloud 用一组容器来运行。Podman 是一个容器引擎,用于使用开放容器计划标准管理和运行容器。它提供与 Docker 的完全 API 兼容性,并可替代 docker 命令。然而,与包含无守护体系结构、无根容器支持以及 cgroupsv2 支持的 Docker 相比,它具有一些优势。

Nextcloud 提供支持 Arm 体系结构的 docker 容器映像。Nextcloud 还需要一个数据库,我们可以使用 MySQL 或 MariaDB。要实现更具可扩展性的部署,您可以考虑在 OCI 上使用 MySQL 数据库服务,从而轻松扩展、备份和管理 MySQL 数据库。

在容器内创建的数据不会持久保存。Nextcloud 需要持久性存储来存储我们上载的文件和内部状态。要持久保存数据,我们可以使用 OCI 块存储服务使用卷。卷是 Podman 创建和管理的存储设备。卷直接使用 podman volume 命令创建,或者在容器创建期间创建。

要启用基于下一云 Web 的 UI 和服务,我们需要对 OCI 网络安全列表进行必要的更改以允许流量通过。

对于这些组件,我们提供了用于部署的基本拓扑。

体系结构

插图 arch.png 的说明

简介

目标

在本教程中,您将:

先决条件

  1. Oracle 免费套餐(试用)、付费或 LiveLabs Cloud 账户
  2. 熟悉 OCI 控制台
  3. 网络概览
  4. 熟悉区间
  5. 容器和 Podman 的基本概念知识

设置环境

首先启动将用于创建和部署 Java EE 应用程序的 Oracle 云环境。此环境将包含在云区间中,区间内的通信将通过虚拟云网络 (VCN) 进行。区间和 VCN 将隔离和保护整个环境。您将部署 Ampere A1 计算实例来托管 Nextcloud 服务器。创建计算实例后,您将设置访问策略来公开应用并在实例上安装 Nextcloud。

基本 OCI 基础结构设置

  1. 打开导航菜单。在“监管和管理”下,转到身份并单击区间。在此屏幕中,您将看到区间列表,单击创建区间

  2. 输入以下信息:

    • 名称:输入 “AppDev”。
    • 说明:输入说明(必需),例如:“入门教程的 AppDev 区间”。请避免输入机密信息。
    • 父区间:选择希望此区间所在的区间。默认为根区间(或租户)。
    • 单击创建区间
    • 您的区间将显示在列表中。

创建 Ampere A1 计算实例

  1. 要创建 Ampere A1 计算实例,请使用控制台左上角的导航菜单,然后转到计算 > 实例

  2. 打开实例创建流。

    1. 验证您是否位于 AppDev 区间中
    2. 单击创建实例
  3. 在创建实例页中,您将创建新的实例以及新的网络资源,例如虚拟云网络 (VCN)、互联网网关 (IG) 等。

    1. 将实例命名为 Nextcloud
    2. 更新映像选择以使用 Oracle Linux 8 或更新版本
    3. 单击更改配置按钮可查看可用的计算配置。

     创建实例

    插图 03_create_instance02.png 的说明

  4. 为您的实例配置映像。

    1. 单击 Change Image 按钮可查看可用的 OS 映像。
    2. 选择 Oracle Linux 8 或更新版本。

    选择 Oracle Linux 8

    插图 03_create_instance02_1.png 的说明

  5. 为您的实例配置资源。

    1. 在形状系列的选择中选择基于 Ampere Arm 的处理器。
    2. 从具有基于 Ampere Arm 的处理器的配置列表中选择 VM.Standard.A1.Flex 配置。Ampere A1 配置灵活,您可以修改核心数和内存量。为 VM 选择 1 个核心和 6 GB 内存。

    选择配置

    插图 04_create_instance03.png 的说明

  6. 选择您的网络选项。为您的下一个云部署创建新的 VCN 和子网。确保您选择为实例分配公共 IP 地址。

  7. 生成并下载 SSH 密钥对。此步骤是可选的,但是强烈建议您以后进行维护和升级。如果您已经有一个要使用的密钥对,也可以携带该公钥。如果要了解如何生成 SSH 密钥,请按照生成 SSH 密钥教程中的说明进行操作。

    网络选项

    插图 06_create_instance05.png 的说明

  8. 单击创建以创建网络资源并启动计算实例。启动实例

    插图 07_create_instance06.png 的说明

向用户公开应用程序端口

要从 Internet 访问应用,您需要打开应用将使用的端口。在此部分中,您将在计算实例上配置云网络上的安全列表和防火墙规则,以允许应用发送和接收流量。

配置虚拟云网络 (VCN)

安全列表用作实例的虚拟防火墙,并支持使用入站和出站规则来指定允许进出的流量类型。在子网级别配置的安全列表,安全列表将安全规则应用于该子网中的所有网络元素。网络附带一个默认安全列表,其中包含一组初始规则。利用默认安全列表,您可以使用 SSH 连接到实例,使实例可以对任何目标进行出站网络调用。

  1. 导航您已创建的实例的实例详细信息页面。计算 > 实例 > 单击已创建的实例
  2. 通过单击子网导航到实例所附加到的子网选择子网

    插图 01_setup_network_01.png 的说明

  3. 在子网中,选择默认安全列表
  4. 单击“Add Ingress Rule(添加入站规则)”添加新规则,以允许与规则匹配的传入流量。
  5. 添加入站规则以允许端口 8080 上的传入流量
    1. 源 CIDR 设置为 0.0.0.0/0。这允许来自所有源的传入流量。
    2. Destination Port Range 设置为 8080。这会将目标设置为仅端口 8080。该规则现在允许来自所有源的通信使用端口 8080。这是我们需要的,因此可以随时随地访问我们的应用。
    3. 提供说明。设置入站规则

      插图 01_setup_network_04.png 的说明

配置您的实例

防火墙规则控制数据包级实例传入 / 传出通信。您可以直接在实例本身上配置防火墙规则,并提供额外的安全级别。

  1. 导航您已创建的实例的实例详细信息页面。计算 > 实例 > 单击已创建的实例
  2. 复制实例的公共 IP 地址。
  3. 使用 SSH 登录到实例。使用在实例创建步骤中生成或提供的密钥。使用 Oracle Linux 操作系统的实例的默认用户名是 opc
  4. 执行防火墙配置命令。这将修改实例自身中的防火墙以公开端口 8080 并接受传入流量。

    sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp
    sudo firewall-cmd --reload
    

在 Ampere A1 上部署 Nextcloud

现在,您可以在 Ampere A1 计算平台上将 Nextcloud 作为容器部署运行。您还将使用 Oracle Linux 8 中包括的新容器工具(如 Podman)。Podman 提供了一种轻量级实用程序,可用于运行和管理与 Open Container Initiative (OCI) 兼容的容器。Podman 部署可以重复使用现有容器映像。Podman 不需要正在运行的守护进程,并且允许容器在没有 root 权限的情况下启动和运行。要了解有关 Oracle Linux 上的 Podman 的更多信息,请访问官方文档

安装容器工具

在使用 Oracle Linux 8.x 创建实例后,我们安装 container-tools 程序包,以便为实例准备部署容器化负载所需的工具。

  1. 使用 SSH 登录到实例。使用在实例创建步骤中生成或提供的密钥。在 Oracle Linux 操作系统上运行的实例的默认用户名是 opc

  2. 安装 container-tools 模块,以拉入使用容器所需的所有工具。

    sudo dnf module install container-tools:ol8
    
    sudo dnf install git
    

创建云池定义

Podman 可以管理名为 Pod 的容器组。云池是由共享相同网络、pid 和 ipc 名称空间的一个或多个容器组成的组。此概念最初由 Kubernetes 项目引入,Podman pods 与 Kubernetes Pods 非常相似。

在许多方面,云池的行为就像运行每个容器中的服务的虚拟主机。这意味着每个容器可以像在同一主机上运行一样访问彼此容器上的服务。以这种方式运行容器可以消除网络方面的许多复杂性,并可以更轻松地限制仅供应用程序本身中的服务使用的端口的公开公开暴露。

云池是一种管理相关容器的好方法,例如当应用由多个容器组成时。在本教程中,您将部署 Nextcloud 作为云。NextCloud 所需的容器包含在 Pod 中,并一起启动和停止。将我们的应用作为云池进行管理的第一步是创建空云池定义。

使用下面的命令创建云池

podman pod create --hostname nextcloud --name nextcloud --publish 8080:80 --infra-image k8s.gcr.io/pause:3.1
  1. podman pod create - 创建云池。
  2. --hostname nextcloud - 将 pod 的主机名设置为 nextcloud
  3. --name nextcloud - 将云池的名称设置为 nextcloud
  4. --publish 8080:80- 将云池上的端口 80 发布到主机上的端口 8080

定义存储卷

现在,我们已定义了云池,因此也应该在使用容器填充云池之前定义一些存储选项。默认情况下,容器对容器内创建的所有文件使用可写容器层。这意味着,容器中进程创建的文件和数据不会保留,在删除或终止容器时会丢失。而且,难以跨容器共享数据。卷是保存容器创建的数据的首选方式。它们可以被视为主机上存储位置的存储抽象概念,但管理方式与容器生命周期无关。此外,它们还可以在多个容器上同时挂载数据,从而轻松在容器之间共享数据。

根据 Nextcloud 建议,我们使用 3 个卷来管理数据。

  1. 名为 nextcloud-appdata 的卷将存储下一个云的主要应用程序状态

  2. 名为 nextcloud-files 的卷将存储由使用上载和创建的文件。

  3. 名为 nextcloud-db 的卷将存储 MySQL 数据库的数据库文件。

    podman volume create nextcloud-appdata 
    podman volume create nextcloud-files
    podman volume create nextcloud-db
    

运行 MySQL Database

现在,您可以使用附加的卷启动下一云的数据库。数据库容器在已创建的云池中启动。Nextcloud 使用的数据库是 MySQL,在此处,我们将其作为云池中的容器运行。要实现更稳健、更全面托管的部署,您可以将此容器替换为 OCI MySQL 数据库服务。

下面显示了用于启动数据库的命令,并说明了每个选项。

:确保为下面的 MYSQL_PASSWORDMYSQL_ROOT_PASSWORD 变量提供强口令。

podman run --detach --pod=nextcloud \
--env MYSQL_DATABASE=nextcloud \
--env MYSQL_USER=nextcloud \
--env MYSQL_PASSWORD=NEXTCLOUD_PASSWORD \
--env MYSQL_ROOT_PASSWORD=MYSQL_ROOT_PASSWORD \
--volume nextcloud-db:/var/lib/mysql:Z \
--restart on-failure \
--name nextcloud-db \
mysql/mysql-server:8.0 
  1. podman run-run 命令通知 podman 在具有给定参数的容器中运行命令。要运行的命令通常在映像本身中定义。
  2. --detach- 分离模式:在后台运行容器并输出新容器 ID。
  3. --pod=nextcloud - 在现有云池中运行容器。在这里,我们选择在先前为 Nextcloud 创建的云池中运行容器
  4. --env- 设置任意环境变量。在容器内运行的进程可以访问这些环境变量。
  5. --volume nextcloud-db:/var/lib/mysql:Z- 将名为 nextcloud-db 的卷挂载到 /var/lib/mysql 位置,这是 MySQL 数据文件的默认位置。Z 选项指示 Podman 使用专用非共享标签来标记内容。
  6. --restart on-failure- 容器退出时要遵循的重新启动策略。在此处,容器将在出现故障时重新启动。出现故障时,容器中的进程存在非零状态。
  7. --name nextcloud-db- 将名称 nextcloud-db 分配给容器。
  8. mysql/mysql-server:8.0 - 用于创建容器的运行映像

由于您以分离模式运行容器,Podman 将在后台启动并退出。要查看启动和日志的状态,可以执行以下命令。按 Ctrl+C 停止跟踪日志。

podman logs -f nextcloud-db

部署下一个云

现在,您可以将 Nextcloud 本身部署为同一云中的另一个容器。这些参数与上一命令类似,您将在此处传递有关 Nextcloud 应使用的数据库的数据库连接详细信息。

注意:确保变量 MYSQL_DATABASEMYSQL_USERMYSQL_PASSWORD 的值与启动数据库时提供的值相同。确保将 NEXTCLOUD_ADMIN_USERNEXTCLOUD_ADMIN_PASSWORD 的值更新为您选择的值。

podman run --detach --pod=nextcloud \
  --env MYSQL_HOST=127.0.0.1 \
  --env MYSQL_DATABASE=nextcloud \
  --env MYSQL_USER=nextcloud \
  --env MYSQL_PASSWORD=NEXTCLOUD_PASSWORD \
  --env NEXTCLOUD_ADMIN_USER=NC_ADMIN \
  --env NEXTCLOUD_ADMIN_PASSWORD=NC_PASSWORD \
  --env NEXTCLOUD_TRUSTED_DOMAINS=<your public IP> \
  --volume nextcloud-appdata:/var/www/html:Z \
  --volume nextcloud-files:/var/www/html/data:Z \
  --restart on-failure \
  --name nextcloud-app \
  docker.io/library/nextcloud:21
  1. --env MYSQL_HOST=127.0.0.1 - 由于数据库和应用程序都位于同一云池中,因此应用程序可以使用 127.0.0.1 访问数据库容器,就像它们都在同一主机上运行一样。
  2. --env NEXTCLOUD_TRUSTED_DOMAINS=<your public IP> - 可信域是下一云使用的安全功能,您需要提供可以访问下一云的每个域的列表。在这种情况下,它将是实例的公共 IP 地址,因为我们将在此处运行 Nextcloud。

要查看启动日志,可以使用:

podman logs -f nextcloud-app

启动完成后,您可以导航到 http://<your_public_ip>:8080 来访问下一云服务器。使用为 NEXTCLOUD_ADMIN_USERNEXTCLOUD_ADMIN_PASSWORD 提供的值登录。

更多学习资源

docs.oracle.com/learn 上浏览其他实验室,或者在 Oracle Learning YouTube 渠道上访问更多免费学习内容。此外,访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心