我在服务器中部署了不同的服务,我使用 Docker Compose 部署这些服务,并用各种办法以降低维护难度、减少维护工作。对于个人网站或者个人服务,尽可能降低运维成本是一件重中之重的事情。这篇文章将为你介绍容器的基础概念,以及我是如何使用这些容器进行高效运维的。
如果你还不知道什么是容器,可以点击这里或者查看Docker 官方文档补课。
选型
#为什么没有使用容器化编排
我认为 Docker Swarm、k8s、k3s 等容器编排在大多个人业务下起不到明显作用,反而会增加维护复杂度。在解析服务的时候还要考虑 LB 的问题,而 LB 在很多 IDC 或者软件项目中会被定义为"企业级",从而需要购买昂贵的"企业版"服务。这里暂不细说,在未来或许有时间我再展开分享下我是如何使用容器化编排实现弹性计算及高可用的。
#Docker 和 Podman
如果你没有了解过 Podman,可以先自行了解。Podman 从设计上可以见得比 Docker 要安全,并且也支持 Podman Compose。从各种因素来看 Podman 对 Docker 已经做了相当多的兼容性设计。
尽管 Podman Compose 力求实现与 Docker Compose 命令和行为的兼容,但在某些细节上可能存在差异。目前我遇到过的大多项目仅针对 Docker 进行测试,我担心使用 Podman 可能会出现未知的 bug,对于个人网站的"减少维护工作"目标不符,所以主体仍选择了 Docker 进行运行,而 Podman 暂仅作测试使用。当我觉得 Podman 适配足够成熟时,或许我会将业务迁移到 Podman。
#服务器环境
#操作系统与分布
如前文所述,我的服务器均为 Linux。由于我建立的服务较多,而且放在一台服务器上会有 all boom 可能,我采用了多台服务器的方式进行部署。由于部分业务具有较强区域属性,所以我在不同地区也部署了不同的服务器。
#网络
多个服务器之间的服务存在互通的需求,我使用 SD-WAN 将其连接,将不同服务器间形成星形组网。目前可以选择的实现方案有许多,例如 蒲公英、NetBird、Tailscale 等,亦可以使用专业的硬件产品。具体实现方式以后再详细展开。
在构建运行稳定的网络后,当服务器间内网能互通时将直接进行互通连接,当服务器内网不互通时将自动使用公网进行连接,确保服务器间通讯走最优路线。
#容器环境
#安装 Docker
Docker 以及 Docker Compose 的安装我写成了脚本可以快速安装,参考 https://lzj.ac.cn/docs/quickbash。
如果你希望自主安装,或安装在其它系统,参考官方文档。
#防火墙
我的服务器运行在 IDC 防火墙后,这个防火墙通常叫做"安全组",所以为了避免二层防火墙导致每次都要去开关两个地方的端口,我会选择关闭服务器侧的防火墙,而使用 IDC 的防火墙。
#运行习惯
每个服务可能需要使用多个容器共同协同来运行,我曾经使用 Portainer 进行维护,但 Portainer 我觉得更适合手机临时处理突发状况下使用,日常维护还是 Docker Compose 好用,它的好处如下:
- 运行方便:Docker Compose 可以将多个容器的配置及运行信息放在一个文件中定义并直接启动,而无需每次启动都手动加参数。
- 可建立容器间内网:针对需要多个容器共同协同的业务,例如雷池、dify,可以在 Docker Compose 中使用 networks 属性为该 Compose 中的容器定义虚拟内网,确保同个服务器内多个容器间还能形成一层新的网络隔离,减少横向访问风险。
为了更方便地使用 Docker Compose,我通常会将compose.yml
放在一个固定的地方。例如/root/container/<服务名>/compose.yml
,而数据与文件映射在同级目录下的/data/*
,环境配置根据需要放在compose.yml
或.env
。具体目录示意如下:
灾备与迁移
如果你根据我上述描述的运行习惯对业务进行部署,就会发现:整个服务包含运行信息、环境配置和数据都被放在了/root/container/<服务名>/*
下了。当业务需要迁移或修改时,可仅对其内容进行打包备份,亦可整个文件夹打包备份。而仅对内容进行日常自动化备份时,对整个目录进行快照备份也是个不错的选择。当业务需要回滚时,仅需将错误的文件夹整个删除后解压之前的备份包到原位即可恢复。
更新
我建议将 compose.yml 中镜像版本的"latest"改为指定版本,这样以便于更新后出现问题能够及时回滚到先前的版本。否则在拉取新的"latest"的时候,旧的"latest"image 将会变为无标签,当需要回滚的时候显得不那么方便。
我推荐遵循以下步骤对内容进行更新:
- 备份,对于支持热备份业务,可先行对整个业务文件夹进行打包。对于不支持热备份业务,请先停止整个业务后再进行打包。
- 配置,配置新的镜像版本号以及环境变量,env 请根据运行的项目自行检查新的配置。
- 拉取镜像并重启服务,我会进入相关业务文件夹后懒惰地执行
docker compose pull && docker compose down && docker compose up
,这样在关闭旧容器前镜像已经拉取好了,尽可能缩短关机时间。我认为这个短暂的重启对于个人业务无伤大雅,但对于企业业务还是尽可能地考虑高可用设计。 - 检查,刚才的
docker compose up
没有使用-d
,这是因为在更新后你需要检查容器后台是否存在报错,业务是否正常。