docker compose是否自动创建端口映射?

docker compose是否自动创建端口映射?,docker,docker-compose,Docker,Docker Compose,我在Visual Studio 2019中创建了一个简单的asp.net核心应用程序,并添加了docker支持 Dockerfile、.DockerRigNore和docker compose文件都已创建 在命令提示符下,我导航到docker-compose.yml文件所在的文件夹,然后运行该命令 docker-compose up 我看到创建了容器并进行了端口映射,以便我可以在浏览器中浏览web应用程序 所以当我在容器上运行下面的inspect命令时 docker inspect --fo

我在Visual Studio 2019中创建了一个简单的asp.net核心应用程序,并添加了docker支持

Dockerfile、.DockerRigNore和docker compose文件都已创建

在命令提示符下,我导航到docker-compose.yml文件所在的文件夹,然后运行该命令

docker-compose up
我看到创建了容器并进行了端口映射,以便我可以在浏览器中浏览web应用程序

所以当我在容器上运行下面的inspect命令时

docker inspect --format="{{ .NetworkSettings.Ports}}" ContainerId
我得到了这样的东西

map[80/tcp:[{0.0.0.0 32782}]]
现在我可以用

下一步,如果我用

docker-compose down
容器将停止并删除。创建的图像仍然存在

现在,当我做一个docker时,运行该图像来启动一个容器

docker run -it --rm  ae39
创建了一个新容器,但我无法浏览应用程序,因为没有从容器到主机的端口映射。当我使用run命令时,我必须明确指定这一点。只有这样,我才能浏览主机容器内运行的应用程序

但是当我使用docker compose时,我不必指定端口映射。神奇的事情发生了,端口映射为我创建。请注意,docker-compose.yml文件是平面文件,不包含任何端口映射。Dockerfile也是如此。它们包括在下面以供参考

我的问题是docker compose是否自动创建端口映射?如果是,怎么做?当然,这就是对VisualStudio2019做一些事情

version: '3.4'

services:
  generator31:
    image: ${DOCKER_REGISTRY-}generator31
    build:
      context: .
      dockerfile: generator31/Dockerfile
dockerfile在这里

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["generator31/generator31.csproj", "generator31/"]
RUN dotnet restore "generator31/generator31.csproj"
COPY . .
WORKDIR "/src/generator31"
RUN dotnet build "generator31.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "generator31.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "generator31.dll"]

通过在dockerfile中使用EXPOSE标记,它会告诉您正在使用的平台您需要映射该端口。当使用docker compose时,它会看到这一点并自动将其映射到一个随机打开的端口。但是,EXPOSE关键字不公开任何端口。它只是用来对你正在使用的平台说“你能为我公开这个端口吗?”并依靠平台为你做这件事


如果希望端口每次都映射到主机上的特定端口,则可以在docker-compose.yml(主机\u-machine\u-port:container\u-port)中向服务添加“端口”

我想我找到了答案

关键是config命令

docker-compose config
运行该命令后,我看到以下内容

services:
  generator31:
    build:
      context: D:\Trials\Docker\aspnetcore311\generator31
      dockerfile: generator31/Dockerfile
    environment:
      ASPNETCORE_ENVIRONMENT: Development
    image: generator31
    ports:
    - target: 80
version: '3.4'
我看到了端口,也看到了环境。在我粘贴在问题中的docker compose文件中,它们不存在。那么他们是从哪里来的呢

我在文件资源管理器中打开文件夹,看到docker-compose.override.yml文件静静地放在docker-compose.yml文件旁边。打开那个文件,我就知道答案了。
这里定义了端口。Docker compose命令从多个文件中提取配置,Docker-compose.override.yml就是这样一个文件。正如法比安·德斯诺伊斯(Fabian Desnoes)所建议的那样,这应该会有所帮助。

这篇文章将对此进行更详细的解释。docker-compose.override.yml包含docker-compose.VS的所有映像的基本配置。在VS处添加一个docker compose项目,其中包含三个解决方案文件dcproj、.DockerRigNore、compose和override,并合并这些文件。