#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:
в частности, влияет только на то, что контейнер считает своим собственным именем хоста, и это не влияет на сеть или на то, как другие контейнеры могут связаться с ним.