连接两个Docker容器

26

我有两个现有的 Docker 容器 web 和 db。 我想将这两个容器链接起来,以便它们可以相互通信。 如果我使用 --link 命令,那么它将把 web 链接到一个新镜像,而不是链接到 db。

3个回答

45
在 Docker 网络出现之前,使用 --link 是连接容器的唯一方式。这些网络提供了一个更“干净”的解决方案来解决容器间通信的问题,并且同时解决了链接的两个主要限制:
  1. 链接的容器重启会导致链接断开。
  2. 不支持在不同主机上运行的容器之间建立连接。
使用 Docker 网络,您可以使用 --net 选项在指定的网络上启动容器:
docker network create example
docker run -d --net example --name container1 <image>
docker run -d --net example --name container2 <image>

此时,两个容器可以通过地址<container-name>.example相互访问:即container1.examplecontainer2.example


谢谢您的解释。现在我明白了。 - Ragul
1
"--link"现在已经被弃用了!我真的很感激--net的示例。我会尝试一下。 - aman_novice
使用--net参数将容器分配到特定的IP地址。但是,两个容器具有不同的IP地址,就像子网IP地址一样。例如:网络IP地址为180.12.10.0,则容器IP地址分别为180.12.10.1和180.12.10.2? - Ragul
非常好的答案。地址描述是我一直在苦苦挣扎的地方:<container-name>.example:<port>是我需要的,这样就不需要使用docker-compose了。 - undefined

5
仅供那些遇到此问题的人受益。Docker 现在认为 --link 功能是遗留功能,是被弃用的主要候选项。最简单的方法是使用:
depends_on:

为了实现这一点,建议首先创建一个这样的网络:
docker network create <network_name>

然后使用docker-compose生成与彼此绑定的服务。请看下面的示例,其中我将我的spring-boot应用程序绑定到rabbit-mq。您可以从 这里 克隆我的代码库。
version: "3.1"
services:
  rabbitmq-container:
    image: rabbitmq:3.5.3-management
    hostname: rabbitmq-container
    ports:
      - 5673:5673
      - 5672:5672
      - 15672:15672
    networks:
      - resolute

  resolute-container:
    build: .
    ports:
      - 8080:8080
    environment:
      - spring_rabbitmq_host=rabbitmq-container
      - spring_rabbitmq_port=5672
      - spring_rabbitmq_username=guest
      - spring_rabbitmq_password=guest
      - resolute_rabbitmq_publishQueueName=resolute-run-request
      - resolute_rabbitmq_exchange=resolute
    depends_on:
      - rabbitmq-container
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - resolute

networks:
  resolute:
    external:
      name: resolute

看看我如何创建了一个名为 resolute 的网络,并将应用程序绑定到同一个网络。我还为我的 rabbitmq-container 给了一个 hostname。这是因为 Docker 现在会在容器名之前添加前缀,这使得按名称绑定服务变得困难。

在Docker主机上存在的网络数量是否有限制? - PHELMS

-2

link 用于连接容器,使它们能够在通信建立后相互通信,并与您的数据库通信。


我几乎要打消这个答案的念头,虽然我通常不会打消回答。你应该提供更多的示例内容,而且单词“link”既不是cli选项,也不知道在哪里使用该选项... - Nikolai Ehrhardt
当然,谢谢您的指导,我会确保遵循。 - vegiops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接