所以我需要docker
在我的单节点服务器上进行滚动更新。直到现在,我一直在使用,docker-compose
但不幸的是,我无法用它实现我所需要的。阅读网络,docker-swarm
似乎是要走的路。
我发现了如何使用 swarm 在单个节点上运行具有多个副本的应用程序:
docker service create --replicas 3 --name myapp-staging myapp_app:latest
myapp:latest
从我的docker-compose.yml
:
version: "3.6"
services:
postgres:
env_file:
- ".env"
image: "postgres:11.0-alpine"
volumes:
- "/var/run/postgresql:/var/run/postgresql"
app:
build: "."
working_dir: /app
depends_on:
- "postgres"
env_file:
- ".env"
command: iex -S mix phx.server
volumes:
- ".:/app"
volumes:
postgres: {}
static:
driver_opts:
device: "tmpfs"
type: "tmpfs"
不幸的是,这不起作用,因为它没有从docker-compose.yml
文件中获取配置:.env
文件、command
条目等。
更深入地搜索,我发现使用
docker stack deploy -c docker-compose.yml <name>
docker-compose.yml
将使用我的配置创建服务。
但随后我收到以下错误消息:
未能更新服务 myapp-staging_postgres:来自守护程序的错误响应:rpc 错误:代码 = InvalidArgument desc = ContainerSpec:必须提供图像参考
所以看来我必须使用注册表并将我的图像推送到那里才能正常工作。在多节点架构的情况下,我理解这种需求,但就我而言,我不想这样做。(携带图片很重,我不希望我的图片被公开,毕竟图片就在这儿,为什么要把它搬到网上呢?)
如何设置我docker service
使用的本地图像和写入的配置docker-compose.yml
?
我可能可以使用docker service create
选项来管理我的方式,但这不会使用我的docker-compose.yml
文件,因此它不会是 DRY 也不是可维护的,这对我来说很重要。
docker-compose
对开发人员来说是一个很棒的工具,很遗憾我们不得不深入研究 DevOps 工具来实现滚动更新等常见功能。在这个阶段,对于我的需求来说,整个 swarm 架构似乎太复杂了。