跨容器运行持久化Dockerized Consul KV Store

时间:2019-03-29 14:39:53

标签: docker consul docker-volume

此处运行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相同的卷曲),它消失了!我认为我在-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存储跨多个持久存在 容器运行?

1 个答案:

答案 0 :(得分:1)

在开发模式下运行Consul代理(服务器和客户端模式)不会保持任何状态。来自getting started guide

  

此模式对于快速轻松地启动单节点Consul环境很有用。不打算将其用于生产中,因为它不会保持任何状态。

运行没有-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存储中并重新启动容器,则应该将以前存储的数据保存在那里。