繁体   English   中英

如何在docker中链接容器?

[英]How to link containers in docker?

这是我输入docker ps时的结果:这是我输入 docker ps 时的图像

我有 3 个 docker 容器:webapps、redis 和 rabbitmq。 我想将容器 webapps 链接到容器 redis 和 rabbitmq 容器。 在非 docker 应用程序中,mywebapps 可以向 rabbitmq 发送消息并写入/读取 redis。

我尝试使用这样的命令

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

但它不起作用。

这是我在 webapps 上的 config.php,我试图通过rabbitmq 发送消息:

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

我试图用主机名更改 localhost

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

错误消息说connection refused

看来我的三个容器需要配置在同一个网络命名空间中。

链接是一个遗留功能 请使用“用户定义的网络”:

sudo docker network create mynetwork

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

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

对要相互连接的其他容器执行相同操作。

使用“用户定义的网络”,您可以使用“内部名称解析”(有点像访问网站时的域名解析)。 您可以使用要引用的容器名称来解析容器的 IP 地址,只要它们运行在同一个“用户定义的网络”上即可。 有了这个,您可以在同一网络上的其他容器中使用其名称解析rabbitmq容器的 IP 地址。

同一“用户定义网络”上的所有容器都将具有网络连接性。 不需要“传统链接”。

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

在您存储 Docker 文件的根目录中,只需创建一个名为docker-compose.yml的新文件,在这里您可以将容器定义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以在容器webapps使用别名rabmq一样。

现在使用docker-compose构建并启动您的容器,只需键入:

docker-compose up -d

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

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

您需要将 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 主机 - 很容易。 您可以简单地使用环境变量'REDIS_PORT_6379_TCP_ADDR' 因为一旦容器被链接,你就会得到它的 env 变量。 和 redis 导出该变量。

关于 rabbitmq 主机 - 您可以在 rabbit 容器启动后通过以下方式获取 ip:

RABBITMQ_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' some-rabbit)
然后在运行 webapps 容器时将它传递给 --env 。

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

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

您可以在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/查看完整示例

您可以访问 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM