• 基于 Alpine 环境构建 aspnetcore6-runtime 的 Docker 镜像


    firefly.gif

    关于 Alpine Linux 此处就不再过多讲述,请自行查看相关文档。

    .NET 支持的体系结构

    下表列出了当前支持的 .NET 体系结构以及支持它们的 Alpine 版本。 这些版本在 .NET 到达支持终止日期或 Alpine 的体系结构受支持之前仍受支持。请注意,Microsoft 仅正式支持 x86_64、armv7、aarch64。 其他体系结构由分发维护人员支持,并且可以使用 apk 包管理器进行安装。

    image.png

    • apline 环境安装必须依赖

    使用包管理器进行安装时,将为你安装这些库。 但是,如果手动安装 .NET 或发布自包含的应用,则需要确保已安装以下库:

    apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib
    
    • 1
    • libgdiplus.NET 应用需要 System.Drawing.Common 程序集时)

    如果 .NET 应用使用 System.Drawing.Common 程序集,则还需要安装 libgdiplus。 由于 Linux 上不再支持 System.Drawing.Common,因此这仅适用于 .NET 6,并且需要设置 System.Drawing.EnableUnixSupport 运行时配置开关。

    要在 Alpine 3.16 或更高版本上安装 libgdiplus(较旧版本不包含该包),请运行:

    apk add libgdiplus
    
    • 1

    .NET 运行时说明

    • asp.net core 运行时
    sudo apk add aspnetcore6-runtime
    
    • 1
    • .net core/.net 运行时
    sudo apk add dotnet6-runtime
    
    • 1
    • .NET SDK
    sudo apk add dotnet6-sdk
    
    • 1

    三者之间的关系说明,如下图所示:

    dotnet.png

    此处目标是构建 asp.net core 应用程序的基础镜像,所以采用 asp.net core runtime 环境(生产环境推荐 Release 发布文件)。

    基础镜像构建步骤

    此处我们介绍如何基于 Alpine Linux 环境构建 ASP.NET Core6.xRuntime 的基础镜像。

    3.1、编写 Dockerfile

    Microsoft 参考文档:

    注意修改 Alpine 的镜像 reporepositories)源为国内源:

    # 清华源
    sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories 
    # 阿里源
    sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    # 中科大源
    sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    完整的 Dockerfile 编写如下:

    # https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-alpine
    FROM docker.io/library/alpine:3.18.3
    LABEL version="aspnetcore:6.0-alpine"
    LABEL description="Based on x86_64 alpine platform: v3.18.3 building aspnetcore6-runtime" 
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    RUN apk update
    RUN apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib
    RUN apk add aspnetcore6-runtime
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2、执行 Docker 构建命令

    进入刚编写的 Dockerfile 文件目录,然后执行如下命令:

    docker image build -t aspnetcore:6.0-x86_64-alpine ./
    
    • 1

    输出如下信息:

    PS C:\Users\Jeffrey.Chai\Desktop\dist> docker image build -t aspnetcore:6.0-x86_64-alpine ./
    [+] Building 0.1s (9/9) FINISHED                                                                                                                               docker:default
     => [internal] load .dockerignore                                                                                                                                        0.0s
     => => transferring context: 2B                                                                                                                                          0.0s
     => [internal] load build definition from Dockerfile                                                                                                                     0.0s
     => => transferring dockerfile: 499B                                                                                                                                     0.0s
     => [internal] load metadata for docker.io/library/alpine:3.18.3                                                                                                         0.0s
     => [1/5] FROM docker.io/library/alpine:3.18.3                                                                                                                           0.0s
     => CACHED [2/5] RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories                                                                        0.0s
     => CACHED [3/5] RUN apk update                                                                                                                                          0.0s
     => CACHED [4/5] RUN apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib                                                                             0.0s
     => CACHED [5/5] RUN apk add aspnetcore6-runtime                                                                                                                         0.0s
     => exporting to image                                                                                                                                                   0.0s
     => => exporting layers                                                                                                                                                  0.0s
     => => writing image sha256:974536111ddef9f00e20779f822bbaf646e2ec46ac3ec515158ef6c8e4abfb9a                                                                             0.0s
     => => naming to docker.io/library/aspnetcore:6.0-x86_64-alpine
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    说明:该步骤已经构建完成新镜像 aspnetcore:6.0-x86_64-alpine

    3.3、推送 Docker 公共仓库

    如有私有镜像仓库,可推送私有仓库,推送命令如下:

    # 登录 docker hub 仓库
    docker login -u username -p xxx
    
    # 推送镜像到仓库
    docker push aspnetcore:6.0-x86_64-alpine
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参数说明:

    • -u 用户名
    • -p 用户密码

    3.4、离线环境导出/导入镜像

    • docker save:导出镜像,按指定镜像保存成(.tar/.zip)归档文件。
    docker image save -o aspnetcore-6.0-x86_64-alpine.tar aspnetcore:6.0-x86_64-alpine
    
    • 1

    关于 docker save 命令用法:

    PS C:\Users\Jeffrey.Chai\Desktop\dist> docker image save --help
    
    Usage:  docker image save [OPTIONS] IMAGE [IMAGE...]
    
    Save one or more images to a tar archive (streamed to STDOUT by default)
    
    Aliases:
      docker image save, docker save
    
    Options:
      -o, --output string   Write to a file, instead of STDOUT
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • docker load:导入(载入)镜像

    将上面导出的镜像(image)归档文件拷贝到(已安装 docker)目标主机环境,执行如下命令:

    docker image load aspnetcore-6.0-x86_64-alpine.tar
    
    • 1

    关于 docker load 命令使用:

    PS C:\Users\Jeffrey.Chai\Desktop\dist> docker image load --help
    
    Usage:  docker image load [OPTIONS]
    
    Load an image from a tar archive or STDIN
    
    Aliases:
      docker image load, docker load
    
    Options:
      -i, --input string   Read from tar archive file, instead of STDIN
      -q, --quiet          Suppress the load output
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    以上就是 asp.net core 6.0runtime 环境基础镜像构建过程。

    — The glow of a firefly may be faint, but when it shines, it challenges the darkness.

    构建 App(应用)镜像

    • 查看新构建的镜像:docker images
    PS C:\Users\Jeffrey.Chai\Desktop\dist> docker images
    REPOSITORY       TAG                   IMAGE ID       CREATED          SIZE
    aspnetcore       6.0-x86_64-alpine     974536111dde   36 minutes ago   148MB
    alpine           3.18.3                7e01a0d0a1dc   3 weeks ago      7.34MB
    
    • 1
    • 2
    • 3
    • 4

    基于上面的构建的 aspnetcore6-runtime 基础镜像,接下来我们再此基础上镜像 app 应用镜像构建,完整的 Dcokerfile 编写如下:

    FROM aspnetcore:6.0-x86_64-alpine
    WORKDIR /app
    LABEL version="1.0.0"
    LABEL description="xxx镜像描述"
    COPY . ./
    EXPOSE 80
    ENTRYPOINT ["dotnet", "hello.dll"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    说明:直接把该 Dockerfile 文件拷贝到 asp.net core 应用程序发布文件目录执行 docker build 命令即可。

  • 相关阅读:
    动态环境下的语义SLAM算法
    卷积、填充、步长;卷积神经网络的卷积核大小、个数,卷积层数如何确定呢;深度学习如何调参;
    GO环境及入门案例
    IDEA 打开项目后看不到项目结构怎么办?
    【Linux】第二篇——权限管理
    MySQL中对于事务的理解
    python flask 和浏览器实现 websocket 双向通讯- flask-socketio
    如何算法化解题
    [4G/5G/6G专题基础-154]: 5G无线准入控制RAC(Radio Admission Control)
    【伸手党福利】投影仪初学者入门——投影亮度及幕布选择——从入门到精通
  • 原文地址:https://blog.csdn.net/ChaITSimpleLove/article/details/132836648