本文介绍Custom Container(自定义容器运行环境)的背景信息、基本原理、HTTP Server配置要求、日志格式、冷启动优化、计费说明及使用限制。

背景信息

在云原生时代,容器镜像已经逐渐变成了软件部署和开发的标准工具。为了优化开发者体验、提升开发和交付效率,函数计算提供了Custom Container。开发者将容器镜像作为函数的交付物,通过HTTP协议和函数计算系统交互。使用Custom Container简化了以下场景:
  • 低成本迁移,无需修改代码或是重新编译二进制、共享对象(*.so),保持开发和线上环境一致。
  • 解压前镜像大小最大支持1 GB,避免代码和依赖分离,简化分发和部署。
  • 容器镜像天然的分层缓存,提高代码上传和拉取效率。
  • 标准可复现的第三方库引用、分享、构建、代码上传、存储和版本管理,丰富的开源生态CI/CD交付体验。

基本原理

Custom Container工作原理与Custom Runtime基本相同。函数计算系统初始化执行环境实例前会扮演该函数的服务角色(Service Role),获得临时用户名和密码并拉取镜像。拉取成功后根据指定的启动命令Command、参数Args及CAPort端口(默认9000)启动您定义的HTTP Server。然后这个HTTP Server接管了函数计算系统的所有请求,包括来自您的事件函数调用及HTTP函数调用。

您在开发函数具体的逻辑之前,一般需要确认开发的是事件函数还是HTTP函数,原理如下所示:

  • 事件函数eventfunction
  • HTTP函数httpfunction

HTTP Server配置要求

  • Custom Container启动的服务一定要监听0.0.0.0:CAPort*:CAPort端口。如果您使用127.0.0.1:CAPort端口,会导致请求超时,出现以下错误:
    {
      "ErrorCode":"FunctionNotStarted",
      "ErrorMessage":"The CA's http server cannot be started:ContainerStartDuration:25000000000. Ping CA failed due to: dial tcp 21.0.5.7:9000: getsockopt: connection refused Logs : 2019-11-29T09:53:30.859837462Z Listening on port 9000"
    }

    Custom Container的监听端口(CAPort)默认是9000。如果Custom Container使用默认的监听端口,那么实现的Custom Container的HTTP Server监听的端口也必须是9000。 如果Custom Container使用的监听端口是8080,那么实现的Custom Container的HTTP Server监听的端口也必须是8080。

  • Connection需要设置为Keep-Alive,Server端请求超时时间需设置在15分钟及以上。示例如下所示。
    //例如Node.js使用express时。  
    var server = app.listen(PORT, HOST);
    server.timeout = 0; // never timeout
    server.keepAliveTimeout = 0; // keepalive, never timeout
  • HTTP Server需要在30秒内启动完毕。

(可选)函数日志格式

Custom Container的日志格式与Custom Runtime的日志格式一致。更多信息,请参见日志格式

冷启动优化最佳实践

相比于代码包,容器镜像依赖的基础环境带来了额外的数据下载和解压的时间,为了更好的冷启动体验,推荐您使用以下最佳实践:

  • 容器镜像地址推荐使用与函数计算同地域的VPC镜像地址,例如registry-vpc.cn-hangzhou.aliyuncs.com/fc-demo/helloworld:v1beta1,以获得最优的镜像拉取延时和稳定性。
  • 镜像最小化,基于类似Alpine或Ubuntu这样的最小镜像或者是其他镜像中精简版本构建自定义镜像。仅保留必要的依赖,删除不必要的文档、数据和其他文件。
  • 容器镜像配合预留实例一起使用。更多信息,请参见预留模式简介
  • 在资源允许和线程安全的情况下,搭配单实例多并发一同使用,可避免不必要的冷启动,同时降低成本。

计费说明

Custom Container的计费项与其他类型Runtime的计费项一致。更多信息,请参见计费概述。其中,镜像资源使用量中的执行时间是从仓库拉取镜像到拉取镜像结束的时长。例如,1024 MB内存的实例拉取镜像耗时10秒,则本次拉取镜像的资源消耗量为10 GB-秒。容器镜像在一段时间一定范围内有缓存,因此并不是每次冷启动一定会产生镜像拉取的费用。

使用限制

  • 镜像大小
    • 若您的函数执行内存小于1 GB,则解压前镜像大小不能超过256 MB。
    • 若您的函数执行内存不小于1 GB,则解压前镜像大小不能超过1024 MB。
  • 镜像仓库

    目前仅支持阿里云容器镜像服务中企业版默认实例的镜像。详细信息,请参见什么是容器镜像服务ACR

  • 镜像访问

    目前仅支持同账号同地域(Region)下私有镜像仓库读取。

  • 容器内文件读写权限

    容器run-as-user UID默认是Root。如果您在Dockerfile中指定了具体的使用者,则会以指定的使用者运行该容器镜像。

  • 容器可写层存储空间限制
    排除只读镜像层,容器产生的数据最大不能超过512 MB。
    说明 容器可写层数据不是持久化的,数据会随着容器被销毁而删除。如果需要持久化存储,可以考虑使用函数计算挂载NAS。具体操作,请参见 配置NAS。或者使用其他共享存储服务,例如 对象存储表格存储等。