跳到内容

在 Rocky Linux 上运行 Nextcloud 作为 Podman 容器

简介

本文档介绍了在 Rocky Linux 上将 Nextcloud 实例作为 Podman 容器构建和运行所需的所有步骤。更重要的是,本指南已在 Raspberry Pi 上进行了测试,因此它应该与 Rocky 支持的所有处理器架构兼容。

此过程分为多个步骤,每个步骤都有自己的 shell 脚本用于自动化

  1. 分别安装 podmanbuildah 包来管理和构建我们的容器
  2. 创建一个基础镜像,该镜像将被重新用于我们需要的 所有容器
  3. 使用用于构建和运行 MariaDB 数据库的必要 shell 脚本创建 db-tools 容器镜像
  4. 创建和运行 MariaDB 作为 Podman 容器
  5. 创建和运行 Nextcloud 作为 Podman 容器,使用 MariaDB Podman 容器作为后端

您可以手动运行指南中的大多数命令,但是设置一些 bash 脚本可以使您的生活更轻松,尤其是在您想使用不同的设置、变量或容器名称重复这些步骤时。

初学者须知

Podman 是一个用于管理容器的工具,特别是 OCI(开放容器倡议)容器。它的设计几乎与 Docker 兼容,这意味着大多数(如果不是全部)相同命令都可以在两种工具中使用。如果您对“Docker”一无所知,或者只是好奇,您可以在 Podman 自己的网站 上阅读有关 Podman 及其工作原理的更多信息。

buildah 是一个根据“DockerFiles”构建 Podman 容器镜像的工具。

本指南旨在作为一项练习,帮助人们熟悉在一般情况下运行 Podman 容器,尤其是在 Rocky Linux 上。

先决条件和假设

以下是要使本指南生效所需的一切,或者需要知道的一切

  • 熟悉命令行、bash 脚本和编辑 Linux 配置文件。
  • 如果在远程机器上工作,则需要 SSH 访问权限。
  • 您选择的基于命令行的文本编辑器。在本指南中,我们将使用 vi
  • 一台连接到互联网的 Rocky Linux 机器(同样,Raspberry Pi 可以很好地工作)。
  • 许多这些命令必须以 root 身份运行,因此您需要一台机器上的 root 或具有 sudo 权限的用户。
  • 熟悉 Web 服务器和 MariaDB 肯定会有所帮助。
  • 熟悉容器和 Docker 绝对是一个加分项,但并非绝对必要。

步骤 01: 安装 podmanbuildah

首先,确保您的系统是最新的

dnf update

然后,您需要安装 epel-release 存储库,以便获得我们将使用的所有额外软件包。

dnf -y install epel-release 

完成后,您可以再次更新(有时会有所帮助)或直接安装我们需要的软件包

dnf -y install podman buildah

安装完成后,运行 podman --versionbuildah --version 以确保一切正常工作。

要访问 Red Hat 的注册表以下载容器镜像,您需要运行

vi /etc/containers/registries.conf

找到看起来像下面这样的部分。如果它被注释掉了,请取消注释。

[registries.insecure]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io'] 
insecure = true

步骤 02: 创建 base 容器镜像

在本指南中,我们以 root 用户身份工作,但您可以在任何主目录中执行此操作。如果您还没有,请切换到 root 目录

cd /root

现在创建您需要的所有用于各种容器构建的目录

mkdir base db-tools mariadb nextcloud

现在将您的工作目录更改为基础镜像的文件夹

cd /root/base

并创建一个名为 DockerFile 的文件。是的,Podman 也使用它们。

vi Dockerfile

将以下文本复制并粘贴到您的全新 DockerFile 中。

FROM rockylinux/rockylinux:latest
ENV container docker
RUN yum -y install epel-release ; yum -y update
RUN dnf module enable -y php:7.4
RUN dnf install -y php
RUN yum install -y bzip2 unzip lsof wget traceroute nmap tcpdump bridge-utils ; yum -y update
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

保存并关闭上一个文件,然后创建一个新的 bash 脚本文件

vi build.sh

然后粘贴以下内容

