刚刚部署后发现服务器疯狂报错,一键回滚,开始慢慢 debug。我用的是 kamal,让我生活变得更美好。因此写了这篇文章。
什么样的场景适合?
如果你之前 docker compose 部署就很满意了,那么大概率 kamal 也适合你。kamal 弥补了 docker compose 的一些不足,同时还保持了简单。可参考下面的对照表
| docker compose | kamal | |
|---|---|---|
| 配置文件 | docker-compose.yml | config/deploy.yml |
| Dockerfile | 支持 | 支持 |
| 构建镜像 | 当前机器 | 可以设置远程机器 |
| 源码版本 | 最新文件 | 最后一次 git commit 的文件 |
| 运行环境 | 生产环境服务器 | 本地自动 ssh 连上远程,支持多服务器,类似 ansible |
| 多个进程 | --scale 已被废止 | 很遗憾不支持 |
| 证书自动生成 | 无 | 有 |
| 平滑部署 | 无 | 有 |
| 一台机器部署多个网站 | 得用不同端口 | 可以同一个,因为带 proxy |
| 自动回滚 | 不行 | 可 |
| 部署多台机器 | 需要 docker swarm | 支持 |
Kamal 是 37signals 的开源产品。
官方网站:https://kamal-deploy.org
如果你需要类似 Vercel 的 UI 界面,像 Coolify 和 Dokploy 这样的方案更适合你。
番外篇:如何只用 kamal-proxy
如果你这台服务器上已经部署了 kamal,想要利用它自带的 kamal-proxy 将本机非 kamal 管理的docker 发布出来,应该怎么办?
举例,有一个 http 端口想要以 https 发布出来,或者以子目录的形式发布,比如 /docs 是单独的文档系统。
其实也很简单。首先要确保容器正确添加到 kamal 的 network。以 docker-compose.yml 举例,
services:
app:
networks:
- kamal
networks:
kamal:
external: true
假设这是一个 node app,监听了 3000 端口。你想要把它发布到 www.example.com。
重点
- 上面添加的 networks 是
kamal docker exec kamal-proxy kamal-proxy deploy www --host www.example.com --target app:3000 --tls --health-check-path /health
如果你写错了,可以改下参数继续执行,会 update 现有的设置。
- 查看每个参数的含义
docker exec kamal-proxy kamal-proxy deploy --help - 列出所有服务
docker exec kamal-proxy kamal-proxy list - 如何升级
kamal-proxy
首先在本地升级 kamal:gem install kamal然后在本地运行kamal proxy reboot升级远程服务器上的 kamal-proxy