Dockerize控制依賴順序應用

Dockerizing 一個應用是轉化一個應用運行在 Docker 容器中的過程。雖然 dockering 大部分應用是簡單的,但是這裏每次都有一些問題圍繞着工作。每次工作的時候有幾個問題都需要待解決。

在 dockerization 時兩個常見的問題是:

當它依賴於配置文件時,使得應用使用環境變量
發送應用日誌到 STDOUT/STDERR,當它默認記錄在 Docker 的文件系統

這篇文章介紹一個新工具:dockerize ,它簡化了這兩個常見的問題。

問題

配置
許多應用使用配置文件來控制它們怎麼工作,不同的運行環境有不同的值。比如,對於一個開發環境的數據庫連接細節將與生產環境的不同。類似的,API keys 和其他的敏感細節在不同環境將不同。

使用 docker 容器有幾個方法可以處理這些環境變量的問題:

在鏡像中嵌入所有的環境變量細節和使用一個控制環境變量變量來指出在運行時使用哪個文件。(比如:APP_CONFIG=/etc/dev.config)
在運行時,使用捲來掛載綁定配置文件的數據
使用封裝腳本,使用工具像 sed 那些環境變量來修改配置數據
嵌入所有的環境變量細節是不理想的,因爲環境變量的改變應該不需要重新構建一個鏡像。它也缺少安全,因爲敏感數據 API keys, login 證書等等,作爲環境變量被存儲在鏡像中。私發一個開發環境可能會泄露生產環境細節。有些類型的細節在任何鏡像中都應該避免的。
使用 volumes 保持這些細節在鏡像外面,但會使得部署更復雜,因爲你不僅部署鏡像。你必須使配置文件的變更和鏡像協調。

注入環境變量到普通文件中也不是重要的。你可能有時會製作一個 sed 命令或寫一些普通的腳本給它,但這是重複性的工作。這確實產生了一個鏡像,但在 Docker 生態系統中工作的很好。

Logging
Docker 容器日誌記錄到 STDOUT 和 STDERR 更容易故障排解,監控和融入一箇中央日誌系統。日誌可以通過 docker logs 命令和 Docker 日誌 API 調用來直接訪問。這也有許多工具可以自動拉取 docker 日誌和運送它們如果日誌記錄進 STDOUT 和 STDERR。

不幸地是,默認,許多應用日誌記錄一個或多個文件到文件系統上。雖然這通常可以圍繞工作,計算出每個應用的日誌配置的細微差別是乏味的。

使用 Dockerize

dockerize 是一個小型的 Golang 應用,可以通過以下簡化 dockerization 過程:

1.在啓動時使用模板生成配置文件和容器環境變量
2.tail 任意的日誌文件到 STDOUT 和 STDERR
3.啓動一個進程,運行在容器裏面

一個示例
在解決服務依賴問題上使用dockerize:
在docker-compose.yaml各個服務的command中的配置如下:

command: ["dockerize", "-wait", "tcp://zookeeper:2181", "-wait", "tcp://mysql:3306", "-wait", "http://apphost:8080", "-timeout", "1800s", "/usr/bin/supervisord"]

選項說明:

-wait <protocol://host:port> 

-wait 參數可以添加多個,代表依賴多個服務

-timeout 1800s

-timeout 後面跟持續等待的秒數,默認是10秒

最後一個命令是各依賴服務準備好之後要執行的命令,也就是當前應用啓動的命令

支持的協議有:file, tcp, tcp4, tcp6, http, https and unix

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