被遺忘的Docker Compose | 一種快速建立開發環境的好方法

大家好,用過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_server2docker-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入門培訓(內含PPT)

使用Kubernetes和Istio構建大規模集羣帶來的挑戰和解決方案



原創不易,隨手關注或者”在看“,誠摯感謝!


本文分享自微信公衆號 - 雲原生技術愛好者社區(programmer_java)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章