使用Traefik的Docker组成的网络

时间:2018-10-18 12:34:13

标签: node.js docker docker-compose traefik

我正在尝试使用docker-compose和Traefik部署三项服务:

version: '3.5'

services:

  reverse-proxy:
    image: traefik
    command: --web --docker --logLevel=INFO
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "traefik.frontend.rule=Host:traefik.localhost"
      - "traefik.port=8080"

  db:
    build: ./db
    environment:
      - MONGO_INITDB_DATABASE=example
    volumes:
      - ./volumes/db:/data/db
    restart: always
    labels:
      - "traefik.enable=false"

  api:
    build: ./api
    environment:
      - DATABASE_CLIENT=mongo
      - DATABASE_HOST=db
      - DATABASE_PORT=27017
      - DATABASE_NAME=example
      - HOST=localhost
    expose:
      - "1337"
    depends_on:
      - db
    restart: always
    labels:
      - "traefik.frontend.rule=Host:api.localhost"

  website:
    build: ./app
    labels:
      - "traefik.frontend.rule=Host:web.localhost"

最后一个容器(website)是使用create-react-app的静态网站版本,占用了API(api):

let response = await fetch(`http://api:1337/news`);

问题是该网站无法解析主机http://api:1337(即按容器名称),但是如果我将该行更改为:

let response = await fetch(`http://<container-ip>:1337/news`);

一切正常。我试图建立一个网络,但它也不起作用。有什么帮助吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您只能从其他容器访问具有其名称的容器。 如果您将反应代码更改为:

let response = await fetch('http://localhost:8080/news', {
  headers: 'Host': 'api.localhost'
})

您应该可以访问您的容器