【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 ...
随机推荐
- Java-Ide快速创建getter&setter方法
1.右键 选择Generate 2.创建 类的equals方法
- P3348-[ZJOI2016]大森林【LCT】
正题 题目链接:https://www.luogu.com.cn/problem/P3348 题目大意 有\(n\)棵树开始只有一个编号为\(1\)的节点且为标记点.\(m\)次操作要求支持 在\(l ...
- 深入浅出WPF-06.Binding(绑定)01
Binding(绑定) 先上图,再解释 针对这个图,我们先来说说什么是Binding. Binding就是一个桥梁,建立在数据和UI之间的桥梁.既然是数据驱动,那么我们就把数据称之为"源&q ...
- Win10环境下多JDK切换以及could not find java.dll异常解决
备注:主要为JDK1.7和JDK1.8之间进行切换 1.每次进行JDK切换时,都需要修改JAVA_HOME 2.编辑path环境变量,如图所示,将%JAVA_HOME%\jre\bin和%JAVA_H ...
- HDFS 10 - HDFS 的联邦机制(Federation 机制)
目录 1 - 为什么需要联邦 2 - Federation 架构设计 3 HDFS Federation 的不足 版权声明 1 - 为什么需要联邦 单 NameNode 的架构存在的问题:当集群中数据 ...
- html2canvas 无法渲染网络图片及本地 解决方案
使用html2canvas插件可以无法渲染图片的情况 在使用html2canvas的时候.如果元素中还包含网络图片.那么有很大的几率渲染不出来.即时把html2canvas的允许跨域打开也无济于事.这 ...
- NOIP 模拟七 考试总结
T1匹配 签到大水题,这里有hash,kmp,ac自动机,还有后缀数组,后缀自动机任您挑选. 不过这个数据范围有些坑啊,re就很不爽.做法我还是比较倾向hash的,毕竟不论神魔字符算法,hash大都能 ...
- MySQL的详细讲解
目录 Mysql的架构与历史 MySQL的逻辑架构 更新中---- Mysql的架构与历史 MySQL的逻辑架构 第二层的架构是所有的跨引擎的功能实现的地方,例如:存储,触发器,视图等. 第三层半酣了 ...
- python中函数里面冒号和函数后面的箭头是什么含义
函数里参数后的冒号其实是参数的类型建议,但是只是建议,就算你不按约定传也不会报错.而后面的箭头,则是函数返回值的类型建议.
- DL4J实战之五:矩阵操作基本功
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...