Docker部署Traefik遇网关超时问题排查与解决
Debian服务器Docker+Traefik子域名网关超时问题排查与解决
在本地Debian服务器部署Docker多容器服务,尝试通过Traefik将子域名foo.myserver.local指向对应容器,但调用curl foo.myserver.local时出现网关超时,无法定位问题。
初始配置
foo容器配置(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
本地hosts文件配置
# /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:合并配置文件修复问题
将两个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:拆分配置文件并使用外部网络
为保持配置文件独立性,使用Traefik自动创建的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
内容的提问来源于stack exchange,提问作者msampaio
相关产品推荐
相关产品推荐

