无法从在 docker 容器下运行的应用程序连接到位于 localhost:8000 的快速 api 服务器

问题描述 投票:0回答:4

我是使用 fastapi 的新手。我在 docker 容器中有一个 main.py。当我使用

连接到 fastapi 时
uvicorn main:app —-reload 

来自我的容器。系统提示我连接到 http://127.0.0.1:8000。将地址复制到 Firefox 时出现错误:

 unable to connect. 

如何连接fastapi服务器?

P.S 我正在工作的 git 分支是由另一位同事开发的,所以我几乎不知道 fastapi 是如何在 docker 中设置的

python connection fastapi
4个回答
27
投票

你需要使用命令

uvicorn main:app --reload --host 0.0.0.0

你的docker容器就像一台电脑,是独立的。因此它不允许从外部源访问。使用

--host
选项,您可以允许外部连接(从容器的角度来看在本地主机之外)。基本上,docker 的 localhost 与您计算机的 localhost 不同。


0
投票

解决方案。通过部署应用程序将具有公共地址和网络驱动程序。远程可以使用它,在开发中可以在本地运行selenium。

test_my_web.py

import unittest

from selenium import webdriver
import os

from dotenv import find_dotenv, load_dotenv
from webdriver_manager.chrome import ChromeDriverManager

load_dotenv(find_dotenv())



class TestWebListAll(unittest.TestCase):
    def setUp(self) -> None:
        chrome_options = webdriver.ChromeOptions()
        if os.environ.get("LOCAL_DEV"):  # == 'True'
            self.url = 'http://127.0.0.1:8000/'
            self.driver = webdriver.Chrome(ChromeDriverManager().install())
        else:
            self.driver = webdriver.Remote(
                command_executor='http://localhost:4444',
                options=chrome_options
            )
            self.url = 'insert public addres'  #

    def tearDown(self) -> None:
        self.driver.quit()

    def test_(self):
        self.driver.get(self.url)
        print(self.driver.title)

0
投票

您还需要确保您的端口映射正确。

  1. 在 Dockerfile 中:

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

主机设置为 0.0.0.0,可以作为 localhost 在本地访问(大多数为 127.0.0.1)。

  1. 在 docker 命令中:
docker build -t myfastapi

docker run --name mycontainer -p 8000:80

这会将您本地的端口 8000 映射到 docker 的 80。

现在,您应该能够访问 localhost:8000 的服务器了

希望这有帮助!


-1
投票

作为初学者,同样的事情发生在我身上,查看错误,我意识到我没有保存 main.py

© www.soinside.com 2019 - 2024. All rights reserved.