docker 运行 无法正常工作,但 docker compose 可以正常工作

docker run won't work but docker compose work fine

我尝试 运行 fastapi 应用程序 docker 我创建了这个 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 并再次具有相同的日志消息 application 运行ning 127.0.0.1:8000 但这次我可以通过 http://localhost:8000

访问我的应用程序

有人可以解释一下我的第一种方法有什么问题吗?

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

当服务器绑定到本地主机 (127.0.0.1) 时,它只接受来自该机器的连接。 (客户端也必须使用localhost,而不是实际的IP地址。)由于到docker,主机是不同的机器,所以不允许连接。

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