之前一直用docker-compose開發了幾個單例的service, 今天開始壓力測試, 結果發現postgres的CPU負載很重, 就想設置cpus 結果發現docker-compose V3之后 只能寫在deploy字段里, 但是docker-compose up 卻不支持 deploy
https://docs.docker.com/compose/compose-file/#deploy
說只能用swarm 模式. 這等於說V3的 docker compose 不能直接設定這個?
現在把swarm啟動搞定了. 大概明白docker的意思了:
編輯同一份docker-compose.yml, 但是compose 和 swarm/stack的分工是這樣的:
docker-compose 用於dev 支持build restart 但是不支持deploy,
swarm/stack 用於 prod 支持 deply的各種設置,包括分配cpu和內存, 但是創建容器只支持從image,不支持build.
假設已經用docker-compose基本開發完畢. 那么准備工作是這樣:
一 docker-compose.yml
swarm模式, 每個serive都必須有image,不能只有build.
最簡單的方法,就是先docker-compose up --build 啟動運行無誤
然后docker image ls 查看創建出的鏡像名字
抄到每個Service下面,
然后,別忘了增加deploy字段, 尤其是mode, 對單例, 設置為global
yml形如:
version: '3.7
services: gateway: #nodejs + socket.io server image: lh2-runtime_gateway build: ./machines/lh2-gateway
...下略
一 配置swarm
在docker-compose.yml的路徑下(就是原來運行docker-compose的路徑)
docker swarm init

具體細節略過了, 簡單說,我們的manager和worker都是這同一台機器的話, 這一句就夠了, 不用join別的了
二. stack
docker stack deploy -c docker-compose.yml stack-demo
使用 docker-compose.yml 創建 stack (也就是一堆service),

這樣服務其實已經創建好了.
但發現其實服務並沒有在線. 檢查一下

replicas 是服務copy的數量, 每個最大1一個,但是當前活動都是0, 全都沒啟動起來
繼續查具體1個service, 用 id

發現不斷報錯, ."Pool overlaps with other one …"
這是和networks有關,根據
https://blog.csdn.net/u010483897/article/details/88017387
要刪除 docker-compose.yml 創建的networks 否則一會服務因為端口相同都rejected
查看一下docker 的網絡
docker network ls

最后一個的scope 是swarm , driver 時 overlay的 是剛剛創建的,需要保留的
那么前面 bridge local 那個,是需要刪除的

刪除之后,再查看剛才那個服務, 已經提示啟動成功, 沒有錯誤了

顯示 數量都是 1/1 因為全是global
此時已經可以使用服務了.
docker stats 可以查看到服務全在運行,和用docker-compse up 時 一樣
總結
基本無坑,比想象的容易. 吃完晚飯2個小時基本從完全不懂到部署成功了. 也不用太去管什么叫swarm ,什么 叫 stack ,先運行起來再說.
感覺還是部署和開發環境 完全分開在不同機器上比較好. 不然, 用 docker-compose build 的時候,還是要重新刪除,創建一遍networks. 但是窮人沒辦法呀. 也將就了.
切換會docker-compose 的時候 找不到networks https://stackoverflow.com/questions/53347951/docker-network-not-found
docker-compose up --force-recreate
然而, 用swarm 部署后的效果,感覺和docker-comppse 並沒有什么區別...
