天天看點

Docker Swarm叢集config集中管理配置檔案

在Swarm叢集中管理配置資料(跟secret很像)

傳統配置檔案管理姿勢是 放入鏡像、設定環境變量、或者是volume動态挂載,會降低鏡像的通用性,維護起來也麻煩,17.06版本後的docker支援統一 docker config子指令管理叢集重的配置資訊,無需将配置檔案放入鏡像或者挂載到容器中就可以實作對服務的配置。

PS:config 僅能在Swarm叢集中使用(這個地方和secret不一樣,secret可以在叢集和compose中使用)。

下面以部署redis為例:

我先把本地叢集環境還原下(三個machine構成的幹淨叢集):

Docker Swarm叢集config集中管理配置檔案

然後建立一個配置檔案

Docker Swarm叢集config集中管理配置檔案

然後這樣關聯下

docker config create redis.conf redis.conf

檢視 docker config ls

Docker Swarm叢集config集中管理配置檔案

然後直接建立單服務的叢集

docker service create \

--name redis \

--config redis.conf \

-p 6379:6380 \

redis:latest \

redis-server /redis.conf

Docker Swarm叢集config集中管理配置檔案

成功是成功了,但是有點尴尬,容器跑到别的節點上去了,我現在切到work節點上找到那個容器,然後登陸進去,看下實際情況。

Docker Swarm叢集config集中管理配置檔案

上面的指令說明:

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 Swarm叢集config集中管理配置檔案
Docker Swarm叢集config集中管理配置檔案

執行:

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