如何在docker中链接容器?

时间:2017-01-20 16:25:08

标签: docker

这是我输入docker ps时的结果: here is the image when i type docker 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

但它仍然不起作用

当我尝试通过rabbitmq发送消息时,这是我在webapps上的config.php

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

我尝试使用主机名

更改localhost
define('HOST', 'rabbitmq');
define('PORT', 5672);

错误消息被拒绝连接... 看来我的三个容器需要在同一个ip中配置/映射/绑定网络吗?

6 个答案:

答案 0 :(得分:76)

关联是一项传统功能。请使用"用户定义的网络":

sudo docker network create mynetwork

然后使用此网络重新运行您的容器:

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

对于您希望彼此连接的其他容器执行相同的操作。

使用"用户定义的网络",您有一个"内部名称解析"随时为您服务(有点像访问网站时的域名解析)。您可以使用要引用的容器的名称,以便解析容器的IP地址,只要它们在相同的"用户定义的网络上运行"。这样,您可以在同一网络上的其他容器中解析rabbitmq容器的IP地址及其名称。

所有包含在同一"用户定义的网络"将具有网络连接。不需要"遗留链接"。

答案 1 :(得分:14)

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

在存储Docker文件的根目录中,只需创建一个名为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

答案 2 :(得分:4)

您需要将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)

然后在运行webapps容器时将其传入--env。

答案 3 :(得分:2)

根据我的经验,可以使用docker-compose.yml等声明式,但是您可以简单地使用

docker run -d -P  -link  nimmis/apache-php7  rabbitmq redis 

答案 4 :(得分:1)

您可以在docker-compose.yml

中定义服务以使用用户定义的网络
version: "3"

services:

  webapps:
    image: nimmis/apache-php7
    ports:
      - "80:8080"
    networks:
      - my-network

  rabbitmq:
    image: rabbitmq
    networks:
      - my-network

  redis:
    image: redis
    networks:
      - my-network

networks:
  my-network:
    driver: overlay

然后做:

docker swarm init
docker stack deploy -c docker-compose.yml my-stack

https://docs.docker.com/get-started/part3/

上查看完整的示例

答案 5 :(得分:0)

您可以访问 Redis 容器的 IP 地址。

启动 rabbitmq 并获取内部 IP 地址:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' rabbitmq > .rabbitmq.ip 

现在,您可以在启动 webapps 容器时添加 Apache 配置并添加 rabbitmq 的内部 IP 地址。或者简单地在 Apache 容器的 /etc/hosts 中添加一个条目,如:

// the dynamic internal IP of rabbitmq is known once rabbitmq starts:
172.30.20.10 rabbitmq.redis.local