DesignSpark Electrical Logolinkedin
菜单 搜寻
提问问题

树莓派4 个人数据中心第 1 部分:Ansible、Docker 及 Nextcloud

Pi 4具有许多优点,尤其适合私人住宅或办公室的云服务器使用。

在这一系列的文章中,我们将介绍如何使用 Raspberry Pi 4 来创建个人云解决方案,该解决方案由多个大型云平台广泛使用的 Ansible 和 Docker 两款功能强大的工具来管理,可自动执行配置任务并为应用提供容器化服务。

第一篇文章即本文,主要了解一下 Raspbian 的初始配置,然后设置 Ansible 和 Docker,最后使用这些工具来安装 Nextcloud。

Nextcloud 提供全面托管服务,包括文件共享、日历编排和视频会议等等。但是正如我们所见,这只是一个开始,当工具设置到位后,性能出众的 Pi 4 可以作为个人云服务器快速投入许多其他用途。

硬件

Raspberry Pi 3 型号 B 采用四核处理器,性能不容小觑,而全新推出的 Pi 4 采用升级版的系统芯片,性能更是进一步显著提升。不仅如此,该系列型号配有高达 4GB 的 RAM,能够运行更多更高级、更大型的工作负载。除此之外,该系列产品的以太网由 100M 升级至 1G,并从 USB 2.0 升级至 USB 3.0,尤其适合用作个人服务器,也可连接快速外部存储器。

OKdo Raspberry Pi 4 4GB 型号 B 入门级套件 (192-5286) 可提供初始启动和运行需要的一切资源:4GB Pi 4、散热器、带风扇的外壳、主电源、电缆、一个 32GB Micro SD 卡以及一个 SD 读卡器。

基本设置

鉴于这是一台“无头”服务器,如果首先要下载最新版的 Raspbian,则应选择 Lite 版。映像解压缩后需要写入到 SD 卡和 Linux 中,此操作可通过下述命令实现:

$ sudo dd if=2019-09-26-raspbian-buster-lite.img of=/dev/mmcblk0 bs=1M

请注意,输入文件名 (if) 随 Raspbian 版本而不同,输出文件名 (of) 则随您的系统而有所不同。使用 dd 命令时务必格外小心,如果不确定或者使用的是 Windows 或 Mac 操作系统,请参阅安装指南

如果要连网配置 Raspberry Pi,请参阅 SSH 说明文档。也可以使用 VNC,但这需要安装 Raspbian 的完整桌面版本,而这对服务器而言有点不堪重负,会占用太多的磁盘空间。

在启动后,可通过下述命令来应用最新的 Raspbian 更新:

$ sudo apt update
$ sudo apt dist-upgrade

如需将主机名设置为更有意义的名称,需要编辑两个文件。例如,使用 nano:

$ sudo nano /etc/hostname
$ sudo nano /etc/hosts

两个文件中都包含“raspberrypi”,请用您选择的主机名替换该项。例如,如果您使用的主机名是“cloud”,则在重新启动 Pi 后,可使用下面的命令通过 SSH 从另一 Linux 系统进行连接:

 

$ ssh pi@cloud.local

Ansible

Ansible 是一款功能强大的开源软件,具有调配、配置管理和应用部署功能。简而言之,它可以帮助您自动执行一些无聊且易出错的复杂任务。也意味着通过编写上述用途的 Ansible 脚本,您可以略微偷偷懒,少执行一些注释,因为您不必事无巨细地记住所有步骤。此外,通过 Ansible 中神奇的“角色”,我们还可以借助预封装的工作单元充分利用由其他途径自动执行的常见任务。

所以,首先假设我们使用 Raspbian 软件包管理系统来安装 Ansible,还有 Python 模块来帮助管理 Docker:

$ sudo apt install ansible python3-docker

之后安装一个用于自动设置 Docker 的 Ansible 角色,只需输入下述命令:

$ ansible-galaxy install geerlingguy.docker_arm