#!/bin/bash
clear
buildah rmi `buildah images -q base` ;
buildah bud --no-cache -t base . ;
buildah images -a

现在使用以下命令使您的构建脚本可执行

chmod +x build.sh

并运行它

./build.sh

等待它完成,然后继续下一步。

步骤 03: 创建 db-tools 容器镜像

为了本指南的目的,我们将数据库设置保持尽可能简单。您需要跟踪以下内容并根据需要进行修改

  • 数据库名称:ncdb
  • 数据库用户:nc-user
  • 数据库密码:nc-pass
  • 您的服务器 IP 地址(我们将在下面使用示例 IP)

首先,切换到您将要构建 db-tools 镜像的文件夹

cd /root/db-tools

现在设置一些将在 Podman 容器镜像内使用的 bash 脚本。首先,创建一个将自动为您构建数据库的脚本

vi db-create.sh

现在将以下代码复制并粘贴到该文件中,使用您喜欢的文本编辑器

#!/bin/bash
mysql -h 10.1.1.160 -u root -p rockylinux << eof
create database ncdb;
grant all on ncdb.* to 'nc-user'@'10.1.1.160' identified by 'nc-pass';
flush privileges;
eof

保存并关闭,然后使用用于根据需要删除数据库的脚本重复这些步骤

vi db-drop.sh

将以下代码复制并粘贴到新文件中

#!/bin/bash
mysql -h 10.1.1.160 -u root -p rockylinux << eof
drop database ncdb;
flush privileges;
eof

最后,设置 db-tools 镜像的 DockerFile

vi Dockerfile

复制并粘贴

FROM localhost/base
RUN yum -y install mysql
WORKDIR /root
COPY db-drop.sh db-drop.sh
COPY db-create.sh db-create.sh

最后但并非最不重要的是,创建一个 bash 脚本,以便在命令行中构建镜像

vi build.sh

您需要使用的代码

#!/bin/bash
clear
buildah rmi `buildah images -q db-tools` ;
buildah bud --no-cache -t db-tools . ;
buildah images -a

保存并关闭,然后使文件可执行

chmod +x build.sh

并运行它

./build.sh

步骤 04:创建 MariaDB 容器镜像

您正在掌握这个过程,对吧?现在是时候构建实际的数据库容器了。将工作目录更改为 /root/mariadb

cd /root/mariadb

创建一个脚本,以便在您需要时(重新)构建容器

vi db-init.sh

以下是您需要使用的代码

警告

为了本指南的目的,以下脚本将删除所有 Podman 卷。如果您有其他使用其自身卷运行的应用程序,请修改/注释掉“podman volume rm --all”行;

#!/bin/bash
clear
echo " "
echo "Deleting existing volumes if any...."
podman volume rm --all ;
echo " "
echo "Starting mariadb container....."
podman run --name mariadb --label mariadb -d --net host -e MYSQL_ROOT_PASSWORD=rockylinux -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v mariadb-data:/var/lib/mysql/data:Z mariadb ;

echo " "
echo "Initializing mariadb (takes 2 minutes)....."
sleep 120 ;

echo " "
echo "Creating ncdb Database for nextcloud ....."
podman run --rm --net host db-tools /root/db-create.sh ;

echo " "
echo "Listing podman volumes...."
podman volume ls

以下是在您需要时重置数据库的脚本

vi db-reset.sh

以下是代码

#!/bin/bash
clear
echo " "
echo "Deleting ncdb Database for nextcloud ....."
podman run --rm --net host db-tools /root/db-drop.sh ;

echo " "
echo "Creating ncdb Database for nextcloud ....."
podman run --rm --net host db-tools /root/db-create.sh ;

最后,这是将整个 mariadb 容器组合在一起的构建脚本

vi build.sh

以及它的代码

#!/bin/bash
clear
buildah rmi `buildah images -q mariadb` ;
buildah bud --no-cache -t mariadb . ;
buildah images -a

现在,只需创建您的 DockferFile(vi Dockerfile),然后粘贴以下单行

FROM arm64v8/mariadb

现在,使您的构建脚本可执行并运行它

