跳至内容

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

简介

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

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

  1. 安装 podmanbuildah 包,分别用于管理和构建我们的容器
  2. 创建一个基础镜像,它将被重新用于我们所需的所有容器
  3. 创建一个 db-tools 容器镜像,其中包含构建和运行 MariaDB 数据库所需的 shell 脚本
  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 目录,请切换到 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 Volume。如果您有其他运行着自己卷的应用程序,请修改/注释掉“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