在设置我的第一个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
实际上,它已经supervisord
开始sshd -D
默认绑定到该主机的所有可用 IP 地址。由于它的 IP 是10.200.0.2
,我希望sshd
绑定到它的127.0.0.1
和10.200.0.2
. 看起来这个端口被什么东西占用了,但是什么?
主机确实有一个sshd
运行,但这对于来宾容器来说应该没关系,对吧?(因为它生活在自己的世界中,只知道上面的两个 IP)?
评论后编辑:换句话说,我想sshd
绑定到容器的 IP(它看到的那个 = 10.200.0.2
),并让这个端口暴露在容器外部,在同一个 IP 上。或者,实际上,我希望能够从主机ssh [email protected]
到达并到达sshd
容器。
如果要在本地连接,请不要发布端口。
/e/docker# docker create --network docker --ip 10.200.0.2 --hostname dev --name dev base
您想公开端口。 https://docs.docker.com/engine/reference/builder/
测试/DockerFile
docker build -t test -f test/DockerFile test/DockerFile
尝试修改
-p publish
参数以绑定到特定 IP,例如-p 10.200.0.2:22:22
. 如果我没记错的话,默认情况下,docker 会将暴露的端口发布到 0.0.0.0。正如您所提到的,您已经在主机网络上使用了端口 22。因此,
-p
标志在主机上发布端口。只需排除标签以仅在容器网络上使用它。