什么使用 Docker 容器端口?

什么使用 Docker 容器端口?

在设置我的第一个docker环境时,我创建了一个特定的网络:

root@srv /e/docker# docker network inspect docker
[
    {
        "Name": "docker",
        "Id": "7b20560b36032d36ffe6c0ebece6b4408355d207f4e203a2957b0434ee0afdc1",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.200.0.0/24"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

我根据该网络的图像创建了一个具有特定 IP 的容器:

root@srv /e/docker# docker create --network docker --ip 10.200.0.2 --hostname dev -p 22:22 --name dev base
807f3892241d314d20837c4c749912097e1f34c62884401acd9a06e201cb5876

然后我启动了这个容器并得到:

root@srv /e/docker# docker start dev
Error response from daemon: driver failed programming external connectivity on endpoint dev (807f3892241d314d20837c4c749912097e1f34c62884401acd9a06e201cb5876): Error starting userland proxy: listen tcp 0.0.0.0:22: bind: address already in use
Error: failed to start containers: dev

事实上,它具有默认绑定到所有可用 IP 地址的supervisord启动功能sshd -D对于该主机。由于它的 IP 是10.200.0.2,我期望sshd绑定到它的127.0.0.110.200.0.2。看起来这个端口被某些东西占用了,但是什么呢?

主机确实正在sshd运行,但是这对于客户容器来说应该无关紧要,对吗?(因为它生活在自己的世界中,只知道上述两个 IP)?

编辑评论后:换句话说,我想sshd绑定到容器的 IP(它看到的 IP = 10.200.0.2),并将此端口暴露在容器外部的同一 IP 上。或者,从实际角度来说,我希望能够从主机到达容器的。ssh [email protected]sshd

答案1

如果您想本地连接,请不要发布端口。

/e/docker# docker create --network docker --ip 10.200.0.2 --hostname dev --name dev base

您想公开端口。 https://docs.docker.com/engine/reference/builder/

测试/Docker文件

FROM base
EXPOSE 22

docker build -t test -f test/DockerFile test/DockerFile

答案2

尝试修改-p publish参数以绑定到特定 IP,例如-p 10.200.0.2:22:22。如果我没记错的话,默认情况下,docker 将公开端口发布为 0.0.0.0。正如您所提到的,您已经在主机网络上使用了端口 22。

答案3

因此,该-p标志会发布主机上的端口。只需排除标签即可仅在容器网络上使用它。

相关内容