SAE中如何运行镜像

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

SAE底层基于Kubernetes,因此对于可以执行docker run命令的镜像或者能部署到Kubernetes的镜像,都可以直接在SAE中运行。本文介绍在SAE中运行镜像的主要考虑方面,包括如何选择镜像服务、镜像仓库、设置镜像Tag与部署镜像,以及如何查看修改镜像启动命令与配置文件等。

在SAE上部署无状态的服务

虽然SAE在理论上能部署任意镜像,但还是推荐在SAE部署无状态的镜像服务,主要原因如下:

  • 网络层面:SAE中的容器随时可以被销毁(主动部署触发或者底层物理机腾挪触发等),并拉起新的容器(IP发生变化)。因此,如果您的服务强依赖于容器的固定IP或者容器的顺序,就不适合部署在SAE,或者只能部署一个单容器用作简单的测试,不用于生产环境。如果是对外需要固定IP,可以通过绑定私网或者公网SLB解决。

  • 持久化存储层面:因为容器随时可以被销毁,拉起新的容器,之前容器上存储的数据都会丢失,所以如果只是部署单个容器则需要将持久化的目录挂载到NAS。具体操作,请参见设置NAS存储;如果是部署多个有状态的容器加上需要共享存储,则无法在SAE部署。

警告

若在SAE上部署有状态服务,您需要自行验证服务的高可用和容灾能力,SAE不承诺SLA。

选择镜像类型

镜像仓库

  • ACR镜像仓库(推荐)

    推荐采用阿里云容器镜像服务ACR,分个人版实例与企业版实例。更多信息,请参见个人版和企业版。如果您采用ACR,那么在SAE可以直接选择您同一个阿里云账号内的镜像部署。sc_configurate_image_from_acr

    更多信息,请参见跨账号拉取阿里云镜像

  • Docker Hub镜像仓库

    部分用户可能需要直接采用Docker Hub中的镜像,以nginx镜像为例,如果您期望部署nginx 1.23.1版本的镜像,则在SAE公有镜像页签内直接填入该镜像地址。

    • 镜像地址如下:sc_get_image_address_from_docker_hub

    • 将完整镜像地址填入SAEsc_configurate_image_from_docker_hub

    重要

    SAE默认部署在VPC网络内,拉取公网镜像需要能访问公网,则需要在私网内开通NAT来访问公网。更多信息,请参见配置NAT网关使SAE应用能访问公网

  • 自建镜像仓库

    对于自建镜像仓库的情况,如果您想要拉取镜像并配置在公有镜像页签内,需要确保该镜像能够公网公开访问,并且限制SAE的出口IP。请加入钉群(钉群号:32874633),联系阿里云研发团队获取SAE的出口IP。

镜像Tag

开发者可能会因为方便而直接使用latest版本的镜像部署,包括每次打包新版代码也会直接覆盖latest版本的镜像,但是在SAE中如果使用latest版本的镜像会遇到无法回滚、无法拉取到最新版本的镜像等问题,因此建议您在SAE中部署有版本意义的镜像Tag,例如时间戳。

部署docker run的镜像

docker run的参数和SAE的支持如下:

docker run参数

SAE支持

-d:后台运行容器。

无需设置该参数,在SAE中天然作为一个独立容器运行。

-i,-t:以交互模式运行容器,分配终端。

无需设置该参数,SAE有Webshell能力可以直接进入容器。

-p,P,expose:映射/暴露端口。

无需设置该参数,SAE容器端口即为进程端口。

  • --name:为容器指定一个名称。

  • -h:指定容器的hostname

不支持设置或修改,SAE会为每个容器分配唯一的hostname

  • -dns 8.8.8.8:DNS配置。

  • --dns-search example.com:指定容器DNS搜索域名。

SAE中可以通过挂载/etc/resolv.conf文件配置DNS。

-e:设置环境变量。

SAE控制台配置环境变量即可。具体操作,请参见设置环境变量

--net="bridge"

无需设置该参数,SAE使用阿里云VPC网络。

--link=[]:链接到另一个容器。

  • SAE使用阿里云VPC网络,所以只要容器在同一个VPC内或者做了VPC打通(安全组没有隔离),即可天然通信。

  • link还会在容器内创建另一个容器的服务名和添加一些环境变量,在SAE中可以通过设置环境变量与绑定Host实现。具体操作,请参见设置环境变量设置Hosts绑定

--volume , -v:绑定一个卷。

SAE中可以挂载NAS、OSS、ConfigMap。

查看镜像的启动命令

  • 方式一:docker image inspect

    docker image inspect nginx:1.23.1
    [
        {
            "Container": "5f19bc2cd794cd60ec845cbed7a60c85003dc56f26ee807f9eea2480bc46****",
            "ContainerConfig": {
                ...
                "Cmd": [
                    "/bin/sh",
                    "-c",
                    "#(nop) ",
                    "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
                ],
                "Entrypoint": [
                    "/docker-entrypoint.sh"
                ],
                ...
            },
            "Config": {
                ...
                "Cmd": [
                    "nginx",
                    "-g",
                    "daemon off;"
                ],
                "Entrypoint": [
                    "/docker-entrypoint.sh"
                ],
            },
        }
    ]
  • 方式二:查看文档

    通常镜像文档中,可以看到当前镜像的启动命令,以nginx1.23.1版本的镜像为例。sc_view_startup_command_from_nginx

    关于镜像中的Entrypoint和CMD设置组合的实际运行效果,请参见官方说明文档

在SAE中修改镜像的启动命令

如果镜像有公开文档,建议您先阅读文档。当前很多镜像都提供了可配置的环境变量,因此无需修改镜像启动命令。以nginx镜像为例,支持的环境变量如下:sc_supported_environment_variables_of_nginx

如果开放的环境变量较少,或者您有一些定制需求,确实需要修改镜像的启动命令(比如增加一些参数),那么通过底层基于Kubernetes的SAE,可以设置CommandArgs来完全覆盖镜像的启动命令。具体操作,请参见设置镜像部署应用的启动命令

  • Nginx设置镜像部署启动命令

  • PHP(执行多个命令)db_configurate_startup_command_for_the_php_application

修改镜像内的配置文件

除了修改镜像的启动命令,还有部分场景是修改镜像内的配置文件,比如典型的就是nginx.conf。可以使用SAE的注入配置信息能力,后续修改配置文件后,重新部署应用即可。更多信息,请参见注入配置信息

调试镜像

部署镜像的过程中可能会出现一直无法启动或者启动以后不符合预期等问题,请参见常见问题索引尝试解决。如果仍然无法解决问题,请加入钉群(钉群号:32874633),联系阿里云研发团队。