html

在其庞大的文档、易于使用的 Compose 功能以及与数千个官方和第三方镜像的兼容性之间,Docker 是自托管生态系统中新手的最佳容器运行时。不过,如果你是完全的初学者,Docker 的一些特性可能会让你感到意外,如果不小心,你可能会在启动新容器时犯很多错误。

使用 root 权限部署容器

使用 root 权限部署容器

Docker 支持无根操作

Docker 支持无根操作

当你在新机器上安装 Docker Engine 时,执行任何需要该容器运行时的操作时,你必须使用 sudo 权限。否则,终端会显示错误,因为你的用户帐户没有权限连接到仅限 root 用户的 Docker 守护进程。作为初学者,你可能会想给 Docker 命令授予 sudo 权限来绕过这个问题,但这样会让主机更容易受到权限提升和容器逃逸的风险。

由于 Docker 支持无根操作,你可以管理自托管的应用程序,而无需管理员权限。dockerd-rootless-setuptool.sh 脚本使启用无根模式变得简单,唯一的缺点是你无法在没有额外命令的情况下使用特权端口(1024 以下的端口)。我建议你在家用服务器上安装这个容器运行时后,尽快启用无根模式。

通过将相同的主机端口映射到多个容器导致部署失败 在启动应用程序之前只需运行 docker ps

无论你是依赖 docker run 命令还是使用简单的 Compose 工具来部署容器,肯定会遇到端口映射。简单来说,这个过程就是将主机上的物理端口与容器内部的端口连接起来。问题是什么?你可以在容器端使用相同的端口号,但必须将它们映射到 Docker 服务器上的不同端口。不过,对于初学者来说,很容易搞混哪个端口是主机的,哪个是容器的。如果不小心,可能会导致部署失败。

作为参考,冒号(:)左侧的数字表示主机端口,而右侧的数字指向容器端的端口。如果我的 Docker 服务器上没有运行 Portainer 实例,我会运行 docker ps 命令来确认我希望与新容器连接的主机端口是否被旧应用占用。如果它已经在使用中,我只需修改冒号前的数字,然后用新分配的端口号访问容器的网页界面。

不为关键服务创建持久卷

不为关键服务创建持久卷

或者忘记在之后备份它们

或者忘记在之后备份它们

如果你有一个没有绑定挂载的临时容器,那么你写入的数据会在你关闭它的瞬间丢失。这对数据库、档案管理工具、备份服务,以及几乎所有希望在重启后保留数据的容器来说,都是个大问题。这就是为什么你需要为关键服务创建绑定挂载或持久卷,使用 --volume 参数后跟其持久存储的目录路径。

我还发现新手在使用绑定挂载时常常犯另一个严重的错误。家庭服务器和 Docker 容器本身都是相当实验性的,一个小错误就可能让你失去所有数据。所以,你需要备份关键容器的存储卷,否则你辛苦搭建的应用栈就可能面临失败的风险。

删除容器时保留未使用的卷

删除容器时保留未使用的卷

除非你想把它们留着

除非你想把它们留着

还记得我说过绑定挂载能确保你的数据在容器不再运行时依然保留在主机上吗?那么,如果你在调整完自托管服务后,尝试用 docker rm container_name 删除它,持久卷会留在你的 Docker 主机上。

如果你像我一样习惯在虚拟机中运行 Docker 容器,可能会因为旧应用程序留下的数据而让主机变得拥挤。因此,你可能需要运行 docker volume rm volume_name 命令,或者通过 Portainer、Docker Desktop 或其他 GUI 工具手动删除这些存储目录。顺便提一下,某些容器镜像可能会占用数百兆字节的空间,所以你可能需要定期执行 docker image prune 来清理过时的、悬挂的镜像。

忘记更新容器

忘记更新容器

更糟的是,给关键任务工具配置自动更新

更糟的是,给关键任务工具配置自动更新

说到容器镜像,大多数流行的自托管应用程序都会有新的更新。不过,如果你在容器中运行这些应用,除非更新到新的镜像,否则你就无法使用新功能。而且,如果你手动更新整个堆栈,这个过程会变得相当麻烦。

如果你有 Watchtower(或者它的分支版本),可以自动化容器更新。你也可以用 What’s Up Docker 来配置自动更新功能,不过我不建议这样做,特别是对于重要的自托管服务。因为故障镜像并不少见,而自动化平台又无法检查更新的镜像是否正常工作,如果你运气不好,可能会导致一组服务出问题。我个人是依赖 WUD 的警报触发器,在确认之前先收到新容器镜像的通知,而不是完全依赖自动化平台。

新手使用Docker时需要避免的几个错误

新手使用Docker时需要避免的几个错误

Docker的世界非常深奥,这个列表远未结束。尝试不同的容器没问题,但你应该避免使用来自可疑来源的未经验证的镜像。如果你试图在低端系统上尝试一些资源要求高的服务,你需要手动限制容器堆栈的资源消耗,否则可能会遇到无响应的服务器。

Docker Swarm的高可用性特性听起来很诱人,实际上,它是一个很不错的编排平台——前提是你有足够数量的容器托管节点。理论上,你可以只用两个节点运行一个Swarm设置,但这涉及到一些变通方法,我建议至少使用三个节点,以避免处理法定人数的麻烦。