asp的运行环境配置(基于Debain11构建)

asp的运行环境配置(基于Debain11构建)(1)

asp的运行环境配置(基于Debain11构建)(2)

linux 环境说明

此处我们基于 Debian11Linux发行版,实现目标是编写dockerfile构建asp.net core 6.x框架的runtime基础镜像。

在 Docker 容器化运行环境中,应用程序运行中存在异常情况,此时可以借助一些常用的基础工具方便排查,因此我们需要在 ASP.NET core 6.x runtime基础镜像添加 linux 环境常用的基础工具。

注意:基础镜像的构建需要考虑镜像的体积和打包工具的安全隐患,此处不做过多讨论。

Debian 简介

1、Debian 是一个社区

来自世界各地的数以千计的志愿者共同为 Debian操作系统工作,注重自由和开源软件。认识Debian计划。

2、Debian 是一个操作系统

Debian是一个自由的操作系统,由Debian计划开发和维护。Debian是一个自由的Linux发行版,添加了数以千计的应用程序以满足用户的需要。

关于 Debian 更多信息,请查看 => https://www.debian.org/intro/index.zh-cn.html

Debian 发行版本

Debian一直维护着至少三个发行版本:稳定版(stable),测试版(testing)和不稳定版(unstable)

1、稳定版(stable

  • 稳定版包含了 Debian 官方最近一次发行的软件包。

  • 作为 Debian 的正式发行版本,它是我们优先推荐给用户您选用的版本。

  • 当前 Debian 的稳定版版本号是 11,开发代号为 bullseye。最初版本为 11.0,于 2021 年 08 月 14 日发布,其更新 11.6 已于 2022 年 12 月 17 日发布。

2、测试版(testing)

  • 测试版包含了那些暂时未被收录进入稳定版的软件包,但它们已经进入了候选队列。使用这个版本的最大益处在于它拥有更多版本较新的软件。

  • 想要了解 什么是测试版以及 如何成为稳定版的更多信息,请看 Debian FAQ

  • 当前的测试版版本代号是 bookworm

3、不稳定版(unstable)

  • 不稳定版存放了 Debian 现行的开发工作。通常,只有开发者和那些喜欢过惊险刺激生活的人选用该版本。推荐使用不稳定版的用户订阅 debian-devel-announce 邮件列表,以接收关于重大变更的通知,比如有可能导致问题的升级。

  • 不稳定版的版本代号永远都被称为 sid。

4、发行生命周期

Debian 通常会按照一定的规律每隔一段时间发布一个新稳定版。对每个稳定发行版本,用户可以得到三年的完整支持以及额外两年的长期支持。

请查看 Debian Releases维基页面和Debian LTS维基页面以了解详细信息。

更多详细信息,请查看 => https://www.debian.org/releases/

关于 Debian 11

Debian 11带有Linux 5.10内核,这是一个长期支持(LTS)版本。一个新的内核显然意味着对硬件有更好的支持,特别是较新的硬件以及性能的改进。

asp的运行环境配置(基于Debain11构建)(3)

这里我们使用 Debian 11,代号为bullseye,网络安装,用于 64 位 PC(amd64)debian-11.6.0-amd64-netinst.iso

关于 Debian 11 更多信息:

  • 新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点 => https://linux.cn/article-13695-1.html

Linux 常用基础工具

当在 Linux服务器执行telnet命令时,如果提示command not found: telnet,说明服务器上并未安装telnet命令,需要安装此命令。

下面介绍在 linux服务器如何安装telnet、curl、ifconfig、vim、ping等工具。

首先,介绍一个安装工具时必须的命令 apt installapt install是应用程序管理器,用于一键安装软件包,与源码安装不同的是,该指令会自动检测并安装依赖,而且用apt安装的包都是成熟的软件包,基本不存在安装包有严重 bug 或者文件缺失的情况。

# 1、首先执行如下命令,更新相关资源。将所有包的来源更新,也就是提取最新的包信息,这一命令使用率非常高。apt update# 2、安装 telnetapt install telnet# 3、安装 curlapt install curl# 4、安装 ifconfigapt install net-tools# 5、安装 vimapt install vim# 6、安装pingapt install inetutils-ping# 7、安装 ipaddrapt install iproute2

上面这些基础工具的安装,可以整合一条命令,执行操作如下:

apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim

执行上面命令,如果不是 root用户,需在前面添加sudo提权,继续执行操作。

Dockerfile 中 RUN 指令

上面我们介绍了 linux环境中常用的基础工具,此处我们app应用程序是容器化运行环境,为了方便排查异常信息,通常会在runtime基础镜像中添加一些常用工具。

在编写 Dickerfile构建asp.net core runtime镜像环境时,我们先来了解下Dockerfile中的RUN指令。

RUN 语法格式

DockerfileRUN指令的编写格式有两种:

  • SHELL 形式】,命令在shell中运行,默认情况下,Linux/bin/sh -cWindowscmd /S /C

  • exec 形式】,按照JSON Array格式解析,意味着必须使用双引号【"】包含参数,而不能使用单引号【’】;

RUN 语义说明

RUN指令在当前镜像的顶层上新建层执行命令,同时提交执行结果。提交的结果会在接下来的Dockerfile处理。

分层 RUN指令和生成提交符合Docker的核心理念,即:提交便利,容器可以依据任意历史镜像构建,像源代码管理一样。

  • exec 形式能够避免 shell 形式表达含义模糊的问题,同时能够在一个不包含 shell 命令的基础镜像上执行 RUN 指令。

  • shell 形式的默认 shell 可以通过 SHELL 修改。

  • shell 形式中,若是指令参数过长,可以使用符号【\】换行显示。

# RUN 参数不换行.RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'# RUN 参数换行.RUN /bin/bash -c 'source $HOME/.bashrc; \echo $HOME'

  • exec 形式是按照 JSON Array格式解析,必须使用双引号【"】包含参数。

与 shell 形式不同,exec 形式不会调用 shell 命令行,意味着不会进行 shell 处理。

=> 例如:运行 `RUN ["echo", "$HOME"]` 不会对 `$HOME` 进行变量替换。如果需要 shell 处理,那么可以使用 shell 形式或直接执行 shell;=> 例如:`RUN["sh","-c","echo $HOME"]`。当使用 exec 形式直接执行 shell 时,与 shell 形式类似,应用的 shell 是宿主机而非 Docker。

  • exec 形式中的 JSON,必须转译反斜杠【\】。Windows系统中,反斜杠【\】是路径分隔符,是需要特别关注的。否则,由于不是有效的 JSON,执行时会出现异常从而失败。

# 错误写法RUN ["c:\windows\system32\tasklist.exe"]# 正确写法RUN ["c:\\windows\\system32\\tasklist.exe"]

  • RUN 指令的缓存不会在下次构建时自动失效。

RUN apt dist-upgrade -y 指令的缓存将在下次构建时重用。RUN 指令的缓存可以通过使用 `--no-cache` 标志置为无效,例如:docker build --no-cache

  • RUN 指令的缓存可由 ADDCOPY指令置为无效。

编写 Dockerfile 构建 Runtime 基础镜像

Docker中,编写Dockerfile是有个细节需要注意,RUN指令执行多个命令时,可以合并写成一个,在Dockerfile中每执行一个指令都会对应的生成一个层,相应的构建镜像的体积也会随之增加。

ASP.NET Core Runtime 基础镜像

  • 微软 MCR 容器镜像仓库,ASP.NET Core Runtime

asp的运行环境配置(基于Debain11构建)(4)

访问地址:https://mcr.microsoft.com/en-us/product/DOTNET/aspnet/about

Dockerfile 编写

上面我们介绍了RUN指令的语法格式,同样的这里我们为了尽量建设镜像构建的层,通常情况我们会把多个命令整合为一个RUN指令执行,完整Dockerfile编写如下:

FROM mcr.microsoft.com/dotnet/ASPNET:6.0# Debian 源添加参考# https://developer.aliyun.com/mirror/debian?spm=a2c6h.13651102.0.0.3e221b1137LtM1# https://mirrors.ustc.edu.cn/help/debian.html# https://mirrors.tuna.tsinghua.edu.cn/help/debian/# RUN 使用 shell 语法RUN sed -i -E 's/(deb|security).debian.org/mirrors.aliyun.com/g' /etc/apt/sources.listRUN sed -i 's/snapshot.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.listRUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.listRUN apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim# RUN 使用 exec 语法#RUN ["apt", "update"]#RUN ["apt","install","-y","vim","curl","telnet","iputils-ping","iproute2","net-tools"]

Windows 环境使用 WSL2 安装 Docker Desktop 工具

注意:在 windows 环境使用 Dockerfile 构建镜像,需要安装 Docker Desktop 工具并启动运行。

Windows环境安装Docker Desktop工具,推荐使用WSL2模式运行。此处不过多讲解安装细节,请自行查看资料镜像安装。

asp的运行环境配置(基于Debain11构建)(5)

Docker Engine添加如下信息:

{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"dns": ["8.8.8.8","8.8.4.4"],"experimental": false,"features": {"buildkit": true},"insecure-registries": ["https://hub.atguigu.com"],"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","https://docker.mirrors.ustc.edu.cn","https://cr.console.aliyun.com/"]}