chmod +x *.sh

./build.sh

步骤 05:构建和运行 Nextcloud 容器

我们已经到了最后一步,过程几乎重复。更改到 Nextcloud 镜像目录

cd /root/nextcloud

这次先设置您的 DockerFile,为了多样性

vi Dockerfile

注意

此后的部分假设 ARM 架构(适用于 Raspberry Pi),因此,如果您使用的是其他架构,请记住更改此部分。

然后粘贴此部分

FROM arm64v8/nextcloud

现在创建您的构建脚本

vi build.sh

然后粘贴此代码

#!/bin/bash
clear
buildah rmi `buildah images -q nextcloud` ;
buildah bud --no-cache -t nextcloud . ;
buildah images -a

现在,我们将在主机服务器上设置一些本地文件夹(不在任何 Podman 容器中),以便我们可以重建容器和数据库,而不必担心丢失所有文件

mkdir -p /usr/local/nc/nextcloud /usr/local/nc/apps /usr/local/nc/config /usr/local/nc/data

最后,我们将创建实际为我们构建 Nextcloud 容器的脚本

vi run.sh

以下是您需要的全部代码。确保将 MYSQL_HOST 的 IP 地址更改为运行 MariaDB 实例的 docker 容器的 IP 地址。

#!/bin/bash
clear
echo " "
echo "Starting nextloud container....."
podman run --name nextcloud --net host --privileged -d -p 80:80 \
-e MYSQL_HOST=10.1.1.160 \
-e MYSQL_DATABASE=ncdb \
-e MYSQL_USER=nc-user \
-e MYSQL_PASSWORD=nc-pass \
-e NEXTCLOUD_ADMIN_USER=admin \
-e NEXTCLOUD_ADMIN_PASSWORD=rockylinux \
-e NEXTCLOUD_DATA_DIR=/var/www/html/data \
-e NEXTCLOUD_TRUSTED_DOMAINS=10.1.1.160 \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v /usr/local/nc/nextcloud:/var/www/html \
-v /usr/local/nc/apps:/var/www/html/custom_apps \
-v /usr/local/nc/config:/var/www/html/config \
-v /usr/local/nc/data:/var/www/html/data \
nextcloud ;

保存并关闭,使所有脚本可执行,然后先运行镜像构建脚本

chmod +x *.sh

./build.sh

要确保所有镜像都已正确构建,请运行 podman images。您应该看到类似于以下内容的列表

REPOSITORY                      TAG    IMAGE ID     CREATED      SIZE
localhost/db-tools              latest 8f7ccb04ecab 6 days ago   557 MB
localhost/base                  latest 03ae68ad2271 6 days ago   465 MB
docker.io/arm64v8/mariadb       latest 89a126188478 11 days ago  405 MB
docker.io/arm64v8/nextcloud     latest 579a44c1dc98 3 weeks ago  945 MB

如果一切正常,请运行最终脚本以使 Nextcloud 正常运行

./run.sh

当您运行 podman ps -a 时,您应该看到类似于以下内容的运行容器列表

CONTAINER ID IMAGE                              COMMAND              CREATED        STATUS            PORTS    NAMES
9518756a259a docker.io/arm64v8/mariadb:latest   mariadbd             3 minutes  ago Up 3 minutes ago           mariadb
32534e5a5890 docker.io/arm64v8/nextcloud:latest apache2-foregroun... 12 seconds ago Up 12 seconds ago          nextcloud

从那里,您应该能够将浏览器指向您的服务器 IP 地址。如果您正在按照操作说明进行操作,并且与我们的示例具有相同的 IP 地址,您可以在此处替换它(例如,http://your-server-ip),然后查看 Nextcloud 是否已启动并运行。

结论

显然,此指南需要在生产服务器上进行一些修改,尤其是在 Nextcloud 实例旨在面向公众时。但是,这应该可以为您提供有关 Podman 工作原理以及如何使用脚本和多个基本镜像进行设置以使重建更轻松的基本了解。

作者:Ananda Kammampati

贡献者:Ezequiel Bruni,Steven Spencer,Ganna Zhyrnova