Docker-compose无法解析DNS以更正服务

时间:2017-06-13 17:54:10

标签: docker docker-compose dockerfile

我有两项服务,webhelloworld。以下是我的docker-compose YAML文件:

version: "3"

services:
  helloworld:
    build: ./hello
    volumes:
      - ./hello:/usr/src/app
    ports:
      - 5001:80
  web:
    build: ./web
    volumes:
      - ./web:/usr/share/nginx/html
    ports:
      - 5000:80
    depends_on:
      - helloworld

在网络中的index.html内,我点击了一个按钮,打开http://helloworld。但是,我的按钮最终会转到helloworld.com而不是正确的服务。当我执行localhost:5001localhost:5000时,这两项服务都可以正常运行。我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

Docker用于服务发现的嵌入式DNS用于容器到容器的网络连接。对于来自docker外部的连接(例如,从您的浏览器),您需要发布端口(例如文件中的5000和5001)并连接到该已发布的端口。

要使用容器到容器网络,您需要在Web容器内部进行DNS查找,并且需要从Web到helloworld的连接,而不是从浏览器到容器。

编辑:从您的评论中,您可能会发现反向代理很有帮助。 Traefik和nginx-proxy是两个例子。您可以将这些配置为按主机名或虚拟路径转发到容器,在您的情况下,我认为基于路径的路由将更容易。生成的撰写文件类似于:

version: "3"

services:
  traefik:
    image: traefik
    command: --docker --docker.watch
    volumes:
      - /var/lib/docker.sock:/var/lib/docker.sock
    ports:
      - 8080:80

  helloworld:
    build: ./hello
    volumes:
      - ./hello:/usr/src/app
    labels:
      - traefik.frontend.rule=PathPrefixStrip:/helloworld
      - traefik.port=80

  web:
    build: ./web
    volumes:
      - ./web:/usr/share/nginx/html
    labels:
      - traefik.frontend.rule=PathPrefixStrip:/
      - traefik.port=80

以上所有都是未经测试的,我的头部配置,但应该让你朝着正确的方向。使用PathPrefixStrip规则,您可以在Web中创建一个链接到" / helloworld"哪个将转到另一个容器。由于链接没有主机名或端口,因此它将转到您已使用的相同traefik主机名/端口。