Docker Swarm с Traefik: контейнеры работают, но получают 404 - PullRequest
0 голосов
/ 26 октября 2019

Я изо всех сил пытаюсь настроить стек роя Docker, используя traefik. Я решил попробовать traefik в качестве альтернативы jwolder / nginx-proxy, поскольку, к сожалению, последний, похоже, не поддерживает режим Swcker в Docker. Но я считаю, что traefik - проблема (возможно, моя ошибка!).

У меня есть контейнер WordPress (реплицированный) и MySQL, а также контейнер traefik. Все контейнеры в рое созданы и запускаются, и docker logs <container_id> не выявляет ошибок, но когда я захожу на «example.org» (не настоящий домен), я просто вижу 404 page not found. Так что это должно быть проблема связи между traefik и контейнерами, которые я хочу прокси. Однако я также не вижу панель инструментов traefik, так что, возможно, происходит что-то еще.

Вот мой файл docker-compose:

version: '3'

services:
  traefik:
    image: traefik:latest
    command: --api.insecure=true \
      --providers.docker=true \
      --providers.docker.exposedbydefault=false \
      --providers.docker.swarmmode=true \
      --providers.docker.watch=true \
      --logLevel=DEBUG
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik
    deploy:
      mode: global
      placement:
        constraints:
          - node.role == manager

  db:
    image: mysql:5.7
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

  app:
    image: my-repo/wordpress:latest
    depends_on:
      - db
    networks:
      - traefik
    environment:
      - VIRTUAL_PORT=80
      - VIRTUAL_HOST=example.org
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      labels:
        - "traefik.enable=true"
        - "traefik.frontend.rule=Host:example.org"

networks:
  traefik:

Настройка orignal nginx-proxy работает хорошо, но, как я говорю, не позволит мне запустить рой. Я экспериментировал с traefik всего один день, так что, возможно, это какая-то ошибка школьника.

Примечание: я псевдоним моего фактического домена .org 127.0.0.1 в моем / etc / hosts. Возможно, это проблема? Я не могу себе представить, что я без проблем запускаю контейнеры Docker с такой настройкой.

1 Ответ

0 голосов
/ 27 октября 2019

ОК, поэтому я заставил его работать в режиме без роя со следующим файлом docker-compose:

версия: '3'

services:
  traefik:
    image: "traefik:v2.0.0-rc3"
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik

  db:
    image: mysql:5.7
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>

  app:
    image: my-repo/wordpress:latest
    depends_on:
      - db
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`example.org`)"
      - "traefik.http.routers.app.entrypoints=web"

networks:
  traefik:

И затем я попробовал следующееКонфигурация роя, которая работала:

version: '3'

services:
  traefik:
    image: "traefik:v2.0.0-rc3"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.swarmmode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.endpoint=unix:///var/run/docker.sock"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik
    deploy:
      mode: global
      placement:
        constraints: [node.role==manager]

  db:
    image: mysql:5.7
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

  app:
    image: my-repo/wordpress:latest
    networks:
      - traefik
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.app.rule=Host(`example.org`)"
        - "traefik.http.routers.app.entrypoints=web"
        - "traefik.http.services.app.loadbalancer.server.port=80"

networks:
  traefik:

Более конкретно, я заставил ее работать только после добавления команды

- "--providers.docker.endpoint=unix:///var/run/docker.sock"

и метки прокси-контейнера

- "traefik.http.services.app.loadbalancer.server.port=80"

... так что я не совсем уверен, что я сделал правильно. Был бы благодарен за любой свет, который мог бы пролиться на это.

Это работает сейчас, хотя, по крайней мере.

ОБНОВЛЕНИЕ : Документы Traefik заявляют, что метка

traefik.http.services.<service_name>.loadbalancer.server.port

является обязательным для режима роя Docker (см. Services на этой странице). Похоже, я просто скучал по этому.

...