还记得【One by one系列】一步步学习docker(三)——实战部署dotnetcore中遇到的问题么?容器内部启动始终是80端口,并不由命令左右。

docker run --name container-name -p 81:5000 mywebapi

所谓知其然就要知其所以然,浅尝辄止并不是个好习惯,主要是以下几个因素共同导致了这种情况。

1.Kestrel配置

ASP.NET Core项目使用Kestrel作为默认的web服务器。

而集成Kestrel的ASP.NET Core有4种方式指定终结点URL:

  • ASPNETCORE_URLS 环境变量

  • --urls命令行参数

  • urls 主机配置键

  • UseUrls扩展方法

2.按图索骥-Dockerfile

2.1 Asp.Net Core Runtime

首先我们按照asp.net core的其中一个版本构建镜像的Dockerfile

ARG REPO=mcr.microsoft.com/dotnet/core/runtime
FROM $REPO:3.1-buster-slim# Install ASP.NET Core
RUN aspnetcore_version=3.1.4 \&& curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$aspnetcore_version/aspnetcore-runtime-$aspnetcore_version-linux-x64.tar.gz \&& aspnetcore_sha512='a761fd3652a0bc838c33b2846724d21e82410a5744bd37cbfab96c60327c89ee89c177e480a519b0e0d62ee58ace37e2c2a4b12b517e5eb0af601ad9804e028f' \&& echo "$aspnetcore_sha512  aspnetcore.tar.gz" | sha512sum -c - \&& tar -ozxf aspnetcore.tar.gz -C /usr/share/dotnet ./shared/Microsoft.AspNetCore.App \&& rm aspnetcore.tar.gz

  • 基于.net core基础镜像

  • 运行命令,下载asp.net core指定版本的运行时压缩包

  • 验证压缩包正确性

  • 解压压缩文件

  • 删除压缩文件

2.2 .Net Core Runtime

根据上面的Dokcerfile,可以看到asp.net core的镜像是在.net core的基础上构建的,所以继续找到.net core的构建镜像的Dockerfile

