如何使用docker-compose将docker容器相互链接

Mic*_* K. 24 docker docker-compose

我必须使用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
...
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*ard 42

针对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
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

```

请注意,replica1in http://replica1:27018将解析为replica1服务(容器)的IP地址.无需硬编码IP地址; replica1的条目自动添加到replica2容器的/ etc/host中.replica1容器也是如此.Docker将在其/ etc/host文件中为replica2添加一个条目.

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

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

  • 由于Docker 1.9的变化,这是更好的解决方案.因此,这应该是公认的答案恕我直言. (2认同)

Mig*_*yol 14

你应该使用大使模式:

https://docs.docker.com/engine/admin/ambassador_pattern_linking/

基本上,您创建了一个中间组件,将它们连接在一起.您可以看到我们与Spring Cloud的Eureka发现服务一起使用的示例:

ambassador:
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name eureka_1 -name eureka2_1 "

eureka:
  links:
    - "ambassador:eureka2"

eureka2:
  links:
    - "ambassador:eureka"
Run Code Online (Sandbox Code Playgroud)

为简单起见,我只复制了链接

  • 不要使用这种方法> = Docker 1.10看一下桥接网络的答案 (3认同)