制作Go镜像

本文介绍如何在本地制作Docker镜像,并以镜像方式将Go应用部署到Serverless 应用引擎 SAE(Serverless App Engine)

前提条件

步骤一:准备项目

  1. 下载Demo

    Demo内的Dockerfile内容如下:

    # Golang版本;Alpine镜像的体积较小。
    FROM golang:1.16.6-alpine3.14 as builder
    
    # 替换Alpine镜像,方便安装构建包。
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    
    # 安装构建阶段的依赖。
    RUN apk --update add gcc libc-dev upx ca-certificates && update-ca-certificates
    
    # 将代码复制到构建镜像中。
    # 注意地址不要在GOPATH中。
    ADD . /workspace
    
    WORKDIR /workspace
    
    # 挂载构建缓存。
    # GOPROXY防止下载失败。
    RUN --mount=type=cache,target=/go \
      env GOPROXY=https://goproxy.cn,direct \
      go build -buildmode=pie -ldflags "-linkmode external -extldflags -static -w" \
      -o /workspace/gin-hello-world
    
    # 运行时镜像。
    # Alpine兼顾了镜像大小和运维性。
    FROM alpine:3.14
    
    EXPOSE 8080
    
    # 方便运维人员安装需要的包。
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    
    # 创建日志目录等。
    # RUN mkdir /var/log/onepilot -p && chmod 777 /var/log/onepilot && touch /var/log/onepilot/.keep
    
    # 复制构建产物。
    COPY --from=builder /workspace/gin-hello-world /app/
    
    # 指定默认的启动命令。
    CMD ["/app/gin-hello-world"]
  2. 在Demo所在目录,执行以下命令,构建镜像。

    docker build . -t gin-example
  3. 本地验证。

    1. 指定端口映射,格式为主机端口:容器端口,运行镜像。

      docker run -p 127.0.0.1:8080:8080/tcp gin-example
    2. 执行以下命令,查看请求是否返回正常。

      curl http://127.0.0.1:8080/

      输出如下:pg_go_response

步骤二:制作镜像

  1. 容器镜像服务控制台创建镜像仓库。

    个人版和企业版实例均适用本文的操作,本文以个人版实例为例。具体操作,请参见以下文档:

  2. 构建并推送镜像。

    您可以在目标镜像仓库的基本信息页面的镜像指南页签查询具体命令。更多信息,请参见以下文档:

    1. 执行以下命令,构建镜像。

      docker build --tag go-demo:v1 .
    2. 执行以下命令,登录远端镜像仓库。

      docker login --username=<镜像仓库登录名> registry.<regionId>.aliyuncs.com

      示例如下:

      docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com

      在返回结果中输入密码,如果显示login succeeded,则表示登录成功。如何设置密码,请参见设置镜像仓库登录密码

    3. 执行以下命令,给镜像打标签。

      docker tag <ImageId> registry.<regionId>.aliyuncs.com/****/go-demo:<镜像版本号>
      • ImageId:镜像ID。

      • registry.<regionId>.aliyuncs.com/****/go-demo:镜像仓库地址。

      示例如下:

      docker tag go-demo:v1 registry.cn-hangzhou.aliyuncs.com/****/go-demo:v1
    4. 执行以下命令,推送镜像至个人版实例。

      docker push registry.<regionId>.aliyuncs.com/****/go-demo:<镜像版本号>

      示例如下:

      docker push registry.cn-hangzhou.aliyuncs.com/****/go-demo:v1

    成功推送后,您可以登录容器镜像服务控制台,在目标镜像仓库的镜像版本页面查看推送的版本。

步骤三:部署镜像

以下仅介绍本文相关的配置项,其余信息,请参见通过镜像部署Web应用

  1. SAE控制台>应用管理>Web应用,从顶部菜单栏选择地域,然后单击创建应用

    image

  1. 设置应用部署方式选择镜像部署,并单击设置镜像,选择您已准备好的应用镜像仓库和镜像版本。为定位到所需的镜像仓库,请单击我的阿里云镜像,并选择镜像仓库所在的镜像服务版本和命名空间。

    image

    image

  1. HTTP监听端口设置为镜像对外提供服务的端口。

    image

  1. 单击一键创建应用,并等待应用部署完成。

步骤四:访问应用

SAE为您的应用提供默认的访问地址,您可以通过公网访问应用通过私网访问应用;在实际的生产环境中,建议您为应用关联自定义域名,并使终端用户通过自定义域名访问应用