请注意,此命令安装的不是 Docker,只是一个名为 geerlingguy.docker_arm 的角色。

另外还有许多角色可以随意用于自动执行各种任务,详情参见 Ansible Galaxy 网站

安装Docker

我们刚刚已经使用 Raspian 软件包管理系统安装了 Docker(使用 apt 或 apt-get 命令),但接下来我们要借助 Ansible playbook(基本的任务列表)使用刚安装的 Ansible 角色。

Playbook 使用 YAML 编写,所以我们必须小心确保缩进使用的是空格而不是制表符!假设我们创建了一个名为 docker.yml 的文件且其中包含以下内容:

---
- name: "Docker playbook"
  hosts: localhost
  connection: local
  become: yes
  vars:
    docker_install_compose: false
    docker_users:
      - pi
  roles:
    - geerlingguy.docker_arm

此文件意味着,该 playbook 的名称是“Docker playbook”并应在本地计算机上运行 — 在本例中也就是 Raspberry Pi。“become: yes”一行是指在执行任务前我们需要成为根用户。用户“pi”包含在 docker_users 变量中,表示需要将其添加到 docker 组中才能用于管理容器。最后,指定实际用来设置 Docker 的角色。

Ansible playbook 常用于配置大量的远程服务器,在此类情形中,将在以“hosts:”开头的行中指定这些服务器,而不使用 localhost(本地计算机)。事实上,您可以从不同的计算机上运行该 playbook,然后使用 Ansible 通过 SSH 远程配置 Raspberry Pi,但是为了简单起见,我们还是直接在 Pi 上运行 playbook

好了,现在运行我们的第一个 playbook!

$ ansible-playbook docker.yml

请注意,我们不需要在命令前面加上 sudo 前缀。这是因为 playbook 中包含“become: yes”一行,所以我们在运行任务前就会变成根用户。

顺利完成所有操作后,输出屏幕如上所示。

最后,playbook 完成时为零个失败的“plays”。

Docker 此时应已安装完毕且已启动。其中的 ps 命令会让您看到三个运行中的容器。而先前所看到的,我们之所以在第一次运行时会失败,是因为我们没有在 docker 组中。但是我们必须先退出再重新登录,然后选择 docker 组,之后才能使用命令管理 Docker。

Docker 基础知识

Docker 提供了可用于对应用及其所有相关项进行打包的容器化系统,所以大体上而言,您可以在任何形式或版本的 Linux 系统上部署 Docker 容器,前提是该系统上有 Docker。这将大幅降低不同分布和版本的软件的维护开销。不仅如此,它还可以将软件的不同部分整齐地捆绑在一起,并轻松分发复杂的应用堆栈。

软件分发通过映像实现,而这些映像一般发布在诸如 Docker Hub 之类的在线存储库中。在创建新容器时,系统首先会从在线存储库中拉取所需的映像,当您的机器上存在本地副本后,将使用该副本来创建容器。

Docker 还有其他一些实用有趣的功能,包括在容器间设置私有网络以及将外部 IP 地址上的端口映射至容器内的端口。这些功能将助您轻松拥有多个基于相同或不同映像并在不同端口上运行的容器。例如,适合家庭和工作使用的应用实例,或用于开发制作和测试的应用实例。

由于数据与 Docker 容器分开保存,因此您可以在删除容器的同时保留应用数据,随后再部署一个可能使用更新映像的新容器,且该容器已配置为使用存储在现有数据卷中的数据。

下面是一些非常有帮助的命令:

  • docker image ls(列出机器上的映像)
  • docker ps(显示运行中的容器)
  • docker volume ls(列出数据卷)
  • docker start|stop|restart(启动、停止或重新启动容器)
  • docker logs(显示容器的日志)
  • docker inspect(显示容器配置)
  • docker volume inspect(显示数据卷配置)
  • docker rm(删除容器)
  • docker volume rm(删除数据卷)

