用 docker swarm 替代 docker compose
目前 Solar Network 的服务器整个是部署在一个 docker compose 上的,随着羊的野心越来越大,功能越加越多,所以服务的数量也多了起来(如果你不知道的话 SN 是一个微服务项目,虽然没有做到分布式就是)每次更新都要整个 compose 重启,创造一段 downtime,不是很舒服。
所以这就是 docker swarm 出场的时候了。
What is it?
Docker Swarm 是 docker 内嵌的一个可以管理多个实例上的 docker daemon 来达到编排资源的轻量化解决方案,没有像 k8s 那么复杂,更像是 compose 和 k8s 中间的解决方案。
当然我们没有多台服务器,不过 swarm 提供的相比 compose 更好的容器管理和编排也是可以用用的,可以帮助我们更好的上线新的镜像。
要开始使用 docker swarm,首先我们需要启用它。确保你的 docker 版本够新,然后跑一下 docker swarm init 就好了。
Getting started
由于我们是从 docker compose 迁移过来,所以我们已经有了一个 docker-compose.yml,有他在,很多配置就不需要做了。直接使用就可以了。
instead of running docker compose up -d we do docker stack deploy -c docker-compose.yml <name>
这里的名字随便起,只是个表示作用。因为 swarm 不依赖目录和 docker-compose.yml 文件,所以需要这样个名字。
不出意外的话,你的服务应该会正常工作,就想在 docker compose 上一样。(由于 swarm 不支持 depends_on,所以可能需要调整一些东西,不过我的应用代码会自动重连,所以没有这方面的顾虑)
A step further
服务起来了,但是 swarm 的特色还没有体验到。之前我在更新服务器的时候会跑这么一串命令
# 更新镜像还是用 compose,简单一点
docker compose pull
# 重新部署
docker compose up --force-recreate --build -d
# 清理镜像
docker image prune -f
现在我们需要跑
# 更新镜像还是用 compose,简单一点
docker compose pull
# 或者你想要复杂一点的话,本质上没有区别
for img in $(grep "image:" docker-compose.yml | awk '{print $2}'); do
docker pull "$img"
done
# 重新部署
docker stack deploy -c docker-compose.yml <name> --prune
# 清理镜像
docker image prune -f
回车,之后就可以在家里面抢飞机了。
不同的是,docker swarm 还支持单个服务更新(recreate)
docker service update --force <service name>_<container name>
虽然 compose 也能做到,但是这个 compose 就做不到了。就是你还可以 rollback 一个改动,非常适合我这种在线上测试的人,不用着急地修 Bug,还可以减少 downtime。
docker service rollback <service name>_<container name>
同时 swarm 还对多示例部署做了更多的兼容,例如你可以挂在一个对象存储路径上去,不过这些东西我用不到,就没有深入研究,你可以执行看看还有什么高级玩法。
and that's it! enjoy your new stack!