【问题标题】:Unable to access Docker container behind Traefik无法访问 Traefik 后面的 Docker 容器
【发布时间】:2020-10-03 18:14:47
【问题描述】:

我正在尝试访问在我的远程服务器上运行的 whoami 容器,但只能得到“未找到 404 页面”错误。尝试访问 traefik 仪表板时得到相同的结果。

我的 docker-compose.yml:

version: "3.7"
services:
  traefik:
    image: traefik:v2.3.0
    container_name: traefik
    restart: unless-stopped
    command: # CLI arguments
      ## Globals
      - "--global.checkNewVersion=false"
      - "--global.sendAnonymousUsage=false"
      ## Entrypoint Settings - https://docs.traefik.io/routing/entrypoints/#configuration ##
      - "--entrypoints.http.address=:80"
      - "--entrypoints.http.http.redirections.entryPoint.to=https"
      - "--entrypoints.http.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.https.address=:443"
      ## API Settings
      - "--api=true"
      - "--api.dashboard=true"
      - "--log=true"
      - "--log.level=DEBUG" # (Default: error) DEBUG, INFO, WARN, ERROR, FATAL, PANIC
      - "--providers.docker=true"
      - "--providers.docker.watch=true"
      - "--providers.docker.exposedByDefault=false"
      ## Certificate Settings (Let's Encrypt) -  https://docs.traefik.io/https/acme/#configuration-examples ##
      - "--certificatesresolvers.mytlschallenge.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory" # TBD - TESTING
    networks:
      - frontend
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    security_opt:
      - "no-new-privileges:true" # https://docs.docker.com/engine/reference/run/#security-configuration
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "$USERDIR/ctmp/acme/acme.json:/acme.json:rw" # cert location - you must touch this file and change permissions to 600
    labels:
      - "traefik.enable=true"
      ## HTTP Routers
      - "traefik.http.routers.traefik-rtr.rule=HostHeader(`traefik.${DOMAIN}`)"
      - "traefik.http.routers.traefik-rtr.entrypoints=https"
      - "traefik.http.routers.traefik-rtr.service=api@internal"

  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    networks:
      - frontend
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=HostHeader(`whoami.${DOMAIN}`)"
      - "traefik.http.routers.whoami.entrypoints=http"

networks:
  frontend:
    external: true

$USERDIR 和 $DOMAIN 在我的 .env 文件中定义。

所有的traefik日志都是infodebug级别,没有出现错误。

【问题讨论】:

  • curl -s 127.0.0.1:8080/api/rawdata | jq . 的输出是什么?看到 traefik whoami 容器了吗?您可能需要一个 JSON 格式化程序“apt install jq”
  • 运行该命令时(通过 SSH 登录到远程服务器),我没有得到任何输出。
  • 好的,这应该是 Traefik 的回应。
  • 为什么我应该在 localhost 上看到一些东西?我希望它从公共 IP 地址路由到内部 docker 网络 IP 地址。
  • 不,这只是你的例子,你当然必须 curl -s https://traefik.your-domain.com/api/rawdata | jq . 你的 Traefik 静态配置中有什么,所以你有一个?

标签: docker docker-compose traefik


【解决方案1】:

我现在没有时间,但这里有一个快速的代码重写,但未经测试。 这只是一种稍微不同的方法。但我认为这会导致相同的目标。

  • 您必须包含您的 ENV 文件
  • traefik.http.routers.api.rule=HostHeader 到 =Host(`...)。这很奇怪,也应该与 HostHeader 一起使用。 Link
  • 有了这个基础,您现在可以对其进行自定义。我使用 HTTP chalange,但使用 TLS chalange 它应该可以工作。
version: "3.7"
services:
  traefik:
    image: traefik:v2.3.0
    container_name: traefik
    restart: unless-stopped
    env_file:
      - .env
    command: # CLI arguments
      ## Globals
      - "--global.checkNewVersion=false"
      - "--global.sendAnonymousUsage=false"
      ## Entrypoint Settings - https://docs.traefik.io/routing/entrypoints/#configuration ##
      - "--entrypoints.http.address=:80"
      - "--entrypoints.https.address=:443"
      ## API Settings
      - "--api=true"
      - "--api.insecure=false"
      - "--api.dashboard=true"
      - "--log.level=DEBUG" # (Default: error) DEBUG, INFO, WARN, ERROR, FATAL, PANIC
      - "--providers.docker=true"
      - "--providers.docker.exposedByDefault=false"
      ## Certificate Settings
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=http"
      - "--certificatesresolvers.myresolver.acme.email=YOUR-EMAIL@your-domain.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    networks:
      - frontend
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    security_opt:
      - "no-new-privileges:true" # https://docs.docker.com/engine/reference/run/#security-configuration
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
    labels:
      - "traefik.enable=true"
      ## HTTP Routers
      - "traefik.http.routers.api.rule=Host(`traefik.${DOMAIN}`)"
      - "traefik.http.routers.api.entrypoints=https"
      - "traefik.http.routers.api.service=api@internal"
      - "traefik.http.routers.api.tls.certresolver=myresolver"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      - "traefik.http.routers.redirect.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.routers.redirect.middlewares=redirect-to-https"

  whoami:
    image: traefik/whoami
    container_name: simple-service
    networks:
      - frontend
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.${DOMAIN}`)"
      - "traefik.http.routers.whoami.entrypoints=https"
      - "traefik.http.routers.whoami.tls.certresolver=myresolver"

networks:
  frontend:
    external: true

【讨论】:

  • 谢谢,但这给了我相同的结果(404 页),除了容器日志中有一些新错误:level=warning msg="Could not find network named 'http' for container '/traefik'!level=error msg="Unable to obtain ACME certificate for domains \"traefik-dc\": unable to generate a certificate for the domains [traefik-dc]: acme: error: 400 :: POST :: https://acme-v02.api.letsencrypt.org/acme/new-order...
  • docker create network http 创建网络。您的域的 A 记录是否真的放在主机 IP 上? 80 端口是否对 www 开放?
  • 添加 http 网络可以解决警告,但总体结果相同。当容器运行时,DNS 看起来很好,如 404 所示(并且在不运行时无法连接),但是当我使用 IP 地址时,我也得到了相同的结果。 nmap 显示端口 80 已打开。
  • 对不起,我的错。现在它应该可以工作了。您的错误消息是因为您的路由器规则称为 HostHeader。但必须调用=Host()。我已经编辑了我的答案。
  • 有趣的是,我的配置现在可以使用:api.insecure=false、HostHeader(而不是 Host)和暂存 LE 证书。关键的变化似乎是添加了"traefik.http.routers.api.tls.certresolver=myresolver" 标签。感谢您的帮助!
猜你喜欢
  • 2016-03-18
  • 2018-08-09
  • 1970-01-01
  • 2020-12-16
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多