5 个能让你更好地使用 Docker 的项目
作为Docker 队长和Docker 托管公司的联合创始人,我见过很多人在使用 Docker 时遇到困难并犯下错误。
大多数开发者学习 Docker 的方式是复制粘贴 Stack Overflow 上的 Dockerfile,然后就完事了。但如果你想真正理解容器,了解它们的局限性、怪癖以及如何根据自己的意愿使用它们,就需要亲身实践。以下 5 个实践项目可以帮助你快速提升 Docker 技能。
它们会是你每天都会用到的东西吗?不会。它们会在五年后遇到非常棘手的情况时救你一命吗?也许吧,或者至少我希望如此 :D
1. 在不破坏所有内容的情况下,制作尽可能小的 Docker 镜像
你已经有一个项目了。它可能是 Next.js 前端,也可能是 Flask API。你的挑战是:尽可能精简镜像。不要只是修改基础镜像。实际上,要删除文件和层,直到容器停止工作。
然后弄清楚它为什么会坏。试着解决这个问题。再试一次。再缩小一点。
您将了解您的应用程序真正需要什么、分层如何工作以及依赖关系如何悄悄潜入。
您应该研究一下docker history
或之类的工具dive
来了解里面到底有什么。
2. 尝试将不该 Docker 的东西 Docker 化
选择一些感觉不对的东西。Spotify。图形 IDE。完整的 Linux 桌面环境。甚至是 Windows。
无论如何都要尝试容器化,大多数都会失败。
这就是关键所在。当它崩溃时,问问自己为什么。是 Docker 的限制?内核问题?硬件依赖?还是对图形输出的假设?
除非你尝试过一些荒谬的事情并看到它崩溃,否则你还不能完全理解 Docker。
3. 从头构建基础镜像
大多数人这样编写 Dockerfile:
FROM node
FROM ubuntu
现在换一种做法。改用这个:
FROM scratch
并构建运行您的应用程序的自己的基础映像。
你将了解文件如何进入容器。你将了解一个可运行的二进制文件实际上需要什么。你将明白为什么有些人使用 Alpine,而有些人不使用。你将探索 glibc 是什么。你将理解 CMD 和 ENTRYPOINT 的实际行为。
这对于生产环境来说不太实用,但对于理解容器的工作原理非常有用。(出于对一切神圣事物的热爱,请在生产环境中使用普通镜像。)
4. 参数化你的 Docker 构建
开源项目通常会发布许多版本的 Docker 镜像。一个基于 Debian,另一个基于 Alpine。一个针对大小进行了优化,另一个则专为调试而设计。有些还支持多种 CPU 架构。
尝试构建类似的东西。学习如何使用构建参数。学习如何在 Dockerfile 中编写条件逻辑。学习如何从单个管道生成多个输出。
最重要的是,弄清楚如何避免一遍又一遍地编写相同的蹩脚逻辑。
5. 玩“如果我运行不受信任的代码会怎样”的游戏
假设你想在 Docker 容器内运行不受信任的代码。用户上传了一个脚本,你的后端执行了它。你需要做什么才能确保安全?
试试吧。实际上,在容器中运行不受信任的代码,然后开始锁定。
探索 seccomp 配置文件。将容器设置为只读。使用用户命名空间。放弃权限。尝试提升权限。尝试逃离你自己的沙盒。
这是 Docker 结束和真正的沙盒开始的边缘。
奖励项目:完全跳过 Docker CLI
Docker 只是一个前端,它背后还有其他工具,比如 BuildKit、containerd 和镜像规范。
尝试完全跳过 Docker。
直接使用buildctl
。手动创建 OCI 镜像。无需使用 即可将其推送到镜像仓库docker push
。阅读 OCI 镜像规范并尝试复制 Docker 的操作。
这样做会破坏您对 Docker 的心理模型,并用更准确的东西取而代之。
这是容器学习的最终大佬。
这份清单完整吗?当然不是。总有更多东西需要学习,但我希望这能激励你更深入地学习 :)
干杯, Jonas, Sliplane
联合创始人