首页 > 解决方案 > 在没有暴露端口的情况下,容器如何通过 python 与另一个通信?

问题描述

在这里的例子- https://docs.docker.com/compose/gettingstarted/

烧瓶:

from flask import Flask

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

Dockerfile:

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

Web 应用程序在 0.0.0.0 端口 5000 上的容器中运行

Redis 在单独的容器和默认端口 6389 上运行

Web 应用容器通过暴露端口 5000:5000 运行

我试图了解在没有指定网络时 web 应用程序容器如何与 redis 容器通信。或者其他容器的6389端口没有暴露的时候?

标签: docker

解决方案


如果文件中没有提供网络信息docker-compose.yml,Docker 将为容器使用默认子网(除非明确命名,否则将调用它${current_working_dir}_default}。由于两个容器在技术上位于同一子网上,因此它们可以相互通信其他不暴露端口。使用EXPOSE暴露端口通常是为了允许用户主机与容器通信(即,使用笔记本电脑上的浏览器打开 Flask 应用程序)。

为了让您的 Flask 应用程序与 Redis 通信,您可能需要在文件中向服务添加hostname描述符。否则,服务的主机名可能只是一些 SHA 哈希,这会使 Flask 应用程序难以找到它(除非您知道并使用服务的 IP 地址)redisdocker-compose.ymlredisredis


推荐阅读