【问题标题】:Can't access flask site outside Docker container无法访问 Docker 容器外的烧瓶站点
【发布时间】:2020-04-14 17:13:59
【问题描述】:

我正在使用 Python 3.6 运行 Linux Mint。

我已阅读此处的每个链接,但无法弄清楚哪里出了问题。我正在运行一个简单的烧瓶应用程序,当我在我的机器上本地运行它时它运行良好,但随后使用 Docker 运行它我无法在我的浏览器中访问 IP。

我已将烧瓶应用程序设置为在主机 0.0.0.0 上运行,并使用 app.run(host='0.0.0.0')

Dockerfile:

FROM python:3.7

RUN mkdir -p /var/app

WORKDIR /var/app

COPY . /var/app

RUN pip install --upgrade pip

RUN pip install -r requirements.txt

EXPOSE 5000

CMD ["pytest", "-v", "tests/test_flask_api.py"]
# CMD ["python3", "app.py"]
CMD ["python3", "-m", "Flask", "run", "--host=0.0.0.0"]

docker-compose.yml:

web:
  build: ./app
  ports:
   - "5000:5000"
  volumes:
   - .:/code

运行命令docker-compose up -d构建并运行容器后,我运行命令docker inspect --format '{{ .NetworkSettings.IPAddress }}'得到容器的IP地址为172.17.0.2

我尝试通过172.17.0.2:5000localhost:5000 访问该站点,但都只是挂起并且无法加载。

最后,我运行docker exec -it restapimma_web_1 /bin/bash 进入容器。然后我运行curl localhost:5000 并能够得到正确的响应。所以烧瓶应用程序在容器内运行,我无法在容器外访问它。

【问题讨论】:

  • 你试过暴露5000吗?
  • 是的,不过没有帮助。
  • @Sociopath 我通过运行docker inspect --format '{{ .NetworkSettings.IPAddress }}' 获得了docker 容器的IP,即172.17.0.2。但是172.17.0.2:5000 不会为我加载。
  • docker IP 只能用于 docker 内的应用程序,但如果您想从 docker 外部访问,请使用主机 IP,即 安装 docker 的机器的 IP
  • @Sociopath 抱歉所有问题,您有运行此命令的命令吗?根据您的描述,localhost 应该可以工作。

标签: python docker flask docker-compose


【解决方案1】:

我遇到了类似的问题。让它工作:

  1. 允许您的烧瓶应用接受来自您的环境的 HOST 参数
if __name__ == "__main__":
    app.run(
        host=os.environ.get("BACKEND_HOST", "172.0.0.1"),
        port=your_port,
        debug=True,
    )
  1. 在您的作品中设置您的主机环境变量
services:
  [your service name]:
    image:[your image]
    environment:
      - BACKEND_HOST=[your service name]
    ports:
      - "[etc]"

flask 基本上想要使用正确的主机名来调用

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多