创建一个从 consul 派生的数据容器,将命名卷挂载到 /data - 称为 myconfig
创建一个小的 ruby/whatever 脚本“generate_key.rb”,它会在 /data/consul/encrypt.json 中生成一个密钥(如果它还不存在)。它最终看起来像这样。
{ 'encrypt': 'consul keygen 生成的一些密钥' }
要生成密钥,请使用: consul keygen 在容器启动时启动此脚本(ENTRYPOINT 或 CMD)
设置领事服务器
在 Dockerfile 中做
FROM consul
VOLUME /data/consul
# create a placeholder for the optional gossip key
RUN mkdir -p /data/consul && \
echo "{}" > /data/consul/encrypt.json && \
mkdir -p /consul/config &&
ln -s /data/consul/encrypt.json /consul/config/encrypt.json
# you server config
COPY consul-config.json /consul/config/server_config.json
CMD ["agent","-server"]
您的 conusl-config.json 应该与此类似
{
"datacenter": "stable",
"acl_datacenter": "stable",
"data_dir": "/consul/data",
"ui": true,
"dns_config": {
"allow_stale": false
},
"log_level": "INFO",
"node_name": "consul",
"client_addr" : "0.0.0.0",
"server": true,
"bootstrap":
true
}
# For every consul client
Create the same placeholder symlink
RUN mkdir -p /data/consul && \
echo "{}" > /data/consul/encrypt.json && \
mkdir -p /consul/config &&
ln -s /data/consul/encrypt.json /consul/config/encrypt.json
为什么那些符号链接和虚拟文件
这确保了,如果我们现在挂载数据卷,加密密钥将被配置生成的密钥替换 - 如果不是,服务器在没有它的情况下启动。Consul 需要一个合适的 json 文件,不能缺少也不能为空
码头工人撰写示例
version: "2"
services:
someconsuleclient:
image: mymongodb
container_name: someconsuleclient
depends_on:
- consul
volumes_from:
- dwconfig:ro
consul:
container_name: consul
image: myconsulimage
depends_on:
- config
volumes_from:
- config:ro
config:
image: myconfigimage
container_name: config
volumes:
- config:/data/
volumes:
config:
driver: local
所以我们有一个配置服务来生成 encrypt.json,我们有一个 consul 服务器和一个 consul 示例客户端。现在你可以很容易地添加新的领事节点,同时进行八卦加密。
当然,您可以在配置容器的引导程序中为每个客户端 int /data/consul/custom_client.json 添加任意配置,并在所有客户端之间共享这些配置。consul-config 目录中的所有 .json 文件都已合并,这样您就可以轻松构建“添加”