ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

nerdctl 在 FreeBSD 上的实验性支持:运行 FreeBSD Jail 与 Linux 容器的实战指南

nerdctl 在 FreeBSD 上的实验性支持:运行 FreeBSD Jail 与 Linux 容器的实战指南 nerdctl 在 FreeBSD 上的实验性支持运行 FreeBSD Jail 与 Linux 容器的实战指南【免费下载链接】nerdctlcontaiNERD CTL - Docker-compatible CLI for containerd, with support for Compose, Rootless, eStargz, OCIcrypt, IPFS, ...项目地址: https://gitcode.com/gh_mirrors/ne/nerdctl本篇技术指南聚焦 nerdctl 对 FreeBSD 主机的实验性支持如何在 FreeBSD 上借助 containerd 与 runj shim 运行 FreeBSD jail以及如何通过--platform linux在 FreeBSD 主机上运行 Linux 容器。读完本文你将掌握 FreeBSD 环境下的安装前置条件、可用的nerdctl run命令组合、默认运行时与路径配置以及当前网络、挂载、安全特性方面的已知限制从而判断该实验特性是否适合你的使用场景。FreeBSD 支持现状非常早期的实验阶段nerdctl 官方在 docs/freebsd.md 中明确标注FreeBSD runtimes 目前处于非常早期very early stage的开发阶段。这意味着该能力仅提供实验性experimental支持nerdctl 可以在 FreeBSD 主机上创建并运行 FreeBSD jail 容器但功能集远未达到 Linux 平台的完整度。从源码结构看FreeBSD 相关实现分散在带freebsd或!linux构建标签的文件中大量平台特性以未实现或空操作占位具体差异会在下文逐一展开。安装前置条件containerd runj shim要在 FreeBSD 上使用 nerdctl 运行容器你需要准备两样东西最新版本的 containerd——FreeBSD 支持依赖 containerd 对 FreeBSD 的持续适配请获取最新的构建版本一个可用的 containerd shim——官方文档推荐的示例是runj一个用于在 FreeBSD 上运行 OCI 兼容 jail 的运行时实现。两者都需要按照各自仓库的构建说明自行编译安装。安装完成后nerdctl 在 FreeBSD 上默认使用的运行时是wtf.sbk.runj.v1这一点可以在 pkg/defaults/defaults_freebsd.go 中确认const ( AppArmorProfileName SeccompProfileName Runtime wtf.sbk.runj.v1 )其中Runtime正是 runj 暴露给 containerd 的运行时名称而AppArmorProfileName、SeccompProfileName均为空字符串说明 AppArmor / Seccomp 这类 Linux 安全加固特性在 FreeBSD 上不可用详见下文限制与已知问题。用法实战两条核心命令FreeBSD 主机上的nerdctl run用法十分简洁目前只支持两条路线。运行 FreeBSD jail 容器使用dougrabson/freebsd13.2-small镜像可以启动一个 FreeBSD 13 jailnerdctl run --net none -it dougrabson/freebsd13.2-small要点拆解--net none当前 FreeBSD 上唯一受支持的网络模式必须显式指定详见限制与已知问题-it分配交互式终端进入 jail 的 shelldougrabson/freebsd13.2-small一个精简的 FreeBSD 13.2 根文件系统镜像专门用于 jail 容器场景。从源码角度看运行 FreeBSD 容器时与运行 Linux 容器的路径基本一致但nerdctl会跳过若干 Linux 专属的 OCI 规范项。例如 pkg/cmd/container/run_unix_nolinux.go构建标签unix !linux中func WithoutRunMount() func(...) error { // not valid on freebsd return func(...) error { return nil } } func setPlatformOptions(...) ([]oci.SpecOpts, error) { return []oci.SpecOpts{}, nil }也就是说FreeBSD 上既不会注入运行期挂载run mount平台相关 OCI 选项也保持为空全部交由 runj shim 依据 FreeBSD jail 语义处理。在 FreeBSD 上运行 Linux 容器通过--platform参数可以在 FreeBSD 主机上运行 Linux 容器例如 amazonlinuxnerdctl run --platform linux --net none -it amazonlinux:2注意该能力是否能真正落地取决于运行环境是否具备对应的 Linux 二进制翻译/模拟能力如 binfmt 或 FreeBSD 上的 Linux 兼容层。nerdctl 侧对平台的支持范围可以在 pkg/buildkitutil/buildkitutil.go 看到supportedOses : []string{linux, freebsd, windows}即 linux 与 freebsd 都是官方认可的平台值。关于--platform freebsd的实验性开关如果你尝试在非 FreeBSD 主机上显式指定--platform freebsd例如 Linux 主机上创建 FreeBSD 平台容器还需要先开启 experimental 模式。相关校验位于 cmd/nerdctl/container/container_create.goif (createOpt.Platform windows || createOpt.Platform freebsd) !createOpt.GOptions.Experimental { return fmt.Errorf(%s requires experimental mode to be enabled, createOpt.Platform) }也就是说windows 与 freebsd 一样均属于需要NERDCTL_EXPERIMENTALtrue或等价 experimental 开关才能使用的平台。同理nerdctl run在 FreeBSD 上的帮助文本中也会显示警告实验性支持、且当前必须使用--netnone见 cmd/nerdctl/container/container_run.go。FreeBSD 平台的默认配置一览从 pkg/defaults/defaults_freebsd.go 可以完整梳理 nerdctl 在 FreeBSD 上的默认路径与空值配置配置项FreeBSD 默认值说明默认运行时wtf.sbk.runj.v1runj 的 OCI 运行时名数据目录DataRoot/var/lib/nerdctl与 Linux 保持一致CNI 插件目录CNIPath/opt/cni/binCNI 目录仍保留默认值但实际不可用CNI 网络配置目录CNINetConfPath/etc/cni/net.d同上CNI 运行时目录CNIRuntimeDir/var/run/cni同上cgroup 管理器空字符串FreeBSD 无 cgroupcgroupns 模式空字符串无 cgroup 命名空间配置文件路径NerdctlTOML/etc/nerdctl/nerdctl.toml全局配置读取位置hosts 目录HostsDirs/etc/containerd/certs.d,/etc/docker/certs.d镜像仓库 TLS 配置CDI 目录CDISpecDirs/etc/cdi,/var/run/cdi设备注入规范目录限制与已知问题网络CNI 尚未移植唯一支持none这是当前最核心的限制。官方文档明确指出CNI 及 CNI 插件尚未移植到 FreeBSD唯一支持的网络类型是none。也就是说在 FreeBSD 主机上nerdctl run必须携带--net nonebridge / host / macvlan 等网络模式均不可用。这与 cmd/nerdctl/container/container_run.go 中 FreeBSD 警告信息currently requires--netnone相互印证。社区/上游仍在推进 CNI 的 FreeBSD 移植工作在完成之前jail 容器的网络隔离只能依赖 FreeBSD 自身的 jail 网络机制。根文件系统缺失文件/etc/hosts 与 /etc/resolv.confFreeBSD 精简根文件系统镜像中通常不存在/etc/hosts、/etc/resolv.conf、/etc/hostname等文件。为此nerdctl 在 pkg/containerutil/container_network_manager.go 中对这些挂载做了平台判断——仅在runtime.GOOS linux时才生成/etc/resolv.conf、/etc/hosts、/etc/hostname的 OCI 挂载选项// /etc/host does not exist in FreeBSD minimal rootfs image // /etc/resolv.conf does not exist in FreeBSD minimal rootfs image specs : []oci.SpecOpts{} if runtime.GOOS linux { specs []oci.SpecOpts{ withDedupMounts(/etc/resolv.conf, withCustomResolvConf(resolvConfPath)), withDedupMounts(/etc/hosts, withCustomHosts(etcHostsPath)), } } // /etc/hostname does not exist on FreeBSD if runtime.GOOS linux { ... }这解释了为什么--net none之外的模式在 FreeBSD 上暂时没有意义——连 DNS 与 hosts 文件的注入都仅面向 Linux 生效。挂载与卷nullfs、无 bind mount、tmpfs/--mount 未实现FreeBSD 不支持 Linux 语义的 bind mountnerdctl 在 pkg/mountutil/mountutil_freebsd.go 中为此专门做了适配const ( DefaultMountType nullfs // FreeBSD 默认挂载类型 // FreeBSD doesnt support bind mounts. DefaultPropagationMode )该文件还展示了更多限制卷选项parseVolumeOptions仅接受rw/ro其余选项会打印unsupported volume option警告ProcessFlagTmpfs直接返回errdefs.ErrNotImplemented——--tmpfs在 FreeBSD 上未实现ProcessFlagMount同样返回errdefs.ErrNotImplemented——--mount在 FreeBSD 上未实现重复的读写选项同时出现多个rw/ro会报错duplicated read/write volume option。安全与系统特性AppArmor/Seccomp/cgroup 全部不可用FreeBSD 没有 Linux 的 AppArmor、Seccomp 与 cgroup 机制源码中的占位实现清晰体现了这一点pkg/defaults/defaults_freebsd.goAppArmorProfileName 、SeccompProfileName 、CgroupManager() 、CgroupnsMode() pkg/infoutil/infoutil_freebsd.goUnameO FreeBSDCgroupsVersion()返回空字符串fulfillPlatformInfo标记为 unimplementedpkg/cmd/container/exec_nolinux.gosetExecCapabilities在 FreeBSD 上为空操作no-op因为 Linux capabilities 概念不适用于 jail系统信息中的 cgroup 版本、SELinux 等字段均无实际数据支撑。测试支持镜像与覆盖范围有限从测试基础设施看FreeBSD 的集成测试覆盖面刻意收窄pkg/testutil/testutil_freebsd.go 定义了 FreeBSD 测试通用镜像docker.io/knast/freebsd:13-STABLE而 Busybox、Alpine、Nginx、Golang 等 Linux 常用测试镜像在 FreeBSD 上均显式置为there-is-no-such-test-on-freebsd即这些测试不会在 FreeBSD 上运行pkg/testutil/nerdtest/platform/platform_freebsd.go 中DataHome()直接panic(not supported)注释说明这些常量仅为了让 FreeBSD 通过编译与 lint对应测试只运行在 Linux 上。总结何时适合尝试 FreeBSD 支持综合官方文档与源码证据nerdctl 的 FreeBSD 支持可以这样概括可用nerdctl run --net none -it freebsd-image运行 FreeBSD jailnerdctl run --platform linux --net none -it linux-image运行 Linux 容器前置最新 containerd runj shim默认运行时wtf.sbk.runj.v1受限网络仅none--tmpfs、--mount未实现卷挂载走 nullfsAppArmor/Seccomp/cgroup 不可用--platform freebsd需要 experimental 模式定位实验性、非常早期适合评估与贡献者尝鲜不适合直接承载生产工作负载。如果你计划参与改进可以从上文标注的占位实现入手ProcessFlagTmpfs/ProcessFlagMount挂载、CNI 移植网络、fulfillPlatformInfo系统信息都是明确的待完善点相关代码与测试均可直接在 pkg 与 cmd/nerdctl/container 目录下查阅。【免费下载链接】nerdctlcontaiNERD CTL - Docker-compatible CLI for containerd, with support for Compose, Rootless, eStargz, OCIcrypt, IPFS, ...项目地址: https://gitcode.com/gh_mirrors/ne/nerdctl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表