Как контейнер взаимодействует с другим через python, когда порт не открыт?

#docker

Вопрос:

В примере здесь — https://docs.docker.com/compose/gettingstarted/

Колба:

 from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
 

Докерфайл:

 # syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
 

Составить:

     version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
 

Веб-приложение работает в контейнере на 0.0.0.0 порту 5000

Redis работает в отдельном контейнере и порту по умолчанию 6389

Контейнер веб-приложения запускается с использованием порта 5000:5000

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

Комментарии:

1. См.также раздел Создание сетей в Compose в документации Docker. «Разоблачение» почти ничего не значит в современном докере, и оно не требуется для взаимодействия между контейнерами.

Ответ №1:

Если в файле нет информации о сети docker-compose.yml , Docker будет использовать подсеть по умолчанию для контейнера (если она не будет названа явно, она будет вызвана ${current_working_dir}_default} . Поскольку технически два контейнера находятся в одной подсети, они могут взаимодействовать друг с другом, не открывая порты. Использование EXPOSE для предоставления портов, как правило, предназначено для того, чтобы позволить пользователям хост-машины взаимодействовать с контейнером (т. Е. Открывать приложение Flask с помощью браузера на вашем ноутбуке).

Чтобы ваше приложение Flask могло взаимодействовать с Redis, вам, возможно, потребуется добавить hostname дескриптор redis службы в свой docker-compose.yml файл. В противном случае имя хоста redis службы может быть просто каким-то хэшем SHA, и это затруднит приложение Flask его найти (если вы не знаете и не используете IP-адрес redis службы)

Комментарии:

1. Итак, все контейнеры, участвующие в сценарии создания, будут иметь свою собственную мостовую сеть по умолчанию.

2. Правильно — когда вы это сделаете docker-compose up , вы увидите Creating network "<name_of_current_directory>_default" with the default driver

3. Ни hostname: то, ни container_name: другое обычно не требуется. hostname: в частности, влияет только на то, что контейнер считает своим собственным именем хоста, и это не влияет на сеть или на то, как другие контейнеры могут связаться с ним.