docker compose автоматически создает сопоставления портов? - PullRequest
0 голосов
/ 20 июня 2020

Я создал простое приложение asp. net core в Visual Studio 2019 и добавил поддержку docker. Созданы файлы

Dockerfile, .dockerignore и docker -compose.

Add docker support to visual studio project

В командной строке я перехожу к папке docker -compose.yml, а затем запускаю команду

docker-compose up

Я вижу, что создаются контейнеры и выполняется сопоставление портов, так что я могу просматривать веб-приложение в браузере.

Итак, когда я запускаю следующую команду проверки в контейнере

docker inspect --format="{{ .NetworkSettings.Ports}}" ContainerId

, я получаю что-то вроде этого

map[80/tcp:[{0.0.0.0 32782}]]

Итак, теперь я могу просматривать приложение с помощью http://localhost: 32782 / index. html

Затем, если я разорву контейнеры с помощью

docker-compose down

, контейнеры будут остановлены и удалены. Созданное изображение остается.

Теперь, когда я выполняю docker запуск с этим изображением, чтобы запустить контейнер

docker run -it --rm  ae39

, создается новый контейнер, но я не могу просматривать приложение, потому что нет сопоставления портов от контейнера к хосту. Я должен явно указать это, когда использую команду run. Только тогда я могу просматривать приложение, работающее внутри контейнера, формирующего хост.

Но когда я использую docker compose, мне не нужно указывать сопоставление портов. Произошло что-то волшебное, и мне были созданы сопоставления портов. Обратите внимание, что файл docker -compose.yml является обычным файлом и не содержит сопоставлений портов. Так же и Dockerfile. Они включены ниже для справки.

Мой вопрос: docker compose автоматически создает сопоставления портов? Если да, то как? Это нужно сделать с Visual Studio 2019

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"]

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Думаю, я нашел ответ.

Ключ - это команда 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 является одним из таких файлов. И теперь этот , так что ans должен помочь, как подсказал Фабиан-Десно.

1 голос
/ 20 июня 2020

Наличие тега EXPOSE в вашем файле докеров сообщает платформе, которую вы используете, что вам нужно сопоставить этот порт. При использовании docker -compose он увидит это и автоматически сопоставит это со случайным открытым портом. Однако ключевое слово EXPOSE не предоставляет никаких портов. Он просто используется, чтобы сказать платформе, которую вы используете: «Не могли бы вы открыть этот порт для меня», и полагается на платформу, которая сделает это за вас.

Если вы хотите, чтобы порты были сопоставлены с определенным c порт каждый раз на вашем хост-компьютере, тогда вы можете добавить «порты» к службе в себе docker -compose.yml (host_machine_port: container_port)

...