运维开发网

docker swarm模式下的数据库迁移

运维开发网 https://www.qedev.com 2020-07-09 14:01 出处:网络 作者:运维开发网整理
我有一个由简单的Node应用程序和Mongo db组成的应用程序.我想知道,我如何在docker swarm模式下运行数据库迁移? 在没有swarm模式的情况下,我首先停止旧版本的应用程序,使用新版本的应用程序运行一次性迁移命令,然后最终启动新版本的应用程序来运行迁移: # Setup is roughly the following $docker network create appnet $
我有一个由简单的Node应用程序和Mongo db组成的应用程序.我想知道,我如何在docker swarm模式下运行数据库迁移?

在没有swarm模式的情况下,我首先停止旧版本的应用程序,使用新版本的应用程序运行一次性迁移命令,然后最终启动新版本的应用程序来运行迁移:

# Setup is roughly the following
$docker network create appnet
$docker run -d --name db --net appnet db:1
$docker run -d --name app --net appnet -p 80:80 app:1

# Update process
$docker stop app && docker rm app
$docker run --rm --net appnet app:2 npm run migrate
$docker run -d --name app --net appnet -p 80:80 app:2

现在我正在测试docker swarm模式中的设置,以便我可以轻松扩展应用程序.问题是在群集模式下,无法在群集网络中启动容器,因此我无法访问数据库来运行迁移:

$docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6jtmtihmrcjl        appnet              overlay             swarm

# Trying to replicate the manual migration process in swarm mode
$docker service scale app=0
$docker run --rm --net appnet app:2 npm run migrate
docker: Error response from daemon: swarm-scoped network (appnet) is not compatible with `docker create` or `docker run`. This network can only be used by a docker service.

我也不想在app启动期间运行迁移命令,因为可能会有几个实例启动,这可能会使数据库失灵.自动迁移是可怕的,所以我想不惜一切代价避免它们.

您是否知道如何在docker swarm模式下实现手动迁移步骤?

编辑

我发现了一个允许复制原始工作流程的脏黑客.想法是使用自定义命令创建新服务,并在其任务之一完成时将其删除.这远非令人愉快的使用,更好的替代品非常受欢迎!

$docker service scale app=0
$docker service create --name app-migrator --network appnet app:2 npm run migrate

# Check when the first app-migrator task is finished and check its output
$docker service ps app-migrator
$docker logs <container id from app-migrator>
$docker service rm app-migrator

# Ready to update the app
$docker service update --image app:2 --replicas 2 app
我相信你可以通过使你的覆盖网络,appnet,可连接来解决这个问题.这可以使用以下命令完成:

docker network create --driver overlay --attachable appnet

这应该可以修复swarm-scoped网络错误,并允许您运行迁移

0

精彩评论

暂无评论...
验证码 换一张
取 消