問題現象
某日運維人員反饋,說伺服器docker-compose操作報錯了,大致情況:
在當前service目錄下有docker-compose。yaml,其中有個nacos-server服務的配置定義。之前能正常透過docker-compose down/up命令正常關閉或啟動服務。
但是突然有天執行
docker-compose down 丟擲錯誤資訊:
Stopping nacos-server 。。。 done
WARNING: Found orphan containers (mysql, mq, redis) for this project。 If you removed or renamed this service in your compose file, you can run this command with the ——remove-orphans flag to clean it up。
Removing nacos-server 。。。 done
Removing network service_default
ERROR: network service_default has active endpoints
問題分析
執行
docker network inspect service_default 檢視網路配置,發現除了nacos-server本身,還多了幾個關聯容器:
按照網上查到的說法,執行命令斷開容器關聯:
docker network disconnect -f service_default mysql
docker network disconnect -f service_default redis
docker network disconnect -f service_default mq
在執行
docker network inspect service_default 確實發現相關關聯容器定義沒有了,然後執行docker-compose down命令正常執行沒有ERROR資訊了。
本以為萬事大吉,可是沒過幾天運維反饋問題又重現了。那就繼續吧:
然後透過docker inspect mysql等命令找到mysql容器相關配置資訊,定位發現mysql/redis等其他幾個貌似和當前nacos-server所在的
docker-compose。yaml沒啥關係的容器,是在另外一個目錄下的service目錄下的
docker-compose。yaml
中定義的。
按照docker-compose的預設規則:取當前
docker-compose。yaml檔案所屬目錄名再追加default標識作為所屬network名字,由於nacos和mysql/redis/mq兩個
docker-compose。yaml所屬目錄都是service,所以預設都關聯到service_default名稱的network例項了。於是兩個
docker-compose。yaml進行down/up等操作就互相干擾,丟擲上述錯誤了。
問題解決
透過上述分析,最簡單粗暴的解決辦法就是:把兩個
docker-compose。yaml所屬名錄改成不同名字,那就互補干擾了,算基本把問題解決了。
當然按理說
docker-compose層面應該會有相關引數來指定network名稱等標識,具體就需要深入去研究一下
docker/
docker-compose的network機制了。
問題分析解決思路分享出來供大家參考,有興趣可以據此進一步研究,如果找到更完美的解決方法歡迎留言反饋,感謝關注!