【问题标题】:Docker exposed network port does not reach container serviceDocker暴露的网络端口没有到达容器服务
【发布时间】:2020-09-11 09:17:26
【问题描述】:

我正在构建和启动它:

sudo docker build  -t docker_mads_dask_server ~/docker_setups/dask_cluster

echo "Stop/Remove dask_server"
sudo docker stop dask_server -t5
sudo docker rm dask_server

echo "Build tag"
sudo docker build --tag mads_servers.dask_server:0.1.2 ~/docker_setups/dask_cluster
sudo docker run --publish 0.0.0.0:8710:8710 --publish 0.0.0.0:8711:8711 --detach --name dask_server mads_servers.dask_server:0.1.2

我实际上可以看到它是如何运行的:

$ sudo docker ps

CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                        NAMES
a29f89f6929f        mads_servers.dask_server:0.1.2   "python3 /code/mads/…"   4 minutes ago       Up 4 minutes        0.0.0.0:8710-8711->8710-8711/tcp, 8787/tcp   dask_server

现在我连接到容器中:

$ sudo docker exec -it dask_server /bin/bash
root@a29f89f6929f

并查看连接是否打开:

# (inside container)
$ curl -vvv http://127.0.0.1:8710
[...]
< HTTP/1.1 404 Not Found
< Server: TornadoServer/6.0.4

因此,网络服务器实际上是在容器中启动并可以访问的。 现在让我们从外部检查一下:

# (outside container)
$ sudo netstat -tulpn | grep 87

tcp6       0      0 :::8710                 :::*                    LISTEN      8705/docker-proxy   
tcp6       0      0 :::8711                 :::*                    LISTEN      8692/docker-proxy  

端口是开放的,有点害怕 tcp6 - 所以我将其更改为显式 IP 匹配:

--publish 192.168.56.11:8710:8710 --publish 192.168.56.11:8711:8711

netstat 现在显示 IPv4:

# (outside container)
tcp        0      0 192.168.56.11:8710      0.0.0.0:*               LISTEN      13039/docker-proxy  
tcp        0      0 192.168.56.11:8711      0.0.0.0:*               LISTEN      13025/docker-proxy  

但相同的连接测试得到:

$ curl -vvv http://127.0.0.1:8710
* Rebuilt URL to: http://127.0.0.1:8710/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8710 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8710
> User-Agent: curl/7.58.0
> Accept: */*
> 
* Recv failure: Connection reset by peer
* stopped the pause stream!
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer

我的Dockerfile

FROM ubuntu:20.04
FROM python:3.8

RUN apt update && apt install -y cowsay tmux vim net-tools iotop
RUN python -m pip install pandas numpy dask distributed redis sqlalchemy tornado cloudpickle
RUN python -m pip install dask[dataframe] --upgrade
ADD code/ /code/

# Dashboard port
EXPOSE 8710

# Scheduler port
EXPOSE 8711
EXPOSE 8787

CMD ["python3", "/code/mads/mads_pkg/mads_servers/dask_server.py"]

那么为什么dask-proxy 不将其转发到容器暴露端口?

【问题讨论】:

  • 在过去,我已经尝试过sudo docker inspect dask_server | grep IPAdd,它返回172.17.0.2,但curl 172.17.0.2:8710 -vvv带来Connection refused
  • 容器内监听的进程是什么?这通常需要设置为 0.0.0.0(“所有接口”);如果它打印出诸如“正在侦听 127.0.0.1:8710”之类的消息,则无法从容器外部访问它(几乎具有这种确切的症状)。通常不需要为 docker run -p 选项提供 IP 地址,除非您有一个多宿主系统并且您只希望容器在其网络之一上可见。

标签: linux docker docker-networking docker-network


【解决方案1】:

每个容器都有自己的网络堆栈,并且不共享相同的localhost

在您的主机上,您可以在暴露端口时使用 localhost 执行 curl 命令,但是当您使用另一个容器时,您应该使用另一个容器名称来连接或找到它的 IP 并与之连接。

根据您的评论,您获得了内部容器 IP,但您尝试从主机连接,而不再从其他容器内部连接。

通常,您可以将--publish 0.0.0.0:8711:8711 替换为--publish 8711:8711,因为默认情况下,docker 将在所有 IP 上发布端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 2019-01-14
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多