首页 > 解决方案 > 跨容器运行持久化 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 存储在多个容器运行中持续存在?

标签: dockerconsuldocker-volume

解决方案


在开发模式下运行 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 存储并以与您之前存储的数据相同的卷重新启动容器。


推荐阅读