traefik
与nginx
一样,是一款优秀的反向代理工具,或者叫Edge Router
。至于使用它的原因则基于以下几点
- 无须重启即可更新配置
- 自动的服务发现与负载均衡
- 与
docker
的完美集成,基于container label
的配置- 漂亮的
dashboard
界面metrics
的支持,对prometheus
和k8s
的集成
快速开始
一个使用 Docker 的简单示例
使用 Docker Provider 启动 Traefik
创建一个 docker-compose.yml
文件,你将在其中定义一个使用官方的 Traefik 镜像的反向代理服务:
已复制version: '3'
services:
reverse-proxy:
# 官方的 Traefik 2.0 Docker 镜像
image: traefik:v2.0
# 开启 web UI 并且告诉 Traefik 监听 Docker
command: --api.insecure=true --providers.docker
ports:
# HTTP 端口
- "80:80"
# Web UI 端口(通过 --api.insecure=true 启用)
- "8080:8080"
volumes:
# 这样 Traefik 可以监听 Docker 事件
- /var/run/docker.sock:/var/run/docker.sock
就这样现在就可以启动 Traefik 了!
使用以下命令启动你的反向代理
服务:
docker-compose up -d reverse-proxy
然后可以打开浏览器,访问 http://localhost:8080/api/rawdata 接口来查看 Traefik 的 API 原始数据。
Traefik 检查新服务并创建路由
现在我们已经启动并运行了 Traefik 实例,接下来我们来部署一个新的服务,添加到上面的 docker-compose.yml
文件:
# ...
whoami:
# 一个通过 API 暴露其 IP 地址的容器
image: containous/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
上面我们定义了 whoami
:一个简单的 web 服务,它会输出部署的机器的相关信息(IP 地址、主机等等)。然后我们可以使用以下命令启动 whoami
服务:
docker-compose up -d whoami
启动完成后,然后返回浏览器,查看 http://localhost:8080/api/rawdata 接口的数据,正常就可以看到 Traefik 已自动检测到新容器并更新了相应的配置。
当 Traefik 检测到新服务时,它会创建相应的路由,然后我们可以访问相应的路由(我们这里使用 curl):
curl -H Host:whoami.docker.localhost http://127.0.0.1
然后会输出如下的一些信息:
Hostname: 3cca68434466
IP: 127.0.0.1
IP: 172.21.0.3
#...
更多实例?Traefik 对他们进行负载均衡
我们可以使用以下命令来对 whoami
服务进行扩容:
docker-compose up -d --scale whoami=2
扩容完成后可以查看当前我们的服务运行的容器状况:
docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------
quick-start_reverse-proxy_1 /entrypoint.sh --api.insec ... Up 0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp
quick-start_whoami_1 /whoami Up 80/tcp
quick-start_whoami_2 /whoami Up 80/tcp
同样返回到浏览器中查看 http://localhost:8080/api/rawdata 接口可以看到 Traefik 已经自动检查到了新的容器实例。
最后,我们运行以下命令两次,查看 Traefik 在两个实例之间的负载均衡:
curl -H Host:whoami.docker.localhost http://127.0.0.1
我们可以在输出信息中看到如下交替的信息显示:
Hostname: a656c8ddca6c
IP: 172.27.0.3
#...
Hostname: s458f154e1f1
IP: 172.27.0.4
# ...
不过,最后不要忘记了还可以去查看下 Traefik 的 Web UI,通过访问 http://localhost:8080 即可: