Docker Compose 初探

Han
4 min readFeb 6, 2019

--

前陣子因應公司專案需求,逐步把一些小專案轉換成docker的方式包裝,也就是所謂的dockerize。但因為時間的關係,並未深入使用docker-compose的方式來建置服務,導致運行服務的時候有很多時候需要寫一些shell script來輔助工作。雖然這讓不熟悉shell語法的我查了很多資料,並建構了一些簡單的管理機制,不過還是覺得不是長遠的解決方案。因此,決定是時候學習使用docker-compose來建置服務。所以就想趁這次年假期間,找一個適合的方式來練習使用docker-compose建置服務,順便記錄一下學習的過程。

提醒:本文需要對docker有基本認識才能清楚一些相關指令

前言:

基於練習的主要目的,就選擇從最簡單的單一服務到群集服務開始我這次的練習。由於個人比較熟悉python,因此重點會是用python建置服務,但有部分是為了方便,所以選用nodejs。本次練習的專案內容如下:

  1. 建置單一專案,flask + uwsgi+ nginx。目的:學習怎麼使用docker-compose指令和基本運作方式。
  2. 建置群集,nodejs(4) + nginx(loadbalancing)。目的:學習怎麼使用群集,選用nodejs只是因為剛好有找到適合的教學文章。
  3. 建置群集,flask(2) + uwsgi+ nginx(loadbalancing),並且準備.env來讀取環境變數。目的:整合前面兩項,規劃屬於自己的群集創建方案,其中.env的設定內容參考laradock(一款PHP Laravel的docker解決方案)。

單一專案:

單一專案的建置並不困難,以專案內容而言,最麻煩的只有uwsgi和nginx的溝通,如果要透過socket的方式來溝通的話,就需要使用額外的volumes來共享sock檔案。基本結構大致上如下:

A docker-compose example for flask and nginx.

需要注意就是必須在nginx和flask之間都掛上volumes,以共享sock的存取。

Nginx upstream’s example.

然後需要在nginx的設定檔案中補上需要連線的sock檔案,該檔案同樣需要在uwsgi.ini的檔案中設置。

建置群集Nodejs:

建置群集其實更簡單,因為這項練習主要是參考兩篇文章,分別是:Docker Compose 讓 Nginx 與 Nodejs web server共舞(Load balancing)Scaling Out With Docker and Nginx,會選擇使用nodejs也是因為如此,主要目的是想快速熟悉相關配置並且知道如何運行。

練習這部分的時候,了解depends_on和links的區別,可參考這裡。藉由改寫原文章的內容,迅速且確實的知道如何建置群集和設置nginx loadbalance的相關設定。本章的練習就簡單帶過了,因為沒有特別的地方,原始碼可以去Github上查閱。

建置群集Flask:

最後是根據目前公司主要開發語言python和框架flask,設計一套較為完整的專案配置。

Flask cluster with nginx.

原本建置完成後,就想收工了,但後來覺得應該要加入環境變數的模板載入方式,因此多花了一些時間參考其他專案。最後完成了一個簡易的flask with nginx loadbalancc的專案。不過,還有些地方都是註解,基本上就是留待個人參考使用的一個簡單專案。仍然有以下這些問題待解決:

  1. 模板方式帶入到uwsgi.ini需要另外用環境變數的方式生成。
  2. 目前路徑變數的帶入仍然會有問題,需要另外處理。
  3. Nginx的設定變數需要用一隻shell script生成會比較靈活,注意生成方式和語法,可以上網找資料參考。
  4. 多利用docker-compose config觀看設定結果,可以比對一下實際帶入的資料。

結論:

期間因為不熟悉指令的操作和docker-compose版本指令的一些變動,碰到一些設定上的問題,前面兩項基本上都很容易,因為相關資料很多。最後一項在環境變數設定上還有些不足之處需要補充,不過當前都是可以正常運作的版本。但實際上完成所花費的時間比原本預想的要短很多,應該是因為有不斷的接觸docker,所以之前就已經得知哪些是Dockerfile的問題,哪些是docker-compose的問題,這讓我在這次實作的過程少掉很多除錯時間。因此,個人建議在實作docker-compose之前,應當多熟悉docker的運作和一些操作指令,可以節省一些實作時間。

--

--