Я уверен, что на этот вопрос уже был дан ответ, но я нигде не могу найти простого решения. У меня несколько docker-compose
проекты, работающие на одном хосте, с уникальными сопоставлениями портов хоста.
Я хотел бы получить доступ к Flask API извне сервера, но не могу понять, как это сделать. Вроде есть вариант при запуске docker-compose run -p
, но я понимал, что docker-compose up -d
- это предпочтительный и надежный способ запуска compose.
Я пытался изменить network_mode: "bridge"
к network_mode: "host"
, но это не помогло.
Допустим, IP-адрес хоста - 123.23.23.111, я хотел бы получить доступ к api
обслуживание извне через что-то вроде http://123.23.23.111:5004
, а также Цветочный монитор через http://123.23.23.111:5559
.
Все это работает в частной сети, и я хотел бы, чтобы другой сервер в частной сети имел доступ к API, но доступ в Интернет не требуется. https будет добавлен позже.
version: '3.7'
services:
api:
build:
context: ./
dockerfile: ./api/Dockerfile
restart: always
ports:
- "5004:5000"
network_mode: "host"
depends_on:
- redis
worker:
user: nobody
build:
context: ./
dockerfile: ./worker/Dockerfile
depends_on:
- redis
monitor:
build:
context: ./
dockerfile: ./monitor/Dockerfile
ports:
- "5559:5555"
network_mode: "host"
entrypoint: flower
command: --port=5555 --broker=redis://redis:6379/0
depends_on:
- redis
redis:
image: redis
Dockerfile в api/Dockerfile
FROM python:3.6-alpine
ENV CELERY_BROKER_URL redis://redis:6379/0
ENV CELERY_RESULT_BACKEND redis://redis:6379/0
ENV HOST 0.0.0.0
ENV DEBUG true
COPY ./api/requirements.txt /api/requirements.txt
COPY .env /api
WORKDIR /api
# install requirements
RUN pip install -r requirements.txt
# expose the app port
EXPOSE 5001
RUN pip install gunicorn
COPY ./api/app.py /api/app.py
COPY ./api/worker.py /api/worker.py
# run the app server
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "3", "app:app"]
Также интересно:
sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
eb03130b85ea bridge bridge local
15f8a2e5cd21 host host local
d80f015461c3 myapp_default bridge local
0dd1b3ace731 none null local
ports
должен выставить его так, как вы хотите, если вы уйдете network_mode
вне. Просто не устанавливай это на host
или none
. Также убедитесь, что доступ не блокирует брандмауэр вашего хоста.
Сопоставление портов несовместимо с network_mode: host