我有几个docker容器和一个特殊情况,其中两个必须互相交谈,所以他们必须通过链接充分了解彼此。 我可以将一个容器链接到另一个容器,但问题是,我无法告诉他们第二个容器可以回复到第一个容器。
我尝试创建并运行第一个容器并停止它,然后我创建了第二个容器并停止了它。接下来,我再次启动第一个容器,链接到第二个,并启动第二个容器链接到第一个容器。 在此之后我的机器发疯了,docker进程占用了所有CPU和内存,并且两个容器都没有访问。当你杀死这个过程时,一个新的过程与之相同。 即使我卸载了docker重新启动机器并再次安装了docker,它也会回到疯狂的状态,甚至没有启动其中一个容器。
有没有人可以解决如何将两个容器相互链接或让它们在两个方向上相互交谈的方法?
答案 0 :(得分:24)
建议的方法是创建一个用户定义的网络,您可以在其中连接多个容器。
可以使用以下命令轻松创建网络:
docker network create -d bridge my-net
创建网络后,您可以启动这样的容器。
第一个容器:
docker run -it --name b1 --network=my-net --rm bash:4.4
第二个容器:
docker run -it --name b2 --network=my-net --rm bash:4.4
bash-4.4# ping b1
PING b2 (172.26.0.3): 56 data bytes
64 bytes from 172.26.0.3: seq=0 ttl=64 time=0.111 ms
64 bytes from 172.26.0.3: seq=1 ttl=64 time=0.336 ms
...
可以在Docker docs about user-defined networks找到更多信息。
不使用链接的另一种可能方法是通过在每个容器上公开一个端口并将容器绑定到主机接口来映射容器。
docker run --net=host -p 127.0.0.1:5555:5555 --name container1 my/dockerimage1
docker run --net=host -p 127.0.0.1:6666:6666 --name container2 my/dockerimage2
这样 container1 可以通过 localhost:6666 访问 container2 , container2 可以访问 container1 < / em> via localhost:5555 。
这是不关联,但有no way to do bidirectional linking。
documentation for docker networking进一步解释了这一点。
答案 1 :(得分:13)
同一网络中的容器相互链接。
您必须为这些容器创建网络。
docker network create --driver bridge isolated_network
运行容器时,必须指定网络。
docker run -it --net=isolated_network --name container1 container1-image bash
docker run -it --net=isolated_network --name container2 container2-image bash
创建容器后,只需使用容器名称
就可以ping同一网络中的其他容器root@container1 ping container2
root@container2 ping container1
答案 2 :(得分:9)
另一种方法是通过将端口绑定到 docker0 接口来连接容器。
默认情况下,所有docker容器都连接到此桥接器(通常具有IP地址172.17.42.1
)。
docker run -p 172.17.42.1:8001:8080 --name container1 [image]
docker run -p 172.17.42.1:8002:8080 --name container2 [image]
容器可以通过172.17.42.1
和特定端口互相访问。
类似@wassgreen提供的解决方案,但其优点是容器无法访问主机接口。
请参阅Advanced networking部分--net=host
:
[...]但它确实让容器进程像任何其他根进程一样打开低编号的端口。它还允许容器访问D-bus等本地网络服务。这可能导致容器中的进程能够执行意外操作,例如重新启动计算机。您应该谨慎使用此选项。
有关通过docker0
界面进行此连接的详细信息,请参阅Unorthodox docker connection without links。
答案 3 :(得分:1)
检查docker docs中的--link选项。您可以使用以下命令链接2个容器:
$ docker run -i -t --name container_web --link container_db image_name
答案 4 :(得分:1)
当两个容器在同一主机上运行时,网桥或主机网络可以正常工作。如果两个容器在不同的主机上运行,它们将无法相互通信。
对于不同主机上的两个容器互相交谈,应使用docker overlay network。
docker --link是一项已弃用的功能,如docker links doc所述。