如何在Windows容器中获得Docker IP?

我无法获取容器IP地址从浏览器运行它。

代码片段

PS H:\DevAreaLocal\COMPANY - RAD PROJECTS\DockerApp\WebDockerCoreApp> docker-compose build Building webdockercoreapp Step 1/5 : FROM microsoft/aspnetcore:1.1 ---> 4fe9b4d0d093 Step 2/5 : WORKDIR /WebDockerCoreApp ---> Using cache ---> b1536c639a21 Step 3/5 : COPY . ./ ---> Using cache ---> 631ca2773407 Step 4/5 : EXPOSE 80 ---> Using cache ---> 94a50bb10fbe Step 5/5 : ENTRYPOINT dotnet WebDockerCoreApp ---> Using cache ---> 7003460ebe84 Successfully built 7003460ebe84 Successfully tagged webdockercoreapp:latest PS H:\DevAreaLocal\COMPANY - RAD PROJECTS\DockerApp\WebDockerCoreApp> docker inspect --format="{{.Id}}" 7003460ebe84 

得到了贝娄ID

SHA256:7003460ebe84bdc3e8647d7f26f9038936f032de487e70fb4f1ca137f9dde737

如果我运行下面的命令

 docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" 7003460ebe84 

得到了响应

模板parsing错误:模板:1:19:在<.NetworkSettings.Net …>上执行“”:map没有input密钥“NetworkSettings”

Docker.Compose.yml文件设置

 version: '2.1' services: webdockercoreapp: image: webdockercoreapp build: context: ./WebDockerCoreApp dockerfile: Dockerfile ports: - "5000:80" networks: default: external: name: nat 

通过滔滔不绝的“ docker network ls

得到了轰鸣声的回应

 NETWORK ID NAME DRIVER SCOPE f04966f0394c nat nat local 3bcb5f906e01 none null local 680d4b4e1a0d webdockercoreapp_default nat local 

当我运行“ docker network inspect webdockercoreapp_default

得到下面的回应

 [ { "Name": "webdockercoreapp_default", "Id": "680d4b4e1a0de228329986f217735e5eb35e9925fd04321569f9c9e78508ab88", "Created": "2017-12-09T22:59:55.1558081+05:30", "Scope": "local", "Driver": "nat", "EnableIPv6": false, "IPAM": { "Driver": "windows", "Options": null, "Config": [ { "Subnet": "0.0.0.0/0", "Gateway": "0.0.0.0" } ] }, "Internal": false, "Attachable": true, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": { "com.docker.network.windowsshim.hnsid": "ad817a46-e7ff-4fc7-9bb9-d6cf17820b8a" }, "Labels": { "com.docker.compose.network": "default", "com.docker.compose.project": "webdockercoreapp" } } ] 

当你运行命令docker inspect --format="{{.Id}}" 7003460ebe84 – 你当前正在运行这个映像ID而不是容器ID

图像是您构build的静态资产,以及从哪个容器运行。 所以你需要做的是首先通过以下方式把你的图片上传到网上:

 docker-compose up 

现在,您将能够通过以下方式查看正在运行的容器

 docker ps 

find你想要的容器; 假设它是abcd1234

现在,您将能够对容器运行原始命令 – 而不是图像。

 docker inspect --format="{{.Id}}" abcd1234 

这将返回容器的全部SHA; 而且由于你最初询问了networking设置, 你将能够运行如下的东西:

 docker inspect -f "{{ .NetworkSettings.Networks.your_network_here.IPAddress }}" abcd1234 

如果你不确定你的networking名称是什么(看起来应该是nat ),只要做一个完整的docker inspect abcd1234 ,看看输出,并根据需要调整filter。


用Docker文件改变命令解决了这个问题。 Bellow是代码片段

  1. 由于我们必须build造我们的项目,所以我们创build的第一个容器是一个临时容器,我们将用它来做,然后在最后丢弃它。

  2. 接下来,我们将.csproj文件复制到临时容器的“/ app”目录中。 我们这样做是因为.csproj文件包含一个我们项目需要的包引用列表。 在复制这个文件之后,dotnet会从中读取,然后出去获取我们项目需要的所有依赖项和工具。

  3. 一旦我们取消了所有这些依赖,我们将它复制到临时容器中。 然后,我们告诉dotnet使用发布configuration发布我们的应用程序,并指定输出path。

  4. 我们应该已经成功编译了我们的项目 现在我们需要build立我们的最终容器。

  5. 我们的这个最终容器的基本映像与上面的FROM命令类似但不同,它没有能够构buildASP.NET应用程序的库,只能运行。

震荡:

现在我们已经成功地进行了所谓的多阶段构build。 我们使用临时容器来构build我们的图像,然后将已发布的dll移到另一个容器中,以便最终减less最终结果的占用空间。 我们希望这个容器具有绝对最小的所需依赖性来运行; 如果我们一直使用我们的第一个图像,那么它将与其他图层(用于构buildASP.NET应用程序)打包在一起,这并不重要,因此会增加我们的图像大小。

 FROM microsoft/aspnetcore-build:1.1 AS build-env WORKDIR /app COPY *.csproj ./ RUN dotnet restore COPY . ./ RUN dotnet publish -c Release -o out FROM microsoft/aspnetcore:1.1 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "CoreApiDockerSupport.dll"] 

放在.dockerignore文件中

 bin\ obj\ 

注意:如果您使用docker-compose.yml支持(使用docker-compose.ymldocker-compose.ci.build.yml )文件或不使用它,从Visual Studio IDE创build一个Asp.Net Core Project,上述设置将会起作用。

来源1 – build设样本应用程序

源码2 – 带有Docker的asp-net-core-on-linux