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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: apline linux 环境,构建 asp.net core 应用程序的基础镜像。--- The glow of a firefly may be faint, but when it shines, it challenges the darkness.

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
  • 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

.NET 运行时说明

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

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

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

完整的 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

3.2、执行 Docker 构建命令

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

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

输出如下信息:

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

说明:该步骤已经构建完成新镜像 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

参数说明:

  • -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

关于 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
  • docker load:导入(载入)镜像

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

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

关于 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

以上就是 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

基于上面的构建的 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"]

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

目录
相关文章
|
3月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
334 1
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
3月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
280 99
|
3月前
|
缓存 Docker 容器
优化Docker镜像大小的五个实用技巧
优化Docker镜像大小的五个实用技巧
296 98
|
2月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
116 5
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
351 5
|
3月前
|
Java Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
180 8
|
Linux Docker Windows
Docker概述:什么Docker如此特别,它是如何构建的
本文讲的是Docker概述:什么Docker如此特别,它是如何构建的,【编者的话】在上一系列介绍中,我们大体地介绍了CoreOS。在这个系列中我想介绍一下Docker。本文我们看一下为什么Docker如此特别,它是如何构建的。我们会从基本开始介绍,所以读者不必担心自己是刚接触Docker的。
1458 0