【问题标题】:Can't curl linked container in Docker even though I can ping it即使我可以 ping 它,也无法在 Docker 中卷曲链接的容器
【发布时间】:2015-02-23 22:31:03
【问题描述】:

我有一个名为 backend 的 Docker 容器,它公开一个端口 8200,并在其内部的 gunicorn 后面运行一个 django 服务器。这是我的 Dockerfile:

FROM debian:wheezy

RUN rm /bin/sh && \
    ln -s /bin/bash /bin/sh && \
    apt-get -y update && \
    apt-get install -y -q \
                    curl \
                    procps \
                    python=2.7.3-4+deb7u1 \
                    git \
                    python-pip=1.1-3 \
                    python-dev \
                    libpq-dev && \
    rm -rf /var/lib/{apt,dpkg,cache,log}

RUN pip install virtualenv && \
    virtualenv mockingbird && \
    /bin/bash -c "source mockingbird/bin/activate"

ADD ./requirements.txt /mockingbird/backend/requirements.txt
RUN /mockingbird/bin/pip install -r /mockingbird/backend/requirements.txt

ADD ./src /mockingbird/backend/src

CMD ["/mockingbird/bin/gunicorn", "--workers", "8", "--pythonpath", "/mockingbird/backend/src/", "--bind", "localhost:8200", "backend.wsgi"]

我正在像这样运行这个容器:

vagrant@10:~$ sudo docker run --name backend --env-file /mockingbird/apps/backend/env/dev -d --restart always --expose 8200 mockingbird/backend

我知道 django 服务器已启动并通过执行以下操作并在正确的端口上响应并获得响应:

vagrant@10:~$ sudo docker exec -it backend /bin/bash
root@b488874c204d:/# curl localhost:8200

然后我启动一个链接到后端的新容器,如下所示:

sudo docker run -it --link backend:backend debian:wheezy /bin/bash

但是当我尝试 curl 后端时,它不起作用:

root@72946da3dff9:/# apt-get update && apt-get install curl
root@72946da3dff9:/# curl backend:8200
curl: (7) couldn't connect to host

但是,我可以 ping 后端:

root@72946da3dff9:/# ping backend
PING backend (172.17.0.41): 48 data bytes
56 bytes from 172.17.0.41: icmp_seq=0 ttl=64 time=0.116 ms
56 bytes from 172.17.0.41: icmp_seq=1 ttl=64 time=0.081 ms

任何人都知道我可以尝试调试为什么我无法连接到在我的链接 Docker 容器中运行的服务?为了能够从链接的容器中 curl backend:8200,我在这里缺少什么东西吗?

【问题讨论】:

    标签: linux django curl docker gunicorn


    【解决方案1】:

    这可能是个问题:"--bind", "localhost:8200" 因为连接到backend 主机名将不被接受。您可能希望将其更改为 "0.0.0.0:8200"":8200",具体取决于支持的符号。

    【讨论】:

    • @Mykola Gurov :我在 docker-compose 中遇到了同样的问题,尽管我已经暴露了所需的端口。
    • 我也在同一条船上。你找到解决办法了吗?
    • 我想将清漆别名为api.localhost.com,但是当我从另一个容器卷曲它时它不会,因为卷曲正在使用80,因为我认为80是我的端口暴露,但是当您在容器内并且想要使用别名时,您应该使用正在侦听清漆容器内的端口 6081 而不是暴露的端口,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多