【问题标题】:Reaching docker container on local machine [duplicate]到达本地机器上的 docker 容器 [重复]
【发布时间】:2021-04-29 18:10:16
【问题描述】:

我已经翻阅了文档,但我仍然缺少一些基本部分。

系统:

  • mac os 11.2.3
  • docker v20.10.5

我在 http_server.py 中使用 Flask 在 python 中有一个愚蠢的 hello world 容器:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'hello world'

Dockerfile:

FROM python:3.8
WORKDIR /
COPY *.py /
RUN pip install Flask
ENV FLASK_APP=http_server.py
CMD flask run -h localhost -p 80

我构建容器:

docker build -t au .

我使用端口转发运行容器:

docker run -p 127.0.0.1:8080:80 httptest

我检查容器:

$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                    NAMES
c857400d06ce   httptest  "/bin/sh -c 'flask r…"   4 minutes ago   Up 4 minutes   127.0.0.1:8080->80/tcp   busy_feistel

我仔细检查了本地机器上实际上有一个打开的套接字:

$ netstat -an | grep 8080
tcp4       0      0  127.0.0.1.8080         *.*                    LISTEN

我打开容器中的 cli 以三次检查应用程序是否正在运行:

$ docker exec -it c857400d06ce8f2dd88d8466d57c0d274320215e24f2a4610b67d0ee75f8a2ad /bin/sh
# curl 127.0.0.1:80
hello world

好像一切都搞定了!我尝试从本地打容器:

$ curl 127.0.0.1:8080
curl: (52) Empty reply from server

我错过了什么?我觉得有一些非常简单的事情我正在掩饰,但我已经达到了搜索 SO 和 docker 文档的 60 分钟标记,所以我认输了。

提前谢谢你!

【问题讨论】:

    标签: python macos docker flask containers


    【解决方案1】:

    在 0.0.0.0 而不是 localhost 上运行烧瓶应用程序或者在主机 network_mode 下运行容器,我认为它会解决问题。

    【讨论】:

    • 这行得通,但感觉像是一种黑客攻击。 0.0.0.0 将捕获 docker 容器内的所有 IPv4 地址。为什么localhost 不起作用?
    • 我认为这是因为 docker 就像代理一样将请求传递给烧瓶应用程序,并且从技术上讲,请求不是来自本地主机,正如我之前所说,您可以将 network_mode 设置为“主机”模式,在这样请求将从本地主机发送
    【解决方案2】:

    我不确定,但请尝试在您的 Dockerfile 中写入下一行 EXPOSE 80

    【讨论】:

    • EXPOSE 80 相同的响应:(
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2023-03-07
    • 2020-08-06
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多