2017-01-20 89 views
10

here is the image when i type docker ps如何链接Docker中的容器?

在泊坞窗

,我有3个容器,web应用,Redis的和RabbitMQ的,我很困惑如何容器的webapps链接到容器的Redis和RabbitMQ的容器? ,在非docker应用程序中,mywebapps可以将消息发送到rabbitmq并写入/读取reddis。我还是老样子没有任何想法如何联系起来的3容器, 我尝试使用命令这样

docker run --name rabbitmq -p 8080:80 --link webapps:nimmis/apache-php7 -d rabbitmq 

,但它仍然无法正常工作

这里是我的web应用的config.php当我尝试经由RabbitMQ的发送消息

define('HOST', 'localhost'); 
define('PORT', 5672); 

我试图改变localhost通过主机名

define('HOST', 'rabbitmq'); 
define('PORT', 5672); 

错误消息是连接拒绝... 看来,在我的三个容器需要配置/映射/绑定网络在相同的IP?

] 2

回答

19

链接是传统特征。请使用“用户定义的网络”:

sudo docker network create mynetwork 

然后使用这个网络重新运行容器:

sudo docker run --name rabbitmq -p 8080:80 -d --network mynetwork rabbitmq 

做同样要相互连接的其他容器。

使用“用户定义网络”,您可以随时使用“内部名称解析”(有点类似于访问网站时的域名解析)。只要在同一个“用户自定义网络”上运行,您就可以使用要引用的容器名称来解析容器的IP地址。通过此功能,您可以在同一网络上的其他容器中解析其名称的rabbitmq容器的IP地址。

全部在同一“用户定义网络”上的包含器将具有网络连接性。不需要“遗留链接”。

1

对于容器间依赖关系和链接,您需要使用docker-compose,您可以在其中定义容器之间的links

在你的根目录下您存储泊坞文件,只需创建一个名为docker-compose.yml新的文件,在这里你可以定义你的容器作为彼此依靠这样的服务:所以在这里

version: '2' 
services: 
    webapps: 
    build: . 
    links: 
     - "rabbitmq:rabmq" 
     - "redis" 

    rabbitmq: 
    image: rabbitmq 

    redis: 
    image: redis 

定义webapps服务,你看它links另外两个服务rabbitmqredis。这意味着当构建webapps容器时,会创建一个条目hosts以便将域名redis转换为实际容器的IP和端口号。

你必须改变这种容器是如何通过使用service:alias符号,我想怎么定义的rabbitmq到 使用别名rabmq容器内webapps地址名称的选项。

要立即建立和使用docker-compose只需键入启动容器:

docker-compose up -d 

所以连接到另一个容器是使用此别名作为主机的名称一样简单。

由于您在这种情况下使用的是docker-compose,它会自动创建一个码头网络来连接所有容器,因此您不必担心这一点。但要了解更多信息,请查看文档: https://docs.docker.com/compose/networking/#/specifying-custom-networks

1

您需要将rabbitmq和redis链接到您的webapps容器,而不是其他方式。

 

    #run redis container 
    docker run --name some-redis -d redis 

    #run rabbitmq container 
    docker run -d --hostname my-rabbit --name some-rabbit rabbitmq 

    #run webapps container 
    docker run --name webapps -p 8080:80 --link some-redis:redis --link some-rabbit:rabbitmq nimmis/apache-php7 

首先运行Redis的和RabbitMQ的容器。 然后运行带有2个容器链接的webapps容器。

现在,在webapps中配置redis主机 - 这很容易。您可以简单地使用env变量'REDIS_PORT_6379_TCP_ADDR'。因为一旦一个容器被链接,你就会得到它的env变量。和redis输出这个变量。

关于RabbitMQ的主机 - 你可以得到IP后的兔容器增长:

 

    RABBITMQ_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' some-rabbit) 

,然后通过它在--env当您运行的webapps容器。

+0

奥凯thanks..problem解决... IIN文件的配置,我改变从本地主机我的RabbitMQ服务器的本地IP地址,ip地址 看到IP地址... i型 搬运工检查[数据筒] 感谢Nesia Amit,Farhad Farahi和Pit :) –

+0

一个非常不方便的解决方案。它已经过时,并且已被弃用,并且将来可能不会起作用。 @farhadfarahi的桥梁网络解决方案是最好的答案。 –

相关问题