码头工人运行不起作用,但码头工人撰写工作正常



我尝试使用docker运行fastapi应用程序我创建这个Dockerfile

FROM python
WORKDIR /code
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
COPY Pipfile Pipfile.lock /code/
RUN pip install pipenv && pipenv install --system
COPY . /code/
CMD ["uvicorn", "blog.main:app"]

并使用运行

docker run -p 8000:8000

日志显示应用程序在127.0.0.1:8000上运行,但我无法访问上的应用程序http://localhost:8000

我创建了像这个一样的docker组合

services:
web:
build: .
command: uvicorn blog.main:app --reload --workers 1 --host 0.0.0.0 --port 8000
ports:
- "8000:8000"

并从Dockerfile中删除CMD,然后再次让相同的日志消息应用程序运行在127.0.0.1:8000上,但这次我可以通过http://localhost:8000

有人能解释一下我的第一种方法出了什么问题吗?

在docker compose中,您使用正确的方式将host和端口暴露给外部世界来覆盖CMD。在Dockerfile中,将CMD ["uvicorn", "blog.main:app"]更改为CMD ["uvicorn", "blog.main:app", "--host", "0.0.0.0", "--port", "8000"]docker运行应能工作

您不希望应用程序侦听127.0.0.1:8000。您希望它在0.0.0.0:8000上侦听(就像第二个版本一样(。我不熟悉你正在运行的程序,但一定有办法告诉它主机要听。

当服务器绑定到localhost(127.0.0.1(时,它只接受来自该机器的连接。(客户端还必须使用localhost,而不是实际的IP地址。(由于对docker来说,主机是另一台机器,因此不允许连接。

最新更新