docker compose是否自动创建端口映射?
我在Visual Studio 2019中创建了一个简单的asp.net核心应用程序,并添加了docker支持 Dockerfile、.DockerRigNore和docker compose文件都已创建 在命令提示符下,我导航到docker-compose.yml文件所在的文件夹,然后运行该命令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
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,并合并这些文件。