Docker Swarm、Traefikを利用したサーバー管理
开始之前
在运营个人项目的过程中,我开始管理多个服务,为此每个月产生的AWS费用逐渐成为了负担。在没有收入的初期阶段,减少固定支出变得至关重要,因此我决定购买了相对便宜的3台迷你服务器,搭建自助托管环境。
过去,我一直在单个服务器上使用Docker Compose来构建服务,但是当服务器数量增多时,Compose方式显然存在明显的局限性。特别是需要根据CPU和内存使用量手动分配容器,从扩展性和管理方面来看也非常低效。
为了解决这个问题,我引入了Docker Swarm。Swarm可以将多台服务器组成一个类似集群的结构,支持灵活的服务部署和扩展。再加上使用Traefik,每个服务都不需要单独设置Nginx配置,HTTPS证书也会自动颁发和更新,大大减轻了运维负担。
对于我这样既要开发又要运营的个人来说,Docker Swarm和Traefik是保持复杂基础架构简洁的好选择。在本文中,我将尝试总结实际配置的过程。
硬件配置
迷你服务器规格介绍
这次搭建的服务器是基于Asrock DeskMini X300裸机构建的3台迷你PC。尽管尺寸小巧,但性能足够强大,非常适合自助托管环境。
每台服务器的主要规格如下:
- 型号:Asrock DeskMini X300
- CPU:Ryzen 5600G
- 内存:64GB
- 硬盘:1TB SSD
- 散热器:[NOCTUA] NH-L9a-AM4(低噪音散热器)
这种配置提供了足够的性能来运行大约10到20个个人服务的容器,并且内存和SSD容量充足,可以轻松运行较重的服务。我购买了3台,考虑到全天候在家中运行的情况,我购买了低噪音散热器进行安装。(之前在公司运行服务器的经验对我很有帮助。那时候有多吵啊..)
由于功耗比普通台式机低,因此非常适合作为全天候运行的家用服务器。
网络设备介绍
目前使用的互联网连接是KT Gigabit Internet,KT的一个特点是为每个LAN端口提供单独的公共IP。我利用这一点,使得3台服务器可以独立从外部访问。
网络设备包括以下TP-Link Omada系列:
-
路由器:TP-Link ER605
-
交换机:TP-Link TL-SG2210P(支持2.5Gbps,PoE)
-
控制器:TP-Link OC200
-
无线AP:TP-Link EAP650(Wi-Fi 6)
这些设备都通过Omada SDN系统进行统一管理,提供VLAN配置、流量监控、端口级别控制等功能。
服务器1
-
直接连接到KT调制解调器以获得公共IP
-
运行Harbor Docker注册表、数据库、文档系统等固定服务
服务器2
- 使用Docker Swarm构建集群
- 将多个个人服务分散运行在容器中
有了这样的配置,我可以在Harbor管理镜像的同时,在其他服务器上实现灵活的服务部署/扩展/管理。
最初,我尝试将3台服务器全部组成集群,以整合所有服务和基础设施。但是,在Docker Swarm环境中稳定运行像Harbor这样复杂的服务存在一些限制,为了更灵活地配置,我最终选择了像现在这样分离角色的方式。
优势
使用Traefik进行简单的流量管理
引入Traefik后,最方便的是流量管理变得简单得多。以前,我需要为每个服务手动编写Nginx配置,并且还需要手动颁发SSL证书。但是Traefik可以自动处理以下功能:
- 通过Let's Encrypt自动颁发和更新HTTPS证书
- 仅通过docker-compose.yml的标签设置,就可以实现域名连接、重定向、端口指定
- 通过提供的仪表板可以直观地监视当前路由状态和服务状态
对于一个独立开发者来说,无需重复设置是一个非常大的优势。
简单的扩展
使用Docker Swarm可以更简单地部署或扩展新服务。只需将新的工作节点注册到集群中,Swarm会根据可用资源自动分配容器。
换句话说,不再需要考虑“这个服务应该在这台服务器上运行”,Swarm会自动部署容器并分配资源。
无中断部署(滚动更新)
通过update_config设置,可以在不中断现有服务的情况下将其替换为新版本。Swarm会先启动新容器,确认正常运行后再关闭旧实例。
services:
my-app:
image: myapp:v1
deploy:
replicas: 1
update_config:
order: start-first
parallelism: 1
delay: 5s
如果有2台以上的服务器,新容器会先部署到其他节点,因此实际服务用户完全不会察觉到部署过程。
服务隔离和回滚功能
每个服务都在独立的容器中运行,因此可以快速修复或回滚出现问题的特定服务。例如,如果更新图像后出现问题,只需一行命令就可以将其恢复到先前状态,实现快速且安全的运营。
docker service rollback my-service
基于Traefik的动态路由
Traefik基于Docker标签自动配置路由。只需在docker-compose.yml中添加几行代码,就可以实现域名、路径、HTTPS应用等自动处理。
与Nginx等手动配置繁琐不同,Traefik在服务添加或更改名称时无需重新配置路由,这是一个巨大的优势。
结语
对于一个独立开发者来说,必须自己负责开发和运营的情况下,我认为最重要的是保持复杂基础架构简单。
这次利用Docker Swarm和Traefik构建服务器时,我意识到,即使不使用复杂的工具或云环境,也可以建立自己能够很好运行的基础架构的自信。
当然,一开始肯定会有试错,特别是由于关于Docker Swarm的实际资料并不丰富,我也遇到了困难,但是通过自己的搭建和测试经验,比任何文档都更有力量。
有人可能会说“为什么要使用Docker Swarm”,但是在从开发到部署、运营的情况下,简洁性、自动化、易维护性是我认为最大的优势和武器。
