【问题标题】:Connecting two docker containers [duplicate]连接两个码头集装箱[重复]
【发布时间】:2018-01-10 22:11:57
【问题描述】:

我有两个现有的 docker 容器 web 和 db。我想链接这两个容器,以便它们相互通信。如果我使用 --link 命令意味着它将网络链接到新图像而不是数据库。

【问题讨论】:

    标签: docker docker-compose dockerfile docker-swarm


    【解决方案1】:

    在 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>
    

    此时两个容器可以通过地址&lt;container-name&gt;.example相互访问:即container1.examplecontainer2.example

    【讨论】:

    • 感谢您的解释。现在我明白了。
    • --link 现已弃用!我虽然真的很欣赏 --net 的例子。会试试看。
    • 使用 --net 它将属于特定 IP。但是这两个容器都有不同的 IP,比如子网 IP。 eg:网络IP是180.12.10.0,容器IP分别是180.12.10.1和180.12.10.2?
    【解决方案2】:

    只是为了让偶然发现这个问题的人受益。 --link 功能现在被认为是遗留功能,并且是 docker 弃用的主要候选者。 最简单的方法是使用

    depends_on:
    

    为了做到这一点,建议首先像这样创建一个网络:

    docker network create <network_name>
    

    然后使用 docker-compose 生成相互绑定的服务。请看下面的示例,我将 spring-boot 应用程序绑定到 rabbit-mq。你可以从here克隆我的repo。

    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 主机上可以存在多少个网络有限制吗?
    【解决方案3】:

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

    【讨论】:

    • 我几乎不鼓励这个答案,而我通常从不阻止答案。您应该提供更多示例性的东西,并且链接这个词也不是 cli 选项,我也不知道在哪里使用该选项...
    • 当然,感谢您的指导,我会确保遵循。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2018-01-20
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多