当前位置: 首页 > 面试题库 >

如何使用docker-compose将docker容器彼此链接

长孙永思
2023-03-14
问题内容

我必须使用docker-compose设置一个mongo副本集。对于副本集,容器必须彼此了解。

我试过了 docker-compose.yml

    dbreplicasetpart1:
      image: mongo:2.6.8
      expose:
        - '27018'
      links:
        - replicasetpart2
        - replicasetpart3
      cap_add:
        - NET_ADMIN

    dbreplicasetpart2:
      image: mongo:2.6.8
      links:
        - replicasetpart1
        - replicasetpart3
      expose:
        - '27019'
      cap_add:
        - NET_ADMIN
...

我收到一个循环导入消息。但是,如果删除到dbreplicasetpart1的反向链接,则无法从dbreplicasetpart2
ping到dbreplicasetpart1。解决办法是什么?


问题答案:

为Docker 1.10更新

Docker 1.10允许在compose文件中定义网络。这是更新的代码

version: "2"

services:
  replica1:
    image: mongo:2.6.8
    container_name: replica1
    networks:
      - my-net
    ports:
      - "27018"
    environment:
      REPLICA2_URL: "http://replica2:27019"
  replica2:
    image: mongo:2.6.8
    container_name: replica2
    networks:
      - my-net
    ports:
      - "27019"
    environment:
      REPLICA1_URL: "http://replica1:27018"

networks:
  my-net:
    driver: bridge

Docker 1.9的先前答案

从Docker 1.9开始,解决方案是创建一个自定义网络并将其传递给docker-compose up命令。

  1. 创建一个网络 docker network create --driver bridge my-net

  2. ${NETWORK}在docker-compose.yml文件中将该网络作为环境变量()引用。例如:




    replica1:
      image: mongo:2.6.8
      container_name: replica1
      net: ${NETWORK}
      ports:
        - "27018"
      environment:
        REPLICA2_URL: "http://replica2:27019"

    replica2:
      image: mongo:2.6.8
      container_name: replica2
      net: ${NETWORK}
      ports:
        - "27019"
      environment:
        REPLICA1_URL: "http://replica1:27018"


请注意,replica1in
http://replica1:27018解析为copy11服务(容器)的IP地址。无需对IP地址进行硬编码;复制品1的条目会自动添加到复制品2容器的/
etc / host中。对于replica1容器也是如此。Docker将在其/ etc / host文件中为copy2添加一个条目。

  1. 调用docker-compose,将创建的网络传递给它 NETWORK=my-net docker-compose up -d -f docker-compose.yml

我创建了一个
桥接网络 ,该
网络 仅在一个节点(主机)内工作。对开发人员有好处。如果需要让两个节点互相通信,则需要创建一个
覆盖网络 。虽然相同的原则。您将网络名称传递给docker-compose up命令。



 类似资料:
  • 问题内容: 我正在使用docker-compose构建完整的开发堆栈。 该应用程序需要一个mysql服务器才能工作。 mysql服务器是由docker-compose设置的外部容器: 该应用程序具有自己的docker-compose.yml并引用了mysql容器: 我无法在docker-compose中传递它们,因为它是动态的。 我知道应用程序知道mysql IP地址,因为我设置了某些变量: 但这

  • 我正在docker容器中设置一个应用程序。我希望这个应用程序能够与localstack堆栈容器localstack文档连接。当我运行时,容器会成功启动。我可以运行docker-compose文件中未包含的独立java应用程序,它将成功连接到localstack容器。但与localstack一起启动的应用程序无法连接。我看过docker文档和localstack文档,我想不出如何让这些东西彼此通信。

  • 我正在使用我的Mac上的docker-compose(使用boot2docker)与官方的WordPress Docker图像一起工作。我需要做一次一次性的数据导入。我不知道该怎么做。如何将数据导入数据库容器?

  • 我有一个比postgresql运行更早的服务器,我读到Docker-ComposeV3不再使用HealthChecks来执行。我想知道除了之外,我还有什么其他选项。也就是说,我希望docker-compose重新启动失败后关闭/关闭的容器。我找到了这个线程,它展示了如何用docker-compose重新启动一个容器,如何用docker-compose重新启动一个容器,但这并没有解决我的问题。谢谢!

  • 我有一篇docker文章。yml,我有一个Postgres数据库,Grafana在上面运行以查询数据。 我用命令docker compose up启动这个compose,但是如果我不想丢失任何数据,我必须运行docker compose stop,而不是docker compose down。 我还阅读了,但“提交操作将不包括安装在容器内的卷中包含的任何数据”,所以我想它对我的需求没有用。 存储创

  • 问题内容: 我有几个Docker容器,还有一个特例,其中两个必须互相交谈,因此它们必须通过链接最多彼此了解。我可以将一个容器链接到另一个容器,但是问题是,我不能告诉他们第二个容器可以与第一个容器对话。 我尝试创建并运行第一个容器并将其停止,然后创建了第二个容器并同时将其停止。接下来,我再次启动了第一个容器并链接到第二个容器,并启动了第二个容器并链接到第一个容器。此后,我的机器发疯了,docker进