ARG REPO=mcr.microsoft.com/dotnet/core/runtime-deps
FROM $REPO:3.1-buster-slimRUN apt-get update \&& apt-get install -y --no-install-recommends \curl \&& rm -rf /var/lib/apt/lists/*# Install .NET Core
RUN dotnet_version=3.1.4 \&& curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$dotnet_version/dotnet-runtime-$dotnet_version-linux-x64.tar.gz \&& dotnet_sha512='1869565558e5a85b6a898e792d7b5dece611b25f7f6fd8f015ffb16dccc7485f1412e04809da2e3f56744d24c75e1d3addbd2856c45ae7e66a2c7b71ea23e827' \&& echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \&& mkdir -p /usr/share/dotnet \&& tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \&& rm dotnet.tar.gz \&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

2.3 .NET Core Runtime Dependencies

根据上面的Dokcerfile,可以看到.net core的镜像是在runtime-deps的基础上构建的,所以继续找到runtime-deps的构建镜像的Dockerfile

FROM amd64/debian:buster-slimRUN apt-get update \&& apt-get install -y --no-install-recommends \ca-certificates \\
# .NET Core dependencieslibc6 \libgcc1 \libgssapi-krb5-2 \libicu63 \libssl1.1 \libstdc++6 \zlib1g \&& rm -rf /var/lib/apt/lists/*# Configure web servers to bind to port 80 when present
# 这就是真相
ENV ASPNETCORE_URLS=http://+:80 \# Enable detection of running in a containerDOTNET_RUNNING_IN_CONTAINER=true

3.真相浮出水面

ENV ASPNETCORE_URLS=http://+:80 \

没错正是在基础镜像.NET Core Runtime Dependencies构建镜像的Dockerfile中指定了应用终结点URL

ENV ASPNETCORE_URLS=http://+:80

所以你想修改默认端口,在你的Dockerfile添加如下,修改默认值即可:

ENV ASPNETCORE_URLS=http://+:5000

4.写在末尾

  • 通过这样剥洋葱般的溯源镜像,你会发现到最后,最后一个镜像一定是操作系统镜像,这也说明了一个镜像就是在一个操作系统镜像上不断增加运行环境、SDK等等,进而形成特定的新镜像.

  • Docker容器的最佳实践是一个容器只运行一个进程,意味着一个容器就暴露一个端口,所以去修改默认端口没有很大的必要性。这里对其问题溯源只是作为一个了解.

长按二维码关注

【Docker】Asp.net core在docker容器中的端口问题相关推荐

  1. ASP.NET Core依赖注入容器中的动态服务注册

    介绍 在ASP.NET Core中,每当我们将服务作为依赖项注入时,都必须将此服务注册到ASP.NET Core依赖项注入容器.但是,一个接一个地注册服务不仅繁琐且耗时,而且容易出错.因此,在这里,我 ...

  2. Docker ASP.NET Core (5):Docker Compose

    Docker & ASP.NET Core (5):Docker Compose 原文:Docker & ASP.NET Core (5):Docker Compose 第一篇:把代码 ...

  3. 深入浅出 ASP.NET Core 与 Docker 入门课程说明

    点击蓝字"角落的白板报"关注我哟 加个"星标★",好文必达! 深入浅出 ASP.NET Core 与 Docker 入门课程说明 <深入浅出 ASP.NE ...

  4. Asp.net Core Jenkins Docker 实现一键化部署

    写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker ...

  5. ASP.NET Core amp; Docker 实战经验分享

    一.前言 最近一直在研究和实践ASP.NET Core.Docker.持续集成.在ASP.NET Core 和 Dcoker结合下遇到了一些坑,在此记录和分享,希望对大家有一些帮助. 二.中间镜像 我 ...

  6. 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据

    原文地址:http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app 想要轻松地通过许 ...

  7. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  8. netcore docker_深入浅出 ASP.NET Core 与 Docker 入门课程目标说明

    课程目标说明https://www.zhihu.com/video/1241137370310508544 <深入浅出 http://ASP.NET Core 与 Docker >是一门新 ...

  9. ASP.NET Core开发Docker部署

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  10. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(三.实现CD持续部署管道)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...

最新文章

  1. Java重载容易引发的错误—返回类型
  2. boost::hana::detail::has_duplicates用法的测试程序
  3. 数据库表的软硬关联_数据库容灾能力的探讨(一)
  4. SqlServer之代码块相关
  5. 被学校辞退、拒绝FB后:语音识别大牛Povey确认兼职北京初创公司,称主业还选中国...
  6. python random randint_python中random.randint(1,100)随机数中包不包括1和100
  7. Flex4之皮肤定制
  8. [Swift]LeetCode478. 在圆内随机生成点 | Generate Random Point in a Circle
  9. (23)FPGA面试题常用逻辑电平
  10. keil软件仿真时,程序不能正常运行解决方法
  11. win10安装oracle11g 服务端及配置详解
  12. C语言Socket编程(计算机网络作业)
  13. qt截图怎样实现橡皮擦_利用QT实现截屏的四种方法
  14. Nginx 的 5 大应用场景,太实用了!
  15. OpenTSDB的读写API
  16. FPGA LVDS液晶屏
  17. 7-10 愿天下有情人都是失散多年的兄妹 (25分)
  18. LaTex 自动生成IEEE格式的参考文献
  19. 数字芯片加工生产全流程漫谈
  20. 支付宝电脑网页支付接口的调用

热门文章

  1. 第4章 变量、作用域和内存问题
  2. 《解密小米之互联网下的商业奇迹》
  3. mysql中的增删改查
  4. 精通Hibernate:通过Hibernate操纵对象
  5. Linux内核笔记--内存管理之用户态进程内存分配
  6. 推荐我看过的几本好书给大家!(2)
  7. 深入浅出Google Android这本书怎么样
  8. java读取excel某个单元格的值_java poi怎么获取excel单元格的内容
  9. python测试框架数据生成工具最全资源汇总
  10. 原生sql实现restful接口调用