在设置我的第一个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.1
和10.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
标志会发布主机上的端口。只需排除标签即可仅在容器网络上使用它。