docker 返回网关超时的 Traefik 设置

问题描述 投票:0回答:1

我正在使用 Docker 和多个容器/服务设置本地 Debian 服务器。我试图用 Traefik 将子域指向每个容器,但它不起作用,我不知道问题出在哪里。

我已经按照本指南创建了traefik和仅测试容器,但是当我调用

curl foo.myserver.local
时,我遇到网关超时(请参阅下面的源代码)。

# foo/docker-compose.yml
services:
  foo:
    image: httpd:alpine
    container_name: foo
    ports:
      - '9999:80'
    volumes:
      - ./website:/usr/local/apache2/htdocs

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.cal.rule=Host(`foo.myserver.local`)"
      - "traefik.http.routers.cal.entrypoints=web"
      - "traefik.http.services.cal.loadbalancer.server.port=9999"

Foo网站:

# foo/website/index.html
Foo page

Traefik 容器:

# traefik/docker-compose.yml
services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    restart: unless-stopped
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

主机文件:

# /etc/hosts

127.0.0.1       localhost
192.168.3.17   myserver.local      myserver
192.168.3.17   foo.myserver.local  myserver


# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

一些测试:

user@myserver:~$ curl myserver.local
404 page not found

user@myserver:~$ curl foo.myserver.local
Gateway Timeout

user@myserver:~$ curl 192.168.3.17
404 page not found

user@myserver:~$ curl 192.168.3.17:9999
Foo page

user@myserver:~$ curl localhost
404 page not found

user@myserver:~$ curl localhost:9999
Foo page

更新1

我按照@Rockvlv回答并通过合并两个

docker-compose.yml
文件并删除端口号解决了问题:

# traefik/docker-compose.yml
services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
    restart: unless-stopped
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  foo:
    image: httpd:alpine 
    container_name: foo
    volumes:
      - ./website:/usr/local/apache2/htdocs

    labels:
      - "traefik.http.routers.foo.rule=Host(`foo.myserver.local`)"

下一步是学习如何拆分此撰写文件。

更新2

我再一次按照 @Rockvlv 的说明并拆分了 docker-compose 文件。唯一的区别是网络的创建。我已经使用了自动创建的

traefik_default

# traefik/docker-compose.yml
services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
    restart: unless-stopped
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

# foo/docker-compose.yml
services:
  foo:
    image: httpd:alpine
    container_name: foo
    volumes:
      - ./website:/usr/local/apache2/htdocs
    networks:
      - traefik
    labels:
      - "traefik.http.routers.foo.rule=Host(`foo.myserver.local`)"

networks:
  traefik:
    name: traefik_default
    external: true
docker traefik localserver
1个回答
0
投票

在官方文档中可以找到服务配置的示例

version: "3"
services:
  my-container:
    deploy:
      labels:
        - traefik.http.routers.my-container.rule=Host(`example.com`)
        - traefik.http.services.my-container.loadbalancer.server.port=8080

当我们为Traefik设置标签时,我们应该设置一个正确的服务名称。如上面的示例所示,服务称为 my-container,在标签中我们指的是该名称 ...routers.my-container。 ...

更新1

@msampaio 将 docker-compose 分割成更小的块并不难,您需要记住的是,您想要使用 Traefik 公开的容器应该在同一网络中运行。 为此,您需要几个步骤:

  1. 创建 Docker 网络
  2. 在每个 docker-compose 文件中设置网络:块
networks:
  proxy:
    external: true
  1. 确保在 Traefik 命令中设置有关使用哪个网络的信息
--providers.docker.network=proxy
  1. 此外,在服务定义中,您还需要设置网络参数
version: '3.8'
services:
 nginx:
   image: nginx
   networks:
     - proxy

完成此操作后,您将能够拥有所需数量的 docker-compose.yml 文件。

© www.soinside.com 2019 - 2024. All rights reserved.