跳转到内容
搜索文档

常见问题解答

最后更新 查看 MarkdownAgent 设置

容器日志如何工作?

要在仪表板中获取日志(包括实时尾随日志),请在您的 Worker 的 wrangler 配置中将 observability 切换为 true:

{
	"observability": {
		"enabled": true
	}
}
[observability]
enabled = true

日志受与 Worker 日志相同的限制 的约束,这意味着在免费计划中它们将保留 3 天,在付费计划中将保留 7 天。

有关成本的详细信息,请参阅 Workers 日志定价

如果您是企业用户,则可以通过 Logpush 将容器日志导出到您的首选目的地。

容器实例位置是如何选择的?

首次部署容器时,Cloudflare 将在我们的网络中选择多个位置来部署实例。这些位置将跨越多个区域。

当使用 this.ctx.container.start 请求容器实例时,将从预初始化的位置中选择最近的空闲容器实例。这很可能与外部请求在同一区域,但也可能不是。一旦容器实例运行,任何未来的请求都将被路由到初始位置。

示例:

  • 用户部署了一个容器。Cloudflare 会在其网络中自动准备好实例。
  • 来自阿根廷巴里洛切的客户端发出请求。它到达了位于阿根廷内乌肯的 Cloudflare 位置的 Worker。
  • 此 Worker 请求调用 MY_CONTAINER.get("session-1337"),从而启动 Durable Object,然后调用 this.ctx.container.start
  • 这将请求最近的空闲容器实例。
  • Cloudflare 识别到阿根廷布宜诺斯艾利斯有一个空闲实例,并在那里启动它。
  • 不同的用户需要路由到同一个容器。该用户的请求到达了运行在圣地亚哥的 Cloudflare 位置的 Worker。
  • Worker 再次调用 MY_CONTAINER.get("session-1337")
  • 如果初始容器实例仍在运行,请求将被路由到布宜诺斯艾利斯的位置。如果初始容器已进入休眠状态,Cloudflare 将再次尝试查找最近的容器“空闲”实例,可能在北美,并在那里启动实例。

容器更新和推出如何工作?

有关详细信息,请参阅推出文档

扩展如何工作?

容器通过创建或寻址特定实例来进行扩展。要跨固定数量的可互换实例进行无状态路由,请使用 getRandom 辅助程序。

有关详细信息,请参阅扩展和路由

是否提供适用于无状态应用程序的内置自动扩展?

目前尚未提供,但 Cloudflare 计划在未来的版本中添加内置自动扩展。

在此之前,对于简单的无状态路由请使用 getRandom,在需要显式控制容器生命周期时请使用特定实例 ID。

什么是冷启动?它们有多快?

冷启动是指从完全停止的状态启动容器实例。

如果您使用全新的 ID 调用 env.MY_CONTAINER.get(id) 并首次启动此实例,则会导致冷启动。

这将首次从其入口点启动容器镜像。根据该入口点执行的操作,启动需要的时间会有所不同。

容器冷启动通常在 1-3 秒的范围内,但这取决于镜像大小和代码执行时间等其他因素。

如何使用现有的容器镜像?

有关详细信息,请参阅镜像管理文档

磁盘是持久的吗?当我的容器休眠时,我的磁盘会发生什么?

所有磁盘都是临时的。当容器实例进入休眠状态时,下次启动它时,它将拥有由其容器镜像定义的全新磁盘。

快照即将推出,它允许用户快速持久化并从整个容器或目录中恢复磁盘。

您还可以使用 FUSE 将磁盘持久化到 R2 或其他对象存储后端。但是,您不应期望在使用 FUSE 时获得原生类 SSD 的性能。

如果内存不足会发生什么?

如果内存不足,您的实例将引发内存不足 (OOM) 错误并将重新启动。

容器不使用交换内存。

实例可以运行多长时间?当主机服务器关闭时会发生什么?

Cloudflare 不会在特定时间后主动关闭容器实例。如果您未在容器类上设置 sleepAfter 或手动停止实例,它将继续运行,除非其主机服务器重新启动。这种情况的发生频率是不固定的,但足够频繁,因此 Cloudflare 不保证任何实例会在任何设定的时间段内运行。

当容器实例即将关闭时,它会被发送一个 SIGTERM 信号,然后在 15 分钟后发送一个 SIGKILL 信号。您应在此期间执行任何必要的清理工作以确保优雅关闭。此后不久,容器实例将在其他位置重新启动。

如何将机密传递给我的容器?

您可以使用 Worker SecretsSecrets Store 为您的 Workers 定义机密。

有关实现详细信息,请参阅环境变量和机密

我可以在容器内运行 Docker (Docker-in-Docker) 吗?

可以。使用 docker:dind-rootless 基础镜像,因为容器运行时没有 root 权限。

启动 Docker 守护进程时,必须禁用 iptables,因为容器不支持 iptables 操作:

Dockerfiledockerfile
FROM docker:dind-rootless

# 启动停用了 iptables 的 dockerd,然后运行您的应用程序
ENTRYPOINT ["sh", "-c", "dockerd-entrypoint.sh dockerd --iptables=false --ip6tables=false & exec /path/to/your-app"]

如果您的应用程序在使用 Docker 之前需要等待 dockerd 就绪,请使用入口点脚本而不是上面的内联命令:

entrypoint.shsh
#!/bin/sh
set -eu

# 等待 dockerd 就绪
until docker version >/dev/null 2>&1; do
  sleep 0.2
done

exec /path/to/your-app

有关完整的工作示例,请参阅 Docker-in-Docker 容器示例

如何允许或禁止从我的容器流出?

有关如何控制出站流量和互联网访问,请参阅处理出站流量

这篇文档对您有帮助吗?