我正在使用 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
我按照@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`)"
下一步是学习如何拆分此撰写文件。
我再一次按照 @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
在官方文档中可以找到服务配置的示例
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 公开的容器应该在同一网络中运行。 为此,您需要几个步骤:
networks:
proxy:
external: true
--providers.docker.network=proxy
version: '3.8'
services:
nginx:
image: nginx
networks:
- proxy
完成此操作后,您将能够拥有所需数量的 docker-compose.yml 文件。