首页 > 解决方案 > 无法使用 docker-compose 从本地主机访问 docker 应用程序

问题描述

在我开始之前:我已经搜索了这个问题并实施了“解决方案”,但它没有帮助(将主机设置为 0.0.0.0)。所以,不碍事,

目录结构

|-- osr
|    |-- __init__.py
|-- requirements.txt
|-- Dockerfile
|-- docker-compose.yml

Dockerfile:

FROM python:3.7.5-buster

EXPOSE 5000 # i have tried with and without this

ENV INSTALL_PATH /osr
ENV FLASK_APP osr
ENV FLASK_ENV development
RUN mkdir -p $INSTALL_PATH

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD [ "flask", "run", "--host=0.0.0.0"]

码头工人-compose.yml:

version: '3.8'
services:
    web:
        build: .
        ports:
            - '5000:5000'
        expose:
            - '5000'
        volumes:
            - .:/osr

__ 初始化 __.py

import os
from flask import Flask

def create_app(test_config=None):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev'
    )

    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

docker-compose 构建网络 docker-compose 运行网络

 * Serving Flask app "osr" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 225-441-434

以下所有内容均返回“嗯无法访问此页面”

http://localhost
http://localhost:5000/hello
http://127.0.0.1:5000/hello

我什至尝试过使用

docker exec -it 49e677 bash ip add | grep 全球 inet 172.21.0.2/16 brd 172.21.255.255 范围全球 eth0

http://127.21.0.2:5000/hello # nothing

没有什么。

我确信应用程序本身运行良好,因为我可以直接运行应用程序。

$env:FLASK_APP="osr"
$env:FLASK_ENV="development"
flask run --host=0.0.0.0

它运行良好

本地主机

编辑:更新

当我通过简单的 Dockerfile 运行它时,我实际上能够到达容器......使用

docker run -it -p 5000:5000 osr_web # docker-compose build 构建的容器

有了这个,我可以通过 localhost:5000/hello 访问端点

所以问题似乎在于通过 docker-compose run 旋转它

这有帮助吗?

更新 2

我发现当我运行 docker ps -a 我可以看到 Docker run 实际上暴露了端口,但 docker-compose run 没有:

在此处输入图像描述

标签: dockerdocker-compose

解决方案


您确定应用程序本身可以正常工作吗?我试图运行你的 python__init__.py文件并最终出现错误。

python osr/__init__.py 
  File "osr/__init__.py", line 11
    def hello():
    ^
IndentationError: unexpected indent

它在修复缩进错误后工作。

@app.route('/hello')
def hello():
    return 'Hello, World!'

$ docker run -d -p 5000:5000 harik8/osr:latest 
76628f86fecb61c0be4a969d3c91c5c575702ad8063b594a6c1c90b498ea25f1

$ curl http://127.0.0.1:5000/hello
Hello, World!

您不能同时在端口 5000 中运行 docker 和 docker-compose。一次运行一个或更改 docker-compose/dockerfile 主机端口。

$ docker ps -a | grep osr
8b885c4a9654        harik8/osr:latest                                     "flask run --host=0.…"   12 seconds ago       Up 11 seconds               0.0.0.0:5000->5000/tcp
$ docker ps -a | grep q5      
70f38bf11e26        q5_web                                                "flask run --host=0.…"   About a minute ago   Up 10 seconds               0.0.0.0:5001->5000/tcp

$ docker ps -a | grep q5
f9f6ba999109        q5_web                                                "flask run --host=0.…"   5 minutes ago       Up 5 minutes                0.0.0.0:5000->5000/tcp                                                                                                   q5_web_1
$ docker ps -a | grep osr
93fb421333e4        harik8/osr:latest                                     "flask run --host=0.…"   18 seconds ago      Up 18 seconds               5000/tcp 

推荐阅读