[英]Docker exposed network port does not reach container service
我正在構建並啟動它:
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
不將其轉發到容器暴露端口呢?
每個容器都有自己的網絡堆棧,並且不共享相同的localhost
。
在您的主機上,您可以在暴露端口時使用 localhost 執行 curl 命令,但是當您使用另一個容器時,您應該使用另一個容器名稱來連接或找到它的 IP 並與之連接。
根據您的評論,您獲得了內部容器 IP 但您嘗試從主機連接,而不再從另一個容器內部連接。
通常,您可以將--publish 0.0.0.0:8711:8711
替換為--publish 8711:8711
,因為默認情況下 docker 將在所有 IP 上發布端口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.