我尝试使用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来说,主机是另一台机器,因此不允许连接。