连接Docker容器

时间:2016-06-03 14:45:49

标签: networking docker

你好有帮助的开发者,

我在连接docker容器时遇到问题。我已经构建了一个subversion docker容器和一个mongo docker容器。

docker run -d -p 3343:3343 -p 4434:4434 -p 18080:18080 --name svn-server mamohr / subversion-edge

docker run -p 27017:27017 --name my-mongo -d mongo

我可以从浏览器中点击http://x.x.x.x:18080/,但无法从my-mongo实例中卷曲。我可以从我的开发机器与每个容器通信,但无法从容器到容器进行通信。

我看到像--net = bridge,host,????这样的东西,但我感到困惑。

请帮助.....

6 个答案:

答案 0 :(得分:1)

SDN hub借用此架构,假设C1是您的SVN容器,C2是您的Mongo容器:

Docker network

两个容器都连接到docker0网桥,并且NAT连接到外部192.168.50.16网络。

要从Mongo容器进行连接,请检查SVN容器的bridge0 IP地址:

# docker inspect <svn-container-name>

        "Networks": {
            "bridge0": {
                "IPAddress": "172.17.0.19",
            }

然后CURL直接到它的bridge0 IP地址:

curl http://172.17.0.19:18080/

答案 1 :(得分:0)

为了让您立即前进,您可以使用--net = host启动主机,然后容器和主机都可以进行通信。 或者你可以使用从mongo到另一个容器之间的链接(--link)。

关于docker网络有很多解释,docker文档将是很好的开始。

阅读https://docs.docker.com/engine/userguide/networking/dockernetworks/

上的文档

答案 2 :(得分:0)

我建议你看看docker compose。我认为这是管理系统的最佳方式,系统由许多容器组成。

以下是官方指南:https://docs.docker.com/compose/

答案 3 :(得分:0)

默认情况下,Docker容器开始附加到名为default的桥接网络。您可以docker network ls查看您可用的网络。您还可以create networks with different attributes etc...

因此,在您的情况下,您的两个容器都在同一个default网络上启动,这意味着它们应该可以很好地相互通信。实际上,如果您只希望SVN服务器能够与Mongo通信(并且不需要从主机连接到mongo),您甚至不需要公开Mongo容器上的端口。与每个容器在同一网络上的容器可以很好地相互通信,而不会暴露端口。公开端口是为了允许主机&gt;集装箱连接。

那么,当您尝试从mongo实例卷曲到SVN实例时,您使用的是什么主机名/端口?您应该使用svn-server,因为它将解析为SVN容器(使用Docker的内置DNS解析)。

答案 4 :(得分:0)

使用user defined network可以通过容器名称直接将容器连接到容器网络。

docker network create mynet
docker run -d --net=mynet --name svn-server mamohr/subversion-edge
docker run -d --net=mynet --name my-mongo mongo

docker exec <svn-id> ping my-mongo
docker exec <mongo-id> ping svn-server

您应始终能够连接到映射端口,即使在当前设置中也是如此。主机运行一个侦听该端口的进程,因此任何主机IP都应该这样做。

$ docker run -d -p 8080:80 --net=mynet --name sleep busybox nc -lp 80 -e echo here!
63115ef88664f1186ea012e41138747725790383c741c12ca8675c3058383e68
$ ss -lntp | grep 8080
LISTEN     0      128                      :::8080                    :::*      users:(("exe",pid=6287,fd=4))
$ docker run busybox nc <any_host_ip> 8080
here!

答案 5 :(得分:0)

请记住,默认情况下,我们的世界无法使用容器。

运行svn-server容器时,您发布了容器的18080端口,并从主机的18080端口映射了它。因此,您可以通过http://your_host_IP:18080来访问它。

通过您的两个docker run命令,svn-server容器和my-mongo容器均位于默认网桥网络上。这两个容器通过docker0连接,因此它们可以通过 localhost 直接相互通信。 但是,如果您尝试从my-mongo容器中访问http://your_host_IP:18080,则意味着您的请求将首先发送到docker0,但是docker0会删除您的请求,因为您正在尝试访问主机,而不是svn-服务器容器。

因此,请从my-mongo容器尝试此 curl http://localhost:18080 curl http://svn-server_IP:18080 来访问svn-server容器。