关于 Docker 有一点要特别注意,与虚拟化中具有多个副本不同,在 Docker 中我们只有所运行的操作系统的一个副本。这就意味着 Docker 能够更高效地利用资源,因为我们不必向虚拟机分配 CPU 和内存,然后再一一运行各个操作系统副本。相反,尽管应用驻留在各自的容器中,但我们可以同时并行运行所有应用,从而提升管理性能和安全性。

安装Nextcloud

---
- name: "Nextcloud playbook"
  hosts: localhost
  connection: local
  become: yes
  tasks:
    - docker_container:
        restart: yes
        restart_policy: always
        name: nextcloud
        image: ownyourbits/nextcloudpi
        pull: yes
        volumes:
          - 'ncdata:/data'
        ports:
          - '80:80'
          - '443:443'
          - '4443:4443'

上面是 playbook 文件 nextcloud.yml 中的内容,我们将使用该文件并借助 Docker 容器来安装 Nextcloud。这次不使用现成的“角色”,我们已经指定了任务,第一个也是唯一的任务就是设置具有以下配置的 docker 容器:

  • 要在失败时始终重新启动容器(应用)
  • 将“nextcloud”用作容器名称
  • 使用容器映像 ownyourbits/nextcloud-armhf 进行部署
  • 始终拉取最新的映像版本
  • 使用名为“ncdata”的数据卷来存储用户数据
  • 将外部端口映射至内部端口:80>80 及 443>443

映射功能为我们提供了很大的灵活性使用,通过映射数据可实现以下目的:将数据卷 ncdata 安装(显示)在容器内,/data 作为端口号用于连接网络。

要运行 playbook,只需输入:

$ ansible-playbook nextcloud.yml

再一次,此过程也会顺利完成,不会出现失败的情形。我们也可以通过下面的命令来检查容器日志:

$ docker logs nextcloud

系统将会显示如上所示的输出。

配置Nextcloud

我们选择的 Nextcloud 容器通常作为全能 SD 卡映像的一部分单独使用,其主机名配置为“nextcloudpi”。但我们最终希望能够将它与其他应用一起运行,所以为 Raspberry Pi 选择了一个更为常用的主机名。因此需要略作一些配置。

如果浏览至 http://cloud.local(或您配置的其他主机名),将由此页面重定向至安全的页面,而且最开始可能会出现证书错误消息需要我们确认。之后将会显示一个类似上面的页面,提供 NextcloudPi 以及 Nextcloud Web 界面的详细登录信息。注意务必将这些登录信息记下来。此外,除非我们之前确实使用了 nextcloudpi 作为主机名,否则需要将两个 URL 修改为使用我们选择的主机名。

选择“Activate”按钮,之后即可在 NextcloudPi Web 界面中对 Nextcloud 系统进行一些重要更改,并加载此项(带后缀 :4443 的一项)。明确地说,就是 https://<hostname>.local:4443。

下面,我们需要从左侧菜单中选择 nc-trusted-domains 并输入相应的域。例如,如果主机名为“cloud”,则此值为“cloud.local”。然后选择“Apply”。

最后,访问另一个 URL,即 https://<hostname>.local(无后缀 :4443)。然后使用另一组凭据从激活页面登录。现在,我们就可以开始创建新用户、上传文件、进行协作、使用应用以及安装新应用。

Nextcloud 有一个活力十足的开发者生态系统和大量优质应用,可从 Web 界面中一键安装,非常简单。此外还有一些适合 Android 和 iOS 系统的配套应用。

总结

我们并没有采取最简单的方式来启动及在我们的 Raspberry Pi 上运行 Nextcloud,但我们的方式更便于我们随时在同一块 Pi 板上或其他 Pi 板上重新进行部署!不仅如此,在接下来的一篇文章中,您还会了解到这种方式可以帮助我们轻松便捷地并行运行和管理其他应用。

  — Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.

9 Mar 2020, 3:14