大家好,用過Kubernetes同學大多都是從docker swarm過渡過來的,而用過docker swarm的同學大多都知道docker-compose;docker-compose早已被大多人丟棄在角落裏,它的使用非常簡單,只需要在有docker環境基礎的服務器上把它的二進制文件複製到/usr/local/bin下,把多個容器放在一個編排文件中一鍵執行即可,被人遺忘的原因跟它的簡單一樣,太過於簡單以至於在實際生產中根本無法使用。拋開生產環境不說,主要聊聊我在開發環境中如何使用docker-compose的。
開發環境組件信息
-
nginx proxy -
java1 server -
java2 server -
java3 server -
a Postgres database
其實在一臺開發服務器上運行這些服務沒什麼大不了的,但是對於中小型公司,往往一臺高配置開發服務器經常被多人佔用,服務嗎?少不了對外提供端口,少不了其它人的數據修改;當然這些問題也都是小問題,比如,我服務剛纔還跑的好好的,怎麼忽然不能用了呢?一頓操作猛如虎.....最後發現系統一個底層依賴被卸載了,這些環境問題,看似簡單,其實排查起來非常費勁,因爲錯誤信息大多不在你的認知範圍之內,要不然怎麼一直有運維都是玄學的說法呢?
另外生產環境已經部署了Kubernetes平臺,少不了提供鏡像,所以開發環境 docker-compose。
Docker-compose運行一堆Docker容器
Docker Compose允許你在一個名爲docker-compose.yml的文件中運行一堆可以相互通信的Docker容器。編排文件如下所示:
version: "3.3"
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
java_server1:
image: java1
volumes:
- .:/app/
java_server2:
image: java2
volumes:
- .:/app/
java_server3:
image: java
volumes:
- .:/app/
web:
image: nginx
ports:
- "8777:80"
-
配置已經包含在鏡像裏面,有時我可能因爲需要臨時修改配置,這樣的話,我會通過進入到容器或者把容器內部配置掛載到宿主機上修改。
-
其中服務之間交互的部分我通過服務名稱調用。
-
通過使用docker-compose,網絡配置也變得非常簡單,例如我的nginx部分配置如下所示:
location ~ /java1* {
proxy_pass http://java_server1:8080;
}
location java2 {
proxy_pass http://java_server2:8081;
}
-
公司太小以至於連個horbour都沒有部署,鏡像沒有存放的位置,那你可以考慮使用數據卷掛載本地文件到鏡像內部,而compose本身只是提供了一個編排和啓動、以及枚舉你所有服務的框架。
啓動方式
我一直在通過運行docker-compose build來啓動我的容器,然後運行docker-compose up來運行一切。
當然有時可能只改動了其中一個鏡像,你也可以通過使用docker-compose create java_server2
docker-compose start java_server2
單獨啓動。
yaml文件中可以設置depends_on,以便更好地控制容器何時開始,但是對於我的服務開始順序並不重要,所以我沒有這樣做。
測試環境
對於功能測試環境,部署方式跟開發環境並沒有什麼區別,但是對於測試人員來說,在接入了docker-compose之後變得更爽了;假設我們已經有一套自動化測試腳本,每次上線之前就可以實現在完全獨立的環境下進行覆蓋測試,測試完成之後直接銷燬容器即可。不用考慮數據、環境、配置等影響。特別對於中小型公司,服務不多,發佈頻繁,並且接入了CI/CD持續集成持續部署的企業,建議採用此種方式。
生產環境
目前爲止,我嘗試着用docker-compose在生產環境中使用這個東西。雖然我可以容忍它的啓動速度慢的問題,但是在使用過程仍然會碰到一些問題,比如:多個容器之間啓動的先後順序導致bug,但是你可以採用https://github.com/vishnubob/wait-for-it
腳本,控制一個容器必須在另外一個容器完全啓動之後再啓動;另外沒有調度、保活等功能,改來改去發現還不如使用shell腳本啓動。當然如果你只是部署一個小型網站、一些簡單的無狀態服務,還可以考慮使用docker-compose。對於大量微服務(超過50個以上)還是建議採用Kubernetes。
總結
在此之前,作爲一個開發人員,我在安裝一個postgres或者MySQL數據庫時候,花費很多時間安裝部署,經常出現的問題就是基礎環境中缺少依賴、依賴衝突、端口衝突等系統問題導致的無法安裝,但自從有了docker,只需要從官網上找到鏡像,快速編排啓動即可。所以,如果您有興趣的話,建議您在開發環境中使用docker-compose,它比Kubernetes學習、部署成本低,更比虛擬機速度快且節省資源。
推薦
使用Kubernetes和Istio構建大規模集羣帶來的挑戰和解決方案
原創不易,隨手關注或者”在看“,誠摯感謝!
本文分享自微信公衆號 - 雲原生技術愛好者社區(programmer_java)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。