基于 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 命令即可。

目录
相关文章
|
22小时前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
1天前
|
Docker 容器
paddleocr 在docker环境下部署_docker部署paddleocr,90%的人看完都说好
paddleocr 在docker环境下部署_docker部署paddleocr,90%的人看完都说好
|
1天前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
17 1
|
1天前
|
存储 Linux Docker
CentOS7修改Docker容器和镜像默认存储位置
CentOS7修改Docker容器和镜像默认存储位置
|
3天前
|
并行计算 Ubuntu Docker
Docker环境Ubuntu20.04安装Python3.10版本
Docker环境Ubuntu20.04安装Python3.10版本
18 0
|
3天前
|
存储 前端开发 JavaScript
基于 GitHub Workflow和 Docker 构建 NextJS
基于 GitHub Workflow和 Docker 构建 NextJS
8 0
|
3天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第14天】 在现代微服务架构中,Docker容器作为应用部署的基本单元,其运行状态的监控对于保障系统稳定性和性能至关重要。本文将探讨如何构建一个高效且稳定的Docker容器监控体系,涵盖监控工具的选择、关键指标的采集、数据可视化以及告警机制的设计。通过对Prometheus和Grafana的整合使用,实现对容器资源利用率、网络IO以及应用健康状态的全方位监控,确保系统的高可用性和故障快速响应。
|
3天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第13天】在微服务架构和容器化部署日益普及的背景下,对Docker容器的监控变得尤为重要。本文将探讨一种构建高效稳定Docker容器监控体系的方法,通过集成Prometheus和cAdvisor工具,实现对容器资源使用情况、性能指标和运行状态的实时监控。同时,结合Grafana进行数据可视化,为运维人员提供直观的分析界面,以便及时发现和解决潜在问题,保障系统的高可用性和稳定性。
29 6
|
3天前
|
运维 安全 API
构建高效自动化运维体系:Ansible与Docker的协同实践
【5月更文挑战第13天】在现代IT基础设施管理中,自动化运维已成为提升效率、确保一致性和降低人为错误的关键。本文通过深入探讨Ansible和Docker的集成实践,揭示了如何构建一个灵活、可扩展且高效的自动化运维体系。我们将从理论到实践,展示如何利用这两种技术实现自动化部署、管理和扩展应用服务,以及它们如何帮助运维团队应对快速变化的业务需求和复杂的IT环境。
27 1
|
3天前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
19 2
如何删除 Docker 镜像、容器和卷?