运行Docker Desktop的Mac OS。我正在尝试获取官方的Consul Docker image来保留其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>
并尝试再次获取它(使用与GET相同的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代理(服务器和客户端模式)不会保持任何状态。从getting started guide
运行不带-server
标志的Consul代理将为您提供一个客户端,就像在代理启动期间在输出中看到的那样:
==> 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存储中并重新启动容器,则应该将以前存储的数据存储在该位置。关于docker - 跨容器运行持久化Dockerized Consul KV Store,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55419824/