在 Rocky Linux 上将 Nextcloud 作为 Podman 容器运行¶
简介¶
本文档解释了在 Rocky Linux 上将 Nextcloud 实例作为 Podman 容器构建和运行所需的所有步骤。更重要的是,整个指南已在 Raspberry Pi 上进行了测试,因此应该与所有 Rocky 支持的处理器架构兼容。
该过程分为多个步骤,每个步骤都有自己的 shell 脚本用于自动化
- 安装
podman
和buildah
包,分别用于管理和构建我们的容器 - 创建一个基础镜像,它将被重新用于我们所需的所有容器
- 创建一个
db-tools
容器镜像,其中包含构建和运行 MariaDB 数据库所需的 shell 脚本 - 将 MariaDB 作为 Podman 容器创建和运行
- 将 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 步:安装 podman
和 buildah
¶
首先,确保您的系统已更新
dnf update
然后,您需要安装 epel-release
仓库,以获取我们将要使用的所有额外软件包。
dnf -y install epel-release
完成后,您可以再次更新(有时这有帮助),或者直接安装我们需要的软件包
dnf -y install podman buildah
安装完成后,运行 podman --version
和 buildah --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