在Swarm集群中管理配置数据(跟secret很像)
传统配置文件管理姿势是 放入镜像、设置环境变量、或者是volume动态挂载,会降低镜像的通用性,维护起来也麻烦,17.06版本后的docker支持统一 docker config子命令管理集群重的配置信息,无需将配置文件放入镜像或者挂载到容器中就可以实现对服务的配置。
PS:config 仅能在Swarm集群中使用(这个地方和secret不一样,secret可以在集群和compose中使用)。
下面以部署redis为例:
我先把本地集群环境还原下(三个machine构成的干净集群):
然后新建一个配置文件
然后这样关联下
docker config create redis.conf redis.conf
查看 docker config ls
然后直接创建单服务的集群
docker service create \
--name redis \
--config redis.conf \
-p 6379:6380 \
redis:latest \
redis-server /redis.conf
成功是成功了,但是有点尴尬,容器跑到别的节点上去了,我现在切到work节点上找到那个容器,然后登陆进去,看下实际情况。
上面的命令说明:
docker-machine ssh work1 切换到work1的这个节点机器上
如果不显示target指定路径,config的默认路径就是直接挂载到/config.conf上。所以我上面是cd过去了,cat看看对不对,内容没问题 是设置端口 6380,然后我下面又直接redis-cli尝试连接了一下redis-serve结果失败,这个是对的,因为咱们通过配置文件设置了6380,redis的默认端口是6379,上面也提示了,127.0.0.1:6379: Connection refused,下面我有指定了端口6380,连接成功,然后随便测试了下,没问题。
还有几个地方需要注意一下,默认在容器/config.conf的文件属性是只读的,还有虽然可以理解成是挂载了刚刚manager节点上的那个文件,但是修改源文件,这里的文件并不会被修改,同时我刚刚随便update一下端口映射,发现redis这个容器从work1节点上跑到manager节点上了,这到时没啥bug,就是提醒下,update之后容器可能会被切换到别的工作节点上。
还有就是说下怎么替换线上的正在跑的服务的config哈,刚刚自己铜鼓了半天,在本地直接创建一个redis2.conf文件,然后
docker config create redis2.conf redis2.conf
下一步是直接通过service update 功能删除原有的配置(不删除重新设置会提示已经存在,而且没有更新配置文件的功能(感觉应该有,但是我是失败了))
docker service update --config-rm redis.conf vtd27i1de4ex
删除之后再把redis2.conf配置文件换上去,记得换成redis.conf,因为我们之前设置的默认执行入口是直接加载/redis.con这个文件的
docker service update --config-add source=redis2.conf,target=redis.conf vtd27i1de4ex
这样就ok了,然后跳到容器上面,执行以下,测试结果是没问题。端口重新更改了。
如果是docker-compose.yml的话就是这么配置(注意是configs后面多了一个s)
redis.conf文件里 还是指定端口
执行:
docker stack deploy -c docker-compose.yml redis
上面是我自己写的,测试可以通过。
对了最后补充一下,刚刚我测试发现,就是上面我说如果想更改配置文件,需要先创建新的redis2.conf 然后移除容器上的redis.conf配置(不是上去删文件,是update),然后在增加redis2.conf为新的配置文件,名字改成redis.conf,这样有一个坏处就是没有保留原始的redis.conf,其实可以这样,创建redis2.conf之后,不是移除原来的配置,而是直接更改服务启动时的默认参数(记得加引号):这样也能达到效果,并且保留两个配置文件,刚刚我本地测试过了。
docker service update --args 'redis-server /redis2.conf' 13tv9ax07l4n