ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NET Core Docker 写Dockerfile,构建镜像,运行容器

NET Core Docker 写Dockerfile,构建镜像,运行容器 随着微服务以及云原生技术的普及, Core项目生产上线时的主流方案, 相较于传统的IIS、Nginx物理部署, 它达成了一次构建而能够在任何地方运行, 全面解决了环境不一致、部署繁杂、版本冲突、扩容艰难等运维痛点。Core 容器化核心流程展开颇为详尽的讲解, 其中包括语法方面的详细解析, 生产级别的编写方式, 镜像进行构建的过程, 容器启动、停止、运行的情形, 对镜像实施优化的做法, 数据实现持久化的举措, 以及常见报错问题的解决办法, 这些环节覆盖了从开发开始进行打包一直到生产上线整个链路之上的实战操作。一、 部署 Core 核心优势传统部署依靠服务器环境配置, 不同的服务器, 以及依赖库、系统配置存在差异, 这极其容易致使「本地正常、线上报错」的情况出现, 且要从根源上解决环境一致性问题:二、关键性的核心前置认知, 其一为三个非常关键的核心概念, 其二展现了.NET官方镜像的分类情况。Core部署, 得使用微软官方之镜像, 此镜像分成两类, 它们各自行使职责, 是不可以相互混用的。对于生产标准规范而言, 存在多阶段构建的情况, 要运用 sdk 镜像来编译项目, 还要运用镜像去运行项目, 并且要将镜像体积做到极致精简。三、 Core 专用于容器化而言, 其核心所在, 乃是掌握如下常用指令, 如此一来, 便可编写生产级配置, 并且, 所有指令在大小写方面有着鲜明地严格区分。四、生产级 Core 编写多阶段构建容器化领域的最佳实践方式, 如此能够将编译工具予以剔除, 还能除掉冗余文件, 进而能够大幅度让镜像体积实现缩小, 6/7/8通用的生产模板, 它能够与、MVC以及背景服务相适配。1. 标准 生产直接可用于项目的根目录之处, 去创建一个文件, 将其命名为没有后缀、首字母呈大写状态, 文件所具有的内容如下这般:# 第一阶段编译阶段使用SDK镜像 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build # 设置工作目录 WORKDIR /src # 优先复制项目文件利用docker缓存机制变更少缓存命中率高 COPY *.csproj ./ # 还原NuGet依赖 RUN dotnet restore # 复制全部源码 COPY . . # 编译项目Release模式 RUN dotnet build -c Release -o /app/build # 项目发布 RUN dotnet publish -c Release -o /app/publish # 第二阶段运行阶段使用精简运行时镜像最终镜像仅保留运行所需内容 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app # 从编译阶段复制发布好的文件 COPY --frombuild /app/publish . # 声明容器端口 EXPOSE 80 EXPOSE 443 # 设置生产环境变量 ENV ASPNETCORE_ENVIRONMENTProduction # 容器启动命令 ENTRYPOINT [dotnet, 你的项目名称.dll]2. 配套 . 文件必备优化于同目录那儿新建一份. 文件, 对无用文件予以过滤, 防止冗余内容进到镜像里, 还要避开破坏缓存此机制:# 排除编译缓存、日志、配置、本地环境文件 bin/ obj/ logs/ .vscode/ .idea/ .git/ .gitignore *.md Dockerfile .dockerignore3. 五、关于文件核心优化逻辑的, 镜像构建与容器运行方面有着完整命令实操。任何命令都得是在, 那个所在的项目根目录当中去执行, 要适配, Linux以及Mac这两个全平台。1. 构建镜像# 基础构建命令docker build -t 镜像名:版本 . docker build -t netcore-webapi:1.0 . # 强制重新构建忽略缓存解决缓存导致的更新不生效问题 docker build --no-cache -t netcore-webapi:1.0 .构建成功后可通过 查看本地镜像。2. 启动运行容器生产标准docker run -d \ --name netcore-demo \ -p 8080:80 \ --restart always \ -v /home/netcore/logs:/app/logs \ netcore-webapi:1.03. 命令参数详解生产关键4. 常用容器管理命令# 查看运行中容器 docker ps # 查看所有容器含停止 docker ps -a # 停止容器 docker stop netcore-demo # 启动容器 docker start netcore-demo # 删除容器需先停止 docker rm netcore-demo # 删除镜像 docker rmi netcore-webapi:1.0 # 查看容器日志排查启动失败、接口报错 docker logs -f netcore-demo六、 部署 Nginx 反向代理生产架构不要直接对外暴露容器端口, 这是生产标准架构的要求, Nginx反向代理到容器, 这样做能兼顾容器轻量化, 还有Nginx本身所具备的Nginx高发性、应对HTTPS和进行限流能力以及动静分离能力。核心流程是, Nginx对80以及443公网端口进行监听, 将请求转发至宿主机映射端口, 这之后, Core程序。基础 Nginx 核心配置适配容器server { listen 80; server_name 域名/公网IP; location / { proxy_pass http://localhost:8080; # 对应docker映射的宿主机端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }七、把镜像体积予以优化, 以及生产方面的最佳实践, 其中包括核心优化方案, 另有生产强制规范, 还有高频报错与解决方案, 最后是总结。. NET Core容器化部署要旨在于: 历经多阶段予以精简构建, 达到环境标准化实施隔离, 实现数据持久化进行兜底, 借助Nginx达成前置防护。与传统IIS、Nginx部署相比, 全然做到解决环境不一致问题, 处理部署繁琐状况, 攻克扩容困难难题, 故而成为云原生、微服务、集群部署得以开展的根基。要是能够掌握规范编写方法, 以及镜像构建方式, 还有容器运维与优化方案, Core 项目一键打包, 达成随处部署, 做到快速迭代, 使得适配绝大多数企业生产场景。
返回列表