0

我有几个域共享一个公共 IP(EC2 实例)。我的设置是这样的:

/home/ubuntu包含docker-compose.yml

version: '3'
services:
  nginx-proxy:
    image: "jwilder/nginx-proxy"
    container_name: nginx-proxy
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
    - "80:80"
    restart: "always"

这将创建一个名为的网络,该网络ubuntu_default将允许其他撰写实例加入。该nginx-proxy图像为这些其他撰写实例创建反向代理,以便您可以访问 example.com 并被路由到相应撰写实例中的相应 UI。

/home/ubuntu/example.com/project-1包含一个docker-compose.yml喜欢:

version: '3'
services:
  db:
    build: "./db"   # mongo
    volumes:
    - "./data:/data/db"
    restart: "always"
  api:
    build: "./api"   # a node backend
    ports:
    - "9005:9005"
    restart: "always"
    depends_on:
      - db
  ui:
    build: "./ui"   # a react front end
    ports:
    - "8005:8005"
    restart: "always"
    environment:
    - VIRTUAL_HOST=project-1.example.com   # this tells nginx-proxy which domain to proxy
    - VIRTUAL_PORT=8005  # this tells nginx-proxy which port to proxy
networks:
  default:
    external:
      name: ubuntu_default

/home/ubuntu/testing.com/project-2包含一个docker-compose.yml喜欢:

version: '3'
services:
  db:
    build: "./db"  # postgres
    volumes:
    - "./data:/var/lib/postgresql/data"
    restart: "always"
  api:
    build: "./api"  # a python backend
    ports:
    - "9000:9000"
    restart: "always"
    depends_on:
      - db
  ui:
    build: "./ui"  # a react front end
    ports:
    - "8000:8000"
    restart: "always"
    environment:
    - VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
    - VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
  default:
    external:
      name: ubuntu_default

所以基本上:

  • project-1.example.com:80 转发到运行在 :8005 上的 UI
  • project-1.example.com:80/api 转发到在 :9005 上运行的 API
  • testing.com 转发到运行在 :8000 上的 UI
  • testing.com/api 转发到在 :9000 上运行的 API

...只要我一次只运行一个,这一切都可以完美运行。当我启动两个 Compose 实例时,/api url 开始发生冲突。我可以坐在其中一个上反复刷新,有时我会看到 example.com/api 的那个,有时我会看到 testing.com/api 的那个。

我不知道此时发生了什么。也许我所反对的前提从根本上是有缺陷的,但它似乎是 Docker/Compose 的预期用途。我愿意接受其他建议来完成同样的事情。

4

1 回答 1

1

Docker 容器使用其网络上的 DNS 查找进行通信。如果多个容器在同一网络上具有相同的别名,它将在每个网络连接的容器之间循环负载平衡。如果您不希望容器相互通信,那么您不希望它们在同一个 docker 网络上。好消息是您可以通过使用多个网络来解决这个问题,而不是将 api 和 db 服务器放在前端代理网络上:

version: '3'
services:
  db:
    build: "./db"  # postgres
    volumes:
    - "./data:/var/lib/postgresql/data"
    restart: "always"
  api:
    build: "./api"  # a python backend
    ports:
    - "9000:9000"
    restart: "always"
    depends_on:
      - db
  ui:
    build: "./ui"  # a react front end
    ports:
    - "8000:8000"
    restart: "always"
    networks:
    - default
    - proxy
    environment:
    - VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
    - VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
  proxy:
    external:
      name: ubuntu_default

如果您不覆盖默认网络,docker 将为您的 compose 项目创建一个,并将其用于未分配给另一个网络的任何容器。

于 2019-01-03T01:53:00.517 回答