如何在Docker中链接容器?

这里是我inputdocker ps时的图像

在docker,我有3个容器,webapps,redis和rabbitmq,我很困惑如何链接容器webapps容器redis和rabbitmq容器? 在非Docker应用程序中,mywebapps可以发送消息给rabbitmq并写入/读取reddis。 我还没有任何想法如何链接3这些容器,我试图使用这样的命令

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

但还是不行

这里是我的config.php在webapps上,当我尝试通过rabbitmq发送邮件

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

我试图用主机名更改本地主机

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

错误消息是连接拒绝…似乎在我的三个容器需要configuration/映射/绑定networking在相同的IP?

] 2

链接是一个遗留function。 请使用user defined networks

 sudo docker network create mynetwork 

然后使用这个networking重新创build您的容器:

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

对于你想让它们彼此连接的其他容器做同样的事情。

使用user defined networks您可以使用internal name resolution 。 您可以通过名称在同一个user defined network上调用其他容器。 在这种情况下,您可以使用same network上其他容器的名称来调用rabbitmq容器。

请注意,在同一个user defined network上的所有包含器将具有networking连接,并且不需要legacy linking

对于容器间的依赖关系和链接,您需要使用docker-compose来定义容器之间的链接 。

在您存储Docker文件的根目录中,创build一个名为docker-compose.yml的新文件,在这里您可以将容器定义docker-compose.yml服务:

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

所以在这里定义了webapps服务,你看它links了另外两个服务rabbitmqredis 。 这意味着当构buildwebapps容器时,会创build一个到hosts文件的条目,使得域名redis被转换为实际容器的IP和端口号。

您可以select使用service:alias表示法来更改此容器的地址名称,例如,如何将rabbitmq定义为使用容器webapps的别名rabmq

现在使用docker-compose创build和启动你的容器,只需键入:

 docker-compose up -d 

所以连接到另一个容器就像使用这个别名作为主机的名字一样简单。

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

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


     #run redis容器
    docker运行 - 名称some-redis -d redis

     #run rabbitmq容器
     docker run -d --hostname my-rabbit --name some-rabbit rabbitmq

     #run webapps容器
     docker run --name webapps -p 8080:80  - 链接一些redis:redis  - 链接一些兔子:rabbitmq nimmis / apache-php7

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

现在,在webapps中configurationredis主机 – 这很简单。 你可以简单地使用envvariables'REDIS_PORT_6379_TCP_ADDR' 。 因为一旦一个容器被链接,你得到它的envvariables。 和redis输出这个variables。

关于rabbitmq主机 – 你可以在兔子容器启动后得到ip:


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

然后在运行webapps容器时将其传递给–env。