Docker 容器端口设置不正确

Docker container ports setup incorrectly

我想 docker 处理一个简单的应用程序。这是一个简单的 API,当我 运行 它在我的机器上时可以正常工作,并且可以在 http://127.0.0.1:8000/ 上访问 这是我创建的docker文件

FROM python:3.6-slim-stretch
WORKDIR /code
COPY requirements.txt /code
RUN pip install -r requirements.txt --no-cache-dir
COPY . /code
CMD ["uvicorn", "main:app", "--reload"]

然后我使用此命令创建映像 sudo docker build -t test .

然后运行这样 sudo docker 运行 -d -p 8000:8000 test

问题是我无法访问它http://127.0.0.1:8000/ 即使我不知道这个问题

PS:当我检查我的容器端口时,我得到 0.0.0.0:8000->8000/tcp, ::8000->8000/tcp

我想知道导致此问题的原因以及解决方法。

  1. 尝试访问 http://0.0.0.0:8000
  2. “我可以访问它”是什么意思?你的许可被拒绝了吗? 404?你看到了什么错误?
  3. 尝试访问容器内部:$docker exec -it test bash 和 查看程序是否在其中 运行:$curl http://0.0.0.0:8000.
  4. 尝试卷入容器的显式 ip。 获取ip:docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test

默认情况下 uvicorn 监听 127.0.0.1127.0.0.1容器内部是私有的,不参与portforwarding。

解决方法是uvicorn --host 0.0.0.0,例如:

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

有关为什么会出现这种情况的解释以及图表,请参阅 https://pythonspeed.com/articles/docker-connection-refused/