Внутренний Docker-контейнер и внешняя проблема с разрешением DNS с помощью Traefik - PullRequest
0 голосов
/ 07 ноября 2018

Docker 18.06.1-ce, traefik 1.7.3, dnsmasq, Mac 10.14

У меня есть настройка docker-compose с Traefik, и мне нужно получить доступ к нескольким службам внутри сети / контейнеров Docker и извне.

В Linux-боксе (с перенаправлением Let'sEncrypt и http на https) все работает с использованием одного и того же FQDN как для внутреннего, так и для внешнего доступа к контейнеру Docker, и мне не нужно использовать имена служб.

Когда я запускаю curl http://belapi.dev.biodati.test из контейнера конвейера, используя docker-compose exec belapi / bin / bash, я получаю следующую ошибку (и не вижу ее в журналах доступа Traefik):

api@407cf7105aee:/app$ curl http://belapi.dev.biodati.test/status
curl: (7) Failed to connect to belapi.dev.biodati.test port 80: Connection refused

Это отлично работает (используя имя_службы):

curl http://belapi:8000/status

Я также могу запустить следующий штраф из оболочки bash на моем Mac за пределами док-контейнеров (и я вижу, что он попадает в журналы доступа Traefik):

curl http://belapi.dev.biodati.test/status

У меня есть настройка dnsmasq для пересылки всех * .test доменов на 127.0.0.1.

Изнутри контейнера трубопровода:

dig belapi.dev.biodati.test

;; QUESTION SECTION:
;belapi.dev.biodati.test.   IN  A

;; ANSWER SECTION:
belapi.dev.biodati.test. 7  IN  A   127.0.0.1

Мой файл docker-compose:

networks:
  biodati:
    external: true

services:

  pipeline:
    container_name: pipeline
    image: biodati/bel_pipeline:dev
    networks:
      biodati:

  traefik:
    image: traefik:1.7
    container_name: traefik
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./conf/traefik.toml:/traefik.toml
      - ./logs:/logs
    networks:
      biodati:
    labels:
      - traefik.enable=true
      - traefik.backend=traefik
      - traefik.frontend.rule=Host:traefik.${BS_HOST_NAME:?err}
      - traefik.port=8080
      - traefik.docker.network=biodati

  # BEL API - core requirement
  belapi:
    container_name: belapi
    image: belbio/bel_api:localdev
    networks:
      biodati:
    labels:
      - traefik.enable=true
      - traefik.backend=belapi
      - traefik.frontend.rule=Host:belapi.${BS_HOST_NAME:?err};
      - traefik.port=8000
      - traefik.docker.network=biodati

1 Ответ

0 голосов
/ 27 ноября 2018

Для получения полной информации о том, как решить эту проблему: https://medium.com/@williamhayes/local-dev-on-docker-fun-with-dns-85ca7d701f0a

В основном - DNSMasq работал отлично, Mac Docker Desktop DNS отображался отлично. Я мог бы запросить мое доменное имя службы (например, service1.test) dig service1.test1 и получить обратно 127.0.0.1, именно то, что я настроил в DNSMasq. Таким образом, мое доменное имя возвращало правильный IP-адрес для моего хоста. За исключением - я получал это внутри своего контейнера - поэтому 127.0.0.1 ссылался на мою контейнерную среду.

Выполнение следующей команды на уровне хоста Mac в терминале:

sudo ifconfig lo0 alias 10.254.254.254

добавил псевдоним для 127.0.0.1, который я мог бы использовать в DNSMasq вместо 127.0.0.1, который по-прежнему сопоставлялся бы с моим локальным хостом, но он также работал бы для маршрутизации из моих док-контейнеров.

Теперь я могу использовать локальные домены на моем Mac для локальной разработки в Docker и получать доступ к моим контейнерам с моего хоста И через запросы между контейнерами.

...