Не удается получить доступ к приложению Flask, запущенному в контейнере, с локального хост-компьютера macOS M1

#docker #docker-compose #apple-silicon

Вопрос:

Я пытаюсь запустить простое приложение для колбы в контейнере с моего Apple Silicon macOS. Однако я не могу получить доступ к приложению started Flask (приложение запускается без проблем внутри контейнера) с хоста Mac на localhost:5000 .

Может кто-нибудь, пожалуйста, помочь с этим. Я пробовал другие решения в Интернете, но ни одно из них не работало. Может ли это быть проблемой с Mac и Докером?

docker-compose.yml файл является:

 version: '3'

services:
  basic_app:
    build:
        context: .
        dockerfile: Dockerfile
    #network_mode: host -> not needed
    ports:
      - "5000:5000"
    command: bash -c "flask run --host=0.0.0.0 --port=5000"
 

Ответ №1:

network_mode: host не работает на macOS и вообще почти никогда не понадобится. Удалите эту строку.

Попытка включить сеть хостинга в настройках рабочего стола Docker приведет к тому, что это приложение не будет работать, даже если вы установили другие флажки (серверный процесс прослушивает 0.0.0.0, опубликован ports: ). Вы должны получить предупреждение о том, что ports: сеть хоста и сеть хоста несовместимы, поскольку сеть хоста-это инструкция по отключению сетевого уровня Docker.

(Технически процесс выполняется в сети хоста скрытой виртуальной машины Linux, но без функционирования ports: проводки вы не можете получить к ней доступ с хоста macOS.)

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

1. Извините, я пропустил ту часть, что сеть хостов не работает на macOS. @David Maze, таким образом, это означает, что невозможно получить доступ к приложению типа веб-службы с macOS. Это облом. Интересно, все ли такие приложения разработаны на виртуальных машинах Linux и т. Д.

2. Вам особенно не нужна сеть хоста для обычного приложения типа веб-службы. Обычный docker run -p вариант или Compose ports: опубликует порт в хост-системе так, как вы ожидаете. Это необходимо только в том случае, если приложение прослушивает тысячи портов или непредсказуемые порты, или ему необходимо каким-либо образом нарушить абстракцию контейнера, и ни одно из них не относится к типичному приложению, обслуживающему HTTP.