【Docker】Asp.net core在docker容器中的端口问题
还记得【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-slim
RUN 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-slim
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        \
# .NET Core dependencies
        libc6 \
        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 container
    DOTNET_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容器的最佳实践是一个容器只运行一个进程,意味着一个容器就暴露一个端口,所以去修改默认端口没有很大的必要性。这里对其问题溯源只是作为一个了解.
作者:Garfield
同步更新至个人博客:http://www.randyfield.cn/
本文版权归作者所有,未经许可禁止转载,否则保留追究法律责任的权利,若有需要请联系287572291@qq.com
【Docker】Asp.net core在docker容器中的端口问题的更多相关文章
- Docker & ASP.NET Core (4):容器间的连接
		第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用 ... 
- asp.net core 2.1 容器中使用 System.Drawing.Common 的问题
- ASP.NET Core使用Docker进行容器化托管和部署
		一.课程介绍 人生苦短,我用.NET Core!今天给大家分享一下Asp.Net Core以Docker进行容器化部署托管,本课程并不是完完全全的零基础Docker入门教学,课程知识点难免有没覆盖全面 ... 
- ASP.NET Core开发-Docker部署运行
		ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ... 
- 基于Microsoft Azure、ASP.NET Core和Docker的博客系统
		欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ... 
- [翻译] 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据
		原文地址:http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app 想要轻松地通过许 ... 
- Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)
		上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ... 
- Docker & ASP.NET Core (5):Docker Compose
		第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 Docker Compose简介 Compose是一个用来定义和运行多容器Docker应用的工具.使用C ... 
- .NET Core微服务之ASP.NET Core on Docker
		Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Docker极简介绍 1.1 总体介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.D ... 
- [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志
		原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Docker 一步一步指导您使用 ElasticSearch, Kibana, ASP ... 
随机推荐
- 深入浅出WPF-03.XAML语法
			2 XAML语法 树形结构,我们将整个XAML的结构想象成一棵树,我们从树的顶部向下看,形成俯视图.最上面的叶子节点会覆盖父节点,同级的子节点,后面的(也就是树的最上面)会覆盖前面的.覆盖包含了形状( ... 
- 基于深度学习的建筑能耗预测02——安装Tensorflow-gpu
			一.检查显卡 ·查看自己的显卡配置是否能支持cuda,以及Tensorflow不同版本要求与CUDA及CUDNN版本对应关系: https://developer.nvidia.com/zh-cn/c ... 
- 使用Jacoco统计服务端代码覆盖情况实践
			一.背景 随着需求的迭代,需求增加的同时,有可能会伴随着一些功能的下线.如果不对系统已经不用的代码进行梳理并删除不需要的代码,那么就会增加系统维护成本以及理解成本.但经历比较长的迭代以及系统交接,可能 ... 
- Hbase修复工具Hbck
			因为前面Hbase2集群出现过一次故障,当时花了一个周末才修好,就去了解整理了一些hbase故障的,事故现场可以看前面写的一篇:Hbase集群挂掉的一次惊险经历 一. HBCK一致性 一致性是指Reg ... 
- VulnHub 实战靶场Breach-1.0
			相比于CTF题目,Vulnhub的靶场更贴近于实际一些,而且更加综合考察了知识.在这里记录以下打这个靶场的过程和心得. 测试环境 Kali linux IP:192.168.110.128 Breac ... 
- Python笔记_1语法总结
			前言导读 本章知识点是我在最初期听python视频教程的时候整理总结的笔记 对python语法的认识对以后代码的解读有着很大的帮助. 1 新建python命名规则 新建项目名 :数字编号 项目名称 新 ... 
- 图解Redis6中的9种数据结构,墙裂建议准备去面试的人先看(干货,建议收藏)
			如图所示,Redis中提供了9种不同的数据操作类型,他们分别代表了不同的数据存储结构. 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型,也是最简单的一种类型 ... 
- 【数据结构与算法Python版学习笔记】树——二叉查找树 Binary Search Tree
			二叉搜索树,它是映射的另一种实现 映射抽象数据类型前面两种实现,它们分别是列表二分搜索和散列表. 操作 Map()新建一个空的映射. put(key, val)往映射中加入一个新的键-值对.如果键已经 ... 
- 封装ARX给.Net调用
			1:创建工程名.def的文件,内容如下: 2:def文件位置: 3:属性页配置: 4:acrxEntryPoint.cpp下面添加如下代码(可以传参数) 5:c#调用 怕自己忘记,记录一下. 
- kviy TextInput 触发事件
			from kivy.uix.widget import Widget from kivy.app import App from kivy.lang import Builder Builder.lo ... 
