命令行启动Docker容器无法工作

8
我一直在使用 Docker 开发一个 ASP.NET 应用程序,并且通过 Visual Studio 启动它可以正常工作!但是,如果我尝试从命令行(或 Powershell 或 VS 的 CLI/Powershell)运行任何内容,它将运行,但是生成的容器拒绝所有连接。
我正在 Windows 10 NT 上安装了 Docker Desktop,尝试运行 ubuntu:18.04 镜像(我也尝试过 Alpine,ubuntu:16.04)。
复现步骤:
- 在 Visual Studio 中创建默认的 ASP.NET 应用程序 - 添加 Docker 支持 - 使用选项“Docker”运行 - 打开浏览器,导航到 localhost:[YourPort] - 成功!按预期工作。
然后,使用相同的镜像或已下载的镜像(我尝试了 dockersamples/static-site 确认它不是特定项目的问题):
- 打开 CMD - 在不同的端口上运行 docker run -p [HostPort]:[ContainerPort] [SameImageVSUses:tag] - 查看 docker ps 显示两个容器并排运行 - 打开浏览器(Firefox),获取错误
"The connection was reset"
更新:
我更改了 ASP.NET 应用程序的 program 类,使用 0.0.0.0 而不是 localhost,我认为这是必要的,但现在我看到
"Secure Connection Failed" "PR_END_OF_FILE_ERROR_"
如果我 curl localhost:[MyPort],我得到 (52) empty reply from server。
/更新
好吧,也许 Visual Studio 做了更多的事情我不知道。
稍微研究一下就会发现,是的,它会添加大量的额外参数!使用复制/粘贴的命令,Visual Studio 给了我... 精确相同的错误。
澄清一下,容器仍然运行,我可以 ssh 进入或 docker inspect 它们(实际上,VS 和 CMD 启动的容器的 docker inspect 除了绑定到的网络地址之外完全相同)。我从构建和启动容器的过程中没有收到任何错误消息,因此如果出现故障,则会静默地出现。
我对 Docker 相对较新,但似乎找不到解决方法,甚至找不到原因。 Visual Studio 在做什么?我尝试了我所知道的一切,我甚至不得不清除我的机器(与此无关),在重新安装所有内容后,完全相同的情况再次发生。我的直觉告诉我这是我的问题,但是 VS 启动的应该也会失败,对吧?

我找不到任何关于如何翻转魔法开关的信息,如果我在运行CLI程序时,无论我对dockerfile或命令参数做什么都似乎不起作用。我从未使用过VirtualBox或Docker Toolbox,这不应该是因为旧程序造成的奇怪配置问题,因为从Visual Studio启动时它可以正常工作!啊!

我希望这确实是我没有打开的魔法开关,否则我对我正在使用的东西非常基础的理解有问题。

3个回答

3

如果您正试图运行最近的VS模板,您只需要按照以下说明操作:

进入Api项目目录:

cd ./src/YourApiDirectory

构建命令:

docker build -f ./Dockerfile --force-rm -t yourapiimage:dev ..

运行命令:

docker run -it --rm -e "ASPNETCORE_ENVIRONMENT=Development" -p 58817:80 --name yourapiname yourapiimage:dev

请注意,最后一条命令中的“-it”标志将在“交互”模式下运行您的映像。另外请注意,我仅通过端口58817使用http连接。

2
感谢您的建议,最终问题有些令人沮丧。我认为这是两个问题的结合:
首先,无论如何配置docker都不能让您的网站监听容器内部的任何内容。我相信当我最初尝试大多数修复方法时,网站没有监听任何内容。
真正的问题是.csproj属性文件夹中的launchSettings.json似乎会覆盖来自命令行的参数!
还记得我说过“...与第一个一起运行...”吗?这意味着我从未在正确的端口集上运行网站。显然,-p 8001:443 -e ASPNETCORE_HTTPS_PORT=443不足以使站点在443上监听。您还必须在launchSettings.json中设置sslPort。这就是生活,我想。
以下是最终有效的方法:
我在解决方案目录中运行了docker-compose up。就这样。我在VS中查看时没有看到docker-compose.yml,因此我没有考虑过它,但这仅因为VS不显示解决方案级别的项目。我猜VS正在运行docker-compose而不是单个命令。

1
当直接使用Visual Studio中的docker-compose文件启动Docker配置文件时,Visual Studio会在后台合并不同的覆盖文件并执行不同的任务,其中之一是在容器中附加远程调试器等操作。
为了帮助您,我通过Visual Studio 2019选择了.Net Core 3.0创建了一个示例asp.net core api。
以下是在我通过VS2019启动我的API时,VS2019在我的计算机上生成的docker-compose文件。
docker-compose  -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.yml" -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.override.yml" -f "C:\Users\myuser\source\repos\testwebcore\obj\Docker\docker-compose.vs.debug.g.yml" -p dockercompose14364360289538262671 --no-ansi up -d --build --force-recreate --remove-orphans

我可以通过运行以下命令在PowerShell上直接使其工作,这里我使用的是VS2019默认创建的override文件中使用的相同设置。您必须从项目文件夹外的父文件夹运行此命令。

docker-compose  -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.yml" -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.override.yml" up

如果您直接使用Docker文件构建和运行,而不是使用docker-compose,则可以使用以下命令构建,并且像以前一样应该从项目文件夹外部运行。
docker build -f testwebcore/Dockerfile -t testcore

构建镜像后,您可以使用以下命令运行它,但在此之前,您需要创建证书并将一些环境变量传递给运行命令。有关详细信息,请参见以下页面,特别是 Windows 子系统的部分。我正在我的 Windows 10 笔记本电脑上运行 Linux 容器。
因此,您必须运行以下命令以生成证书。
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p testpassword

因此,完整的运行命令与上述生成的环境变量和证书如下。

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="testpassword" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v c:\users\myuser\.aspnet\https:/https/ testcore:latest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接