簡單優化容器服務

蘇洋發表於2019-04-27

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)

本文作者: 蘇洋

建立時間: 2019年04月27日 統計字數: 2001字 閱讀時間: 4分鐘閱讀 本文連結: soulteary.com/2019/04/27/…


簡單優化容器服務

去年的時候,曾經寫過一篇使用 Docker 、Traefik 以及 Nginx 建立自動索引站點的文章,本篇內容將聊聊如何進行優化。

包含內容:剝離容器配置中的變數、如何對容器進行健康檢查、如何限制容器日誌尺寸等。

更新的專案程式碼儲存在: GitHub 上,可以自取。

剝離環境變數

前文的 docker-compose.yml 中,許多內容是直接寫死在檔案中的,隨著配置檔案越來越“複雜”、同類的服務啟動越來越多,我們需要將一些基礎的配置剝離出來,以方便後續的維護。

nginx:
    image: nginx:1.15.7-alpine
    labels:
      - "traefik.frontend.rule=Host:demo.soulteary.com"
    extra_hosts:
      - "demo.soulteary.com:127.0.0.1"
複製程式碼

比如“域名”、“映象名稱”等資訊,我們可以從上面配置檔案中進行剝離,剝離後的配置如下:

nginx:
    image: ${NGX_IMAGE}
    labels:
      - "traefik.frontend.rule=Host:${NGX_DOMAIN}"
    extra_hosts:
      - "${NGX_DOMAIN}:127.0.0.1"
複製程式碼

為了讓 docker-compose.yml 能夠像之前一樣正常工作,我們需要建立一個 。env 檔案,存放剛剛剝離的資訊。

NGX_IMAGE=nginx:1.15.8-alpine
NGX_DOMAIN=demo.soulteary.com
複製程式碼

後續這類資訊多起來之後,可以通過配置系統介面獲取,或者讓CD系統自動生成。

支援 HTML 檔案預覽或直接下載

Nginx 預設配置中,HTML 型別檔案將會被渲染成我們熟悉的網頁,這顯然不符合 auto index 的需求,如果能夠像 TEXT 純文字一樣直接在瀏覽器中進行預覽或許會更好。

修改 Nginx 使用的 mime.types 檔案,將 HTML 型別檔案進行修改,原始檔案如:

text/html                                       html htm shtml;
複製程式碼

需要修改為:

text/plain                                       html htm shtml;
複製程式碼

如果你需要使用者在訪問頁面時,能夠直接下載檔案,那麼可以將 text/plain 修改為 application/octet-stream

容器服務監控檢查

為了容器中的應用執行結果更加可靠,我們需要讓容器進行健康檢查。

因為本例中的內容是動態生成的,雖然程式效率很高,但是還是建議讓檢查工具請求的內容儘可能更簡單一些,為此我們定義一個新的路徑 /health-check ,並將它新增到 nginx.conf 配置中:

location = /health-check {
    access_log  off;
    default_type text/html;
    return      200 'alive';
}
複製程式碼

當健康檢查器或者使用者訪問這個地址時,將會得到“alive”的結果。

接著,在 docker-compose.yml 中定義檢查器:

healthcheck:
  test: ["CMD-SHELL", "wget -q --spider --proxy off localhost/health-check || exit 1"]
複製程式碼

當你執行 docker ps 時,終端輸出的文字將會有一些不同。

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS                            PORTS                                                                              NAMES
d9903d19aae7        nginx:1.15.8-alpine                        "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds (health: starting)   80/tcp
複製程式碼

當程式完全執行之後,Up 4 seconds (health: starting) 將會變更為 Up 10 seconds (healthy)

未來在除錯/檢視容器服務狀況時,辨別服務執行狀態就又有了一個新的依據啦。

約束日誌檔案尺寸

搭建的應用,除了會被使用者訪問之外,還可能遭到掃描器問候、惡意的海量請求。

這時,如果不約束日誌檔案尺寸,很容易將磁碟佔滿,造成其他麻煩。

除了使用 logrotate 處理日誌外,更簡單的方案是在 docker-compose.yml 中對日誌尺寸進行限制,將下面的內容新增到配置檔案中。

logging:
    driver: "json-file"
    options:
        max-size: "10m"
複製程式碼

我現在有一個小小的折騰群,裡面聚集了一些喜歡折騰的小夥伴。

在不發廣告的情況下,我們在裡面會一起聊聊軟體、HomeLab、程式設計上的一些問題,也會在群裡不定期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼新增好友。(請註明來源和目的,否則不會通過稽核)

關於折騰群入群的那些事

相關文章