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 运行 应该可以工作
我尝试 运行 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 运行 应该可以工作