我使用Docker Overlay网络创建了一个Docker multi-host network,其中包含4个节点:node0,node1,node2和node3。 Node0充当键值存储,其共享节点的信息,而node1,node2和node3绑定到键值存储。
以下是node1网络:
user@node1$ docker network ls
NETWORK ID NAME DRIVER
04adb1ab4833 RED overlay
[ . . ]
至于node2网络:
user@node2$ docker network ls
NETWORK ID NAME DRIVER
04adb1ab4833 RED overlay
[ . . ]
container1
正在node1上运行,它承载着名为RED的网络。
user@node1$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9bacac3c01d ubuntu "/bin/bash" 3 hours ago Up 2 hours container1
Docker为每个属于RED覆盖网络的容器的/ etc / hosts添加了一个条目。
user@node1$ docker exec container1 cat /etc/hosts
10.10.10.2 d82c36bc2659
127.0.0.1 localhost
[ . . ]
10.10.10.3 container2
10.10.10.3 container2.RED
从node2,我试图访问在node1上运行的container1。我尝试使用下面的命令运行container1但它返回错误。
`user@node2$ docker docker exec -i -t container1 bash`
Error response from daemon: no such id: container1
有什么建议吗?
感谢。
答案 0 :(得分:1)
虽然跨多个主机覆盖的容器之间共享网络,但是docker守护程序无法按原样在它们之间进行通信。
user@_node2_$ docker exec -i -t container1 bash
不起作用,因为no such id: container1
确实从 node2 运行。
Docker守护进程通过套接字进行通信。 UNIX套接字默认情况下,但可以添加一个选项--host
来指定守护程序应绑定到的其他套接字。
请参阅docker daemon
手册页:
-H, --host=[unix:///var/run/docker.sock]: tcp://[host:port] to bind or unix://[/path/to/socket] to use.
The socket(s) to bind to in daemon mode specified using one or more
tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
因此,可以从任何节点访问docker守护程序绑定到tcp套接字。
命令user@node2$ docker -H tcp://node1:port exec -i -t container1 bash
可以正常运行。
我不知道你想要部署什么,也许只是在玩教程,这太棒了!您可能有兴趣研究部署docker集群的Swarm。简而言之:您可以使用多个节点,因为它们是通过整个Docker API通过单个节点访问的一个强大的docker守护程序。