docker build 构建 image 镜像

  • 执行 docker build构建命令:

docker build -t aspnet:6.0-debian11-amd64 ./

  • 输出如下 image镜像构建步骤信息:

[ ] Building 0.6s (9/9) FINISHED=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 32B 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:6.0 0.4s=> [1/5] FROM mcr.microsoft.com/dotnet/aspnet:6.0@sha256:a4ac0ac8b96842c3d4161339e641d335e44f52647bdeb4ed619ac83 0.0s=> CACHED [2/5] RUN sed -i -E 's/(deb|security).debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list 0.0s=> CACHED [3/5] RUN sed -i 's/snapshot.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 0.0s=> CACHED [4/5] RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 0.0s=> CACHED [5/5] RUN apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim 0.0s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:8e4e01b9340eef513279899468870ff57826a1e4f3a6f0b3689212d88f3119eb 0.0s=> => naming to docker.io/library/aspnet:6.0-debian11-amd64 0.0sUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

从上面输出的信息可以看出,Dockerfile 文件中每一行单独编写的命令,都会当做一个步骤执行,一共执行 [5/5] 个步骤。

查看 docker 镜像信息

此时我打开 Docker Desktop桌面端工具,选择 Images ,搜索框输入tag名称【aspnet-debian11-amd64:6.0】就可以看到刚才构建的镜像,体积270.54 MB

