docker - 跨容器运行持久化 Dockerized Consul KV Store
问题描述
Mac OS 在这里运行 Docker Desktop。我正在尝试让官方Consul Docker 映像在运行中保持其 KV 存储。我正在使用以下命令运行该图像:
docker run -p 8500:8500 -v /Users/myuser/tmp/consul:/consul/data -d --name=dev-consul -e CONSUL_BIND_INTERFACE=eth0 consul
输入该命令后,我可以在其中存储 KV 对:
curl --request PUT --data "3" http://127.0.0.1:8500/v1/kv/456
然后我可以获取它以确保它在那里:
curl http://127.0.0.1:8500/v1/kv/456
true
但是一旦我停止容器:
docker stop <containerId>
然后重新启动它:
docker restart <containerId>
并尝试再次获取它(使用与上面相同的 curl 获取),它消失了!我认为-v /Users/myuser/tmp/consul:/consul/data
我在命令中指定的docker run
会提示 Consul 将 KV 存储保存到我机器上的本地目录,不是吗?
不过,它肯定在那里坚持了一些东西:
ls -al ~/tmp/consul/
-rw------- 1 myuser staff 36 Mar 28 20:35 node-id
drwx------ 3 myuser staff 96 Mar 28 20:35 proxy
我需要做什么才能使 KV 存储在多个容器运行中持续存在?
解决方案
在开发模式下运行 Consul 代理(服务器和客户端模式)不会保留任何状态。从入门指南
此模式对于快速轻松地启动单节点 Consul 环境很有用。它不打算用于生产,因为它不保留任何状态。
运行不带标志的 Consul 代理-server
将为您提供一个客户端,正如您在代理启动期间在输出中看到的那样:
==> Starting Consul agent...
==> Consul agent running!
Version: 'v1.4.1'
Node ID: '<uuid>'
Node Name: 'node-name'
Datacenter: 'dc1'
Server: false (Bootstrap: false)
因此,对于单实例服务器,您将需要这样的命令(请注意-bootstrap
选项,这将使 Consul 自动将其选为集群领导者,因此您将拥有可操作的单服务器“集群”)
docker run -p 8500:8500 -v /Users/myuser/tmp/consul:/consul/data -d --name=dev-consul -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -data-dir=/consul/data -bootstrap
现在您应该在~/tmp/consul/
以下文件和目录中看到:
checkpoint-signature node-id proxy raft serf
data-dir
如果您尝试将数据放入 KV 存储并以与您之前存储的数据相同的卷重新启动容器。