缘起
之前我一直使用Nginx作为反向代理来访问我的私人服务器上的网站。当时Nginx是直接安装在电脑上的,没有容器化,这导致我之后想把这些服务迁移到其他电脑上时还得重新配置Nginx、重新配置SSL证书等。
所以我决定将反向代理服务也容器化,以方便以后的管理和迁移。我在网上看到了许多在Docker中使用Traefik的例子,因此决定从Nginx迁移到Traefik。
前置条件
- 运行Linux系统的电脑 (作为私人服务器)
- 私有域名 (详细操作请查看之前的帖子“个人网站的建立过程(一):购买个人域名并配置动态域名解析”)
- 已安装Docker和docker-compose,了解Docker的基本概念和基本用法。如果你还没有安装Docker和docker-compose,或者没有了解Docker和容器化的基本概念和基本用法,可以参考“容器(1):容器相关知识简介——容器化、docker、docker-compose、Kubernetes / K8s等”,里面有较为详细的介绍。
- 已了解Nginx的基本概念和基本用法。如果你没用过或还不了解Nginx,可以参考“从公网访问个人网站——Nginx反向代理配置”,里面有较为详细的介绍。
Traefik简介
Traefik是一个现代化的反向代理和负载均衡器,它可以自动发现和配置后端服务。Traefik支持Docker、Kubernetes、Consul等多种后端服务,并且可以自动获取SSL证书。Traefik的配置非常灵活,可以通过标签、文件或API等方式进行配置。
安装并配置Traefik
整体架构
Traefik可以使用标签配置,可以使用API配置,也可以使用文件配置。由于我之前在使用Nginx时是用文件配置的,每个服务一个配置文件,我觉得这样非常清晰,也便于管理,因此在使用Traefik时也使用文件来配置。
Traefik容器本身是独立的,跟其他Docker容器一样,使用docker-compose.yml
文件来管理。我们在Docker里新建一个网络traefik-net
,包括Traefik在内的所有容器都使用这个网络,在这个网络内,我们使用Traefik进行反向代理。
这篇文章中,我们将以部署一个Whoami服务为例来介绍Traefik的使用。Whoami是一个简单的HTTP服务器,它会返回请求的IP地址、请求头等信息,非常适合用来测试反向代理。
项目目录结构
traefik
项目
基于上述架构设计,我们在之前存放所有docker项目的目录下新建一个traefik
目录,用于存放Traefik项目的相关文件。目录结构如下:
|
|
其中:
docker-compose.yml
:Traefik的Docker Compose配置文件。.env
:环境变量文件,用于存放Traefik项目使用的环境变量。traefik.yml
:Traefik的主配置文件。acme.json
:用于存储SSL证书的文件。dynamic
:存放动态配置文件的目录,每个服务一个配置文件。
whoami
项目
由于我们以一个简单的Whoami服务为例,所以这里我们除了创建一个Traefik项目,还需要创建一个Whoami项目。Whoami项目就很简单,同样放在之前存放所有docker项目的目录下,里面只含有一个docker-compose.yml
文件。
|
|
Traefik安装配置及测试流程
1. 在Docker中创建traefik-net
网络
首先我们在Docker中创建一个名为traefik-net
(也可以用其他名字,但之后的配置中要与这个名字一致)的公用网络:
|
|
2. 创建上述traefik
项目目录
在之前存放所有docker项目的目录下创建一个traefik
目录,并在该目录下创建上述的文件和子目录。
docker-compose.yml
docker-compose.yml
如下:
|
|
其中指定了使用的网络是之前创建的traefik-net
,并且将Traefik的配置文件traefik.yml
、动态配置文件夹dynamic/
和存储SSL证书的文件acme.json
挂载到容器中。
.env
.env
中存储了CloudFlare的API密钥和电子邮件地址,用于自动获取SSL证书。你需要将以下内容替换为你自己的Cloudflare API密钥和电子邮件地址。理论上只提供密钥应该就够了,但我没试。如果你使用的DNS服务商不是Cloudflare(比如你使用阿里云),则需要将相关的API密钥和电子邮件地址替换为你使用的DNS服务商的API密钥和电子邮件地址,具体可参见Traefik的文档。
|
|
traefik.yml
traefik.yml
是Traefik的主配置文件,内容如下:
|
|
其中我们指定了两个入口点:web
(HTTP)和websecure
(HTTPS),并且指定了动态配置文件的目录为/etc/traefik/dynamic
。我们还启用了Traefik的API仪表盘,并配置了ACME证书解析器为Cloudflare DNS Challenge。如果你使用的是其他DNS服务商,可以将provider: cloudflare
替换为你使用的DNS服务商的名称,并根据其文档配置相应的API密钥和电子邮件地址。
acme.json
acme.json
是用于存储SSL证书的文件。你需要先创建这个文件(空文件即可),并设置其权限为600
,以确保Traefik可以写入证书信息:
|
|
dynamic
目录
在dynamic
目录下,我们可以为每个服务创建一个配置文件。下面是一个非常简单的Whoami服务对应的配置文件,在这篇文章中就以部署一个Whoami服务为例来介绍Traefik的使用。
|
|
3. 创建上述whoami
项目目录
在之前存放所有docker项目的目录下创建一个whoami
目录,并在该目录下创建docker-compose.yml
文件,内容也很简单:
|
|
这个docker-compose.yml
文件定义了一个Whoami服务,使用Traefik官方提供的Whoami镜像,并将其连接到之前创建的traefik-net
网络。
4. 启动Whoami和Traefik服务
如果你之前在这台电脑上部署了Nginx服务,需要首先停止Nginx服务,以免与Traefik的端口冲突:
1
sudo systemctl stop nginx
为了避免电脑重启之后Nginx再次启动,你可以禁用Nginx服务:
1
sudo systemctl disable nginx
进入
whoami
目录,使用以下命令启动Whoami服务:1
docker-compose up -d
进入
traefik
目录,使用以下命令启动Traefik服务:1
docker-compose up -d
检查Traefik和Whoami服务是否正常运行:
1
docker ps
你应该能看到Traefik和Whoami服务的容器正在运行。
5. 测试Traefik反向代理
首先确保你在DNS服务商处已经将你的域名(例如whoami.example.com
)解析到你的服务器IP地址上。
然后,你可以通过访问https://whoami.example.com
来测试Traefik的反向代理功能。你需要将whoami.example.com
替换为你自己的域名,并确保DNS解析已经正确配置。
如果一切正常,你就可以访问whoami服务了,你应该能看到一个包含请求信息的页面,类似于下面的内容:
|
|
如果你无法访问https:////whoami.example.com
,那么意味着上述配置出了问题。你可以讲traefik.yml
注释掉的log.level: "DEBUG"
取消注释,这样Traefik会输出更详细的日志信息,帮助你排查问题。
如果你在访问时遇到SSL证书错误,可能是因为Traefik还没有获取到SSL证书。你可以等待一段时间,Traefik会自动获取SSL证书并配置HTTPS。