asp的运行环境配置(基于Debain11构建)(6)

和原生【mcr.microsoft.com/dotnet/aspnet:6.0】镜像相比,体积增加170.51 MB,新增的这部分体积,主要是我们在这个镜像的基础上,添加了一些linux环境的常用小工具(net-tools、iproute2、iputils-ping、telnet、curl、vim)。

我们可以点击【aspnet-debian11-amd64:6.0】镜像,即可进入镜像查看构建的层信息,如下所示:

asp的运行环境配置(基于Debain11构建)(7)

查看上面的镜像层信息,同样的我们也可以使用命令操作查看,操作如下:

docker inspect: 获取容器/镜像的元数据。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS 说明:

  • -f :指定返回值的模板文件。

  • -s :显示总的文件大小。

  • --type :为指定类型返回 JSON。

具体命令如下:

docker inspect aspnet:6.0-debian11-amd64

输出如下信息:

[{"Id": "sha256:8e4e01b9340eef513279899468870ff57826a1e4f3a6f0b3689212d88f3119eb","RepoTags": ["aspnet:6.0-debian11-amd64"],"RepoDigests": ,"Parent": "","Comment": "buildkit.dockerfile.v0","Created": "2023-02-19T07:44:04.106566658Z","Container": "","ContainerConfig": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ,"Cmd": ,"Image": "","Volumes": ,"WorkingDir": "","Entrypoint": ,"OnBuild": ,"Labels":},"DockerVersion": "","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","ASPNETCORE_URLS=http:// :80","DOTNET_RUNNING_IN_CONTAINER=true","DOTNET_VERSION=6.0.14","ASPNET_VERSION=6.0.14"],"Cmd": ["bash"],"Image": "","Volumes": ,"WorkingDir": "","Entrypoint": ,"OnBuild": ,"Labels":},"Architecture": "amd64","Os": "linux","Size": 270542384,"VirtualSize": 270542384,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/z1zc2q5ucw0srd1q6fz9dv5zs/diff:/var/lib/docker/overlay2/4vf1uowirpwps4nw4guvfr610/diff:/var/lib/docker/overlay2/xzob6lo9w8ita21r9o6qdowh3/diff:/var/lib/docker/overlay2/1a04b4cea9f8ea832c5f91a20d4ddd4f29f6ec5acb8ebbda6848282ec8159590/diff:/var/lib/docker/overlay2/5036b7ee8c50e873affdb40f9d1fd0e37573631587ed6b1f45347a10995ad935/diff:/var/lib/docker/overlay2/f7d1f588113cb3de37d0cd574614db511a098ba64e18f02ade45cb4b1d431fb6/diff:/var/lib/docker/overlay2/f0c4b961c76c425d8383575ca78c176a890d78d871a5cf60daab2ddc96ffee8d/diff:/var/lib/docker/overlay2/f7c839b494ad006d157084d919c15e812e10e57a8ac1c5cdda4d0150bf494f21/diff","MergedDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/merged","UpperDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/diff","WorkDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:4695cdfb426a05673a100e69d2fe9810d9ab2b3dd88ead97c6a3627246d83815","sha256:f30d150c01520fbbbdd1bedcef3f940d809c82a46e08301dcc713903d7272ba3","sha256:fe674e2b138caf1ef6a67419d5fb0a9081ca0759d97ce711be80d5d4d67145e1","sha256:ff13768cb51ea8fe1831d93c2d18690c3fdca8cfee40b75a738f62b133413573","sha256:355b7bb8c23e0d867141b0af69ecb6df39730bcd1b6c754cfae9ad36ca3f5572","sha256:8d56eaae8bfea0a5eac4caf4350fa1987c162cd7dba828aa292cc15c3e90d91b","sha256:b7d0c701d1f04294b2b98d3103c3856c9cbabc592cde48d3e07eb03bff7cb18a","sha256:46ef367d7575beda39ffd3774b4d47b29c2fe0b628f1269b4626053ca44169d5","sha256:6809bcac556f83ca4489ba09980a5bef05c9bc7463a45e4dac7fb600beec1c4e"]},"Metadata": {"LastTagTime": "2023-02-19T08:46:50.196739744Z"}}]

镜像构建后,此时如果有镜像仓库(腾讯云平台准备 Docker 私有镜像仓库或者 IDC 机房搭建),确保 vm 和宿主机之间通信可以正常登录访问,此处以腾讯云 Docker 私有镜像仓库为例:

# 登录腾讯云docker registrysudo docker login --username=[user] ccr.ccs.tencentyun.com# 提示输入对应的密码即可# 从 registry 拉取镜像sudo docker pull ccr.ccs.tencentyun.com/dotnet/image-name:[tag]# 将镜像推送到 registrysudo docker login --username=[user] ccr.ccs.tencentyun.comsudo docker tag [ImageId|image-name:tag] ccr.ccs.tencentyun.com/dotnet/aspnet:6.0-debian11-amd64sudo docker push ccr.ccs.tencentyun.com/dotnet/aspnet:6.0-debian11-amd64

到这里我们就演示完 Dockerfile的编写,以及image镜像构建的全过程。

总结

掌握 Dockerfile文件语法格式的编写,熟悉RUN指令中多个命令的编写方式(减少image镜像构建层,相应的减少镜像体积大小),顺便熟悉下Docker镜像的构建docker build和 镜像的push(推送)和 pull(拉取)基本操作,感兴趣的小伙伴可以跟随上面描述动手实践起来,可以加深对Docker镜像构建的理解。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页