Docker Compose 簡化了多容器應用程式的管理,本文將探討其在實際專案中的應用。首先,我們會探討如何組態環境變數以提升安全性及靈活性,並解析 docker-compose.yml 檔案結構,包含服務定義、映像檔管理和資料持久化等關鍵設定。接著,我們將以 Twitter 資料串流處理為例,示範如何使用 Docker Compose 建置和執行一個包含 Jupyter Notebook 和 MongoDB 的應用程式,其中包含使用 Twitter API 收集推文、利用 spaCy 進行自然語言處理,以及將處理後的資料儲存至 MongoDB 的完整流程。過程中,我們也會探討如何因應 spaCy 模型載入的記憶體需求,調整 AWS 例項型別以解決資源限制問題,並示範如何使用 sklearn 計算檔案向量相似度。最後,我們將說明 Docker Compose 的網路組態機制,以及如何設定 PostgreSQL 的資料持久化,確保資料安全和應用程式可靠性。
Docker Compose 深度解析與應用
Docker Compose 是現代軟體開發中不可或缺的工具之一,特別是在複雜的多容器應用程式開發中。本章將探討 Docker Compose 的核心概念、實務應用以及最佳實踐。
環境組態與安全性考量
在開始使用 Docker Compose 之前,正確的環境組態是至關重要的。特別是在處理敏感資訊如 API 金鑰和驗證憑證時,必須採取適當的安全措施。
環境變陣列態
在 Listing 9-24 中,我們看到如何使用 config/jupyter.env 檔案來組態環境變數。這種做法有幾個重要的優點:
- 安全性提升:敏感資訊不會直接寫入 docker-compose.yml 檔案中
- 靈活性增強:相同的 compose 檔案可以搭配不同的環境組態使用
- 維護性改善:敏感資訊的管理變得更加集中和容易
# config/jupyter.env 示例
CONSUMER_KEY=dummy_consumer_key
CONSUMER_SECRET=dummy_consumer_secrete
ACCESS_TOKEN=dummy_access_token
ACCESS_SECRET=dummy_access_secret
重要注意事項
在組態環境變數時,有幾個關鍵點需要注意:
- 語法嚴格性:變數定義時等號兩邊不能有空格
- 安全性:確保敏感資訊不會被提交到版本控制系統中
- 可移植性:使用環境變數可以提高應用的可移植性
Docker Compose 檔案結構解析
一個典型的 docker-compose.yml 檔案包含了多個服務的定義。以 Listing 9-19 為例,我們可以看到:
- 服務定義:定義了
this_mongo和this_jupyter兩個服務 - 映像檔管理:
this_mongo使用現有的映像檔,而this_jupyter則是透過 Dockerfile 建置 - 資料持久化:透過 volume 的定義實作資料的持久化儲存
程式碼解析
# docker-compose.yml 示例片段
version: '3'
services:
this_mongo:
image: mongo:latest
volumes:
- mongo_data:/data/db
this_jupyter:
build: ./docker/jupyter
ports:
- "8888:8888"
depends_on:
- this_mongo
volumes:
mongo_data:
建置與執行流程
使用 Docker Compose 建置和執行多容器應用程式的流程如下:
- 建置映像檔:執行
docker-compose build命令來建置需要的映像檔 - 啟動應用:執行
docker-compose up -d命令以後台模式啟動所有服務 - 狀態檢查:使用
docker-compose ps命令檢查容器的執行狀態
建置過程詳解
在 Listing 9-26 中,我們看到建置過程的詳細輸出:
- 快取利用:Docker Compose 會盡可能利用快取來加速建置過程
- 依賴處理:正確處理服務之間的依賴關係
- 映像檔標籤:自動為建置好的映像檔加上適當的標籤
實際應用場景:Twitter 資料串流處理
在實際應用中,我們使用 Docker Compose 佈署了一個包含 Jupyter Notebook 和 MongoDB 的資料處理系統。這個系統的主要功能是:
- 串流資料收集:使用 Twitter API 收集特定地區的推文資料
- 自然語言處理:使用 spaCy 對推文內容進行向量化處理
- 資料儲存:將處理後的資料存入 MongoDB 資料函式庫中
程式碼實作
# Twitter 資料串流處理示例
from twitter import TwitterStream, OAuth
from os import environ
# 組態驗證資訊
oauth = OAuth(environ['ACCESS_TOKEN'],
environ['ACCESS_SECRET'],
environ['CONSUMER_KEY'],
environ['CONSUMER_SECRET'])
# 建立 TwitterStream 物件
twitter_stream = TwitterStream(auth=oauth)
los_angeles_bbox = "-118.55, 33.97, -118.44, 34.05"
tweet_iterator = twitter_stream.statuses.filter(locations=los_angeles_bbox)
疑難排解與效能最佳化
在實際操作中,我們可能會遇到各種問題,如記憶體不足(Listing 9-35)。此時可以使用 docker stats 命令來監控容器的資源使用情況。
效能最佳化建議
-
資源合理分配:根據實際需求為容器分配適當的資源限制
-
映像檔最佳化:減少映像檔大小以提升佈署效率
-
服務拆分:將複雜的應用拆分成多個獨立的服務以提高可維護性
-
持續整合/持續佈署(CI/CD):將 Docker Compose 與 CI/CD 管道整合,實作自動化的測試和佈署流程。
-
Kubernetes 整合:學習如何將 Docker Compose 專案遷移到 Kubernetes 平台,以滿足更大規模的生產需求。
-
效能最佳實踐:持續探索和實踐 Docker Compose 在不同場景下的效能最佳化方法。
透過不斷學習和實踐,我們可以充分發揮 Docker Compose 的強大功能,為現代軟體開發帶來更大的價值。
擴充套件AWS應用程式的例項型別
在前面的章節中,我們探討了不同大小的資料集、模型和模型擬合過程的記憶體使用情況。這一探討的目的是檢查AWS t2.micro例項的記憶體限制,這是本文推薦用於練習的系統。當時,這種檢查純粹是理論性的。然而,在這裡,您遇到了實際的系統限制。
面臨系統限制
您希望載入一個透過spaCy函式庫提供的語言模型,但該模型的記憶體需求超出了t2.micro例項的能力。根據spaCy檔案,載入英文模型需要1GB的RAM。由於您的t2.micro例項總共只有1GB的RAM,因此無法在該例項上載入spaCy英文模型。
解決方案:變更AWS例項型別
為瞭解決這個問題,您將透過以下步驟進行:
- 關閉Docker Compose應用程式,但保留資料卷。
- 關閉AWS例項。
- 將AWS例項的例項型別更改為能夠滿足需求的型別,例如t2.medium。
- 重新啟動AWS例項,並記錄新的IP地址。
- 重新啟動Docker Compose應用程式。
- 執行計算。
步驟1:關閉Docker Compose應用程式
首先,您需要關閉Docker Compose應用程式。使用以下命令:
docker-compose down
此命令會停止並移除容器,但由於您沒有指定 --volumes 選項,您的資料卷將被保留,因此MongoDB中的資料不會丟失。
步驟2:關閉AWS例項
接下來,您需要在AWS控制檯中停止正在執行的例項。這是更改例項型別所必需的第一步。
步驟3:更改AWS例項型別
在停止例項後,您可以更改其型別。t2.micro有1GB的RAM,而t2.medium則有4GB的RAM。對於載入1GB的spaCy模型來說,4GB的RAM綽綽有餘。
執行變更
圖表翻譯:變更AWS例項型別的流程
graph LR
A[停止Docker Compose應用程式] --> B[停止AWS例項]
B --> C[更改例項型別為t2.medium]
C --> D[啟動AWS例項]
D --> E[記錄新的IP地址]
E --> F[重新啟動Docker Compose應用程式]
步驟4:重新啟動AWS例項
更改例項型別後,您需要重新啟動AWS例項。啟動後,您將獲得一個新的IP地址。
步驟5:重新啟動Docker Compose應用程式
使用新的IP地址重新連線到您的AWS例項,並導航到應用程式目錄。然後,使用以下命令在分離模式下啟動應用程式:
docker-compose up -d
取得Jupyter Notebook伺服器的安全令牌
為了存取Jupyter Notebook,您需要取得新的安全令牌。使用以下命令:
docker exec ch9jupytermongo_this_jupyter_1 jupyter notebook list
此命令將顯示目前正在執行的Jupyter伺服器及其對應的令牌。
完成計算
在修改了系統的虛擬硬體後,您可以繼續之前的工作。首先,重新連線到Jupyter Notebook,並執行以下步驟:
from os import environ
from twitter import OAuth
oauth = OAuth(environ['ACCESS_TOKEN'],
environ['ACCESS_SECRET'],
environ['CONSUMER_KEY'],
environ['CONSUMER_SECRET'])
from twitter import TwitterStream
los_angeles_bbox = "-118.55, 33.97, -118.44, 34.05"
twitterator = (TwitterStream(auth=oauth)
.statuses
.filter(locations=los_angeles_bbox))
tw = next(twitterator)
print(tw.keys())
import pymongo
mongo_server = pymongo.MongoClient('this_mongo')
print(mongo_server.twitter.tweets.count())
result = (mongo_server
.twitter
.tweets
.insert_one(tw))
print(mongo_server.twitter.tweets.count())
內容解密:
from os import environ: 從os模組匯入environ物件,用於存取環境變數。from twitter import OAuth: 從twitter函式庫匯入OAuth類別,用於進行身份驗證。oauth = OAuth(...): 使用環境變數中的存取令牌和金鑰建立一個OAuth物件,用於驗證Twitter API請求。from twitter import TwitterStream: 從twitter函式庫匯入TwitterStream類別,用於建立與Twitter串流API的連線。los_angeles_bbox = "-118.55, 33.97, -118.44, 34.05": 定義了洛杉磯地區的邊界框座標,用於過濾該地區的推文。twitterator = TwitterStream(auth=oauth).statuses.filter(locations=los_angeles_bbox): 使用OAuth驗證建立Twitter串流連線,並過濾指定地區的推文。tw = next(twitterator): 從串流中取得下一條推文。print(tw.keys()): 輸出推文中包含的鍵值,以瞭解推文資料結構。import pymongo: 匯入pymongo函式庫,用於與MongoDB資料函式庫互動。mongo_server = pymongo.MongoClient('this_mongo'): 建立到名為this_mongo的MongoDB伺服器的連線。print(mongo_server.twitter.tweets.count()): 輸出tweets集合中的檔案數量,以驗證資料是否正確儲存。result = mongo_server.twitter.tweets.insert_one(tw): 將取得的推文插入到tweets集合中。print(mongo_server.twitter.tweets.count()): 再次輸出tweets集合中的檔案數量,以確認推文已成功插入。
透過這些步驟,您成功地擴充套件了您的AWS應用程式,以滿足更高的記憶體需求,並且能夠順利地載入和使用spaCy語言模型進行進一步的計算。
Docker Compose 與檔案向量編碼實務
前言
本章節將探討如何使用Docker Compose來管理多個容器,並實作檔案向量的編碼與比較。我們將結合MongoDB、Jupyter Notebook以及相關的Python函式庫,來展示一個完整的實務範例。
使用Spacy進行檔案向量編碼
載入Spacy模型
首先,我們需要載入Spacy的英文模型來進行文字分析。
import spacy
nlp = spacy.load('en')
擷取Tweet資料並建立檔案向量
接著,我們從MongoDB中擷取Tweet資料,並使用Spacy模型將文字轉換為檔案向量。
cursor = mongo_server.twitter.tweets.find()
stored_tweet = cursor.next()
doc = nlp(stored_tweet['text'])
顯示檔案向量的維度
建立檔案向量後,我們可以檢視其維度。
print(doc.vector.shape)
輸出結果為 (300,),表示檔案向量有300個維度。
將檔案向量更新至MongoDB
最後,我們將序列化的檔案向量更新至MongoDB中對應的Tweet檔案。
mongo_server.twitter.tweets.update_one(
{'_id': stored_tweet['_id']},
{'$set': {'document_vector': doc.vector.tostring()}})
內容解密:
nlp = spacy.load('en'):載入Spacy的英文模型,用於後續的文字分析。doc = nlp(stored_tweet['text']):將Tweet的文字傳入Spacy模型,生成檔案物件。doc.vector.shape:顯示檔案向量的形狀,確認其維度。doc.vector.tostring():將檔案向量序列化,以便儲存在MongoDB中。
切換AWS例項型別
完成資源密集型的任務後,我們可以將AWS例項型別切換回t2.micro以節省成本。這個過程包括停止Docker Compose應用程式、關閉AWS例項、更改例項型別、重新啟動例項以及重新啟動Docker Compose應用程式。
從MongoDB檢索Tweets並進行比較
連線MongoDB並檢索檔案向量
我們在新的Jupyter Notebook中連線到MongoDB,並檢索已儲存的檔案向量。
import pymongo
mongo_server = pymongo.MongoClient('this_mongo')
tweet_vectors = list(mongo_server.twitter.tweets.find(projection=['document_vector']))
tweet_vectors_np = [np.fromstring(tw['document_vector']) for tw in tweet_vectors]
計算兩則Tweets的餘弦相似度
使用檢索到的檔案向量,我們可以計算兩則Tweets之間的餘弦相似度。
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity(tweet_vectors_np[0].reshape(1, -1), tweet_vectors_np[1].reshape(1, -1))
print(similarity)
輸出結果顯示兩則Tweets非常相似。
內容解密:
mongo_server = pymongo.MongoClient('this_mongo'):連線到MongoDB伺服器。tweet_vectors = list(mongo_server.twitter.tweets.find(projection=['document_vector'])):檢索包含檔案向量的Tweet資料。np.fromstring(tw['document_vector']):將儲存的檔案向量反序列化為NumPy陣列。cosine_similarity(tweet_vectors_np[0].reshape(1, -1), tweet_vectors_np[1].reshape(1, -1)):計算兩則Tweets檔案向量之間的餘弦相似度。
Docker Compose網路組態
Docker Compose自動為應用程式設定一個單一網路,服務容器預設加入此網路,並可透過服務名稱互相存取。
範例docker-compose.yml檔案
version: "3"
services:
this_jupyter:
image: jupyter/scipy-notebook
ports:
- "8888:8888"
this_redis:
image: redis:alpine
this_postgres:
image: postgres:alpine
網路組態解析
當執行docker-compose up時,Docker Compose會:
- 建立名為
ch9sample_default的網路。 - 建立容器並將其加入網路,使用服務名稱作為主機名。
這樣,各容器間可以透過服務名稱相互存取,如this_jupyter、this_redis和this_postgres。
內容解密:
version: "3":指定Docker Compose檔案的版本。services::定義應用程式中的服務。image::指定服務使用的Docker映像。ports::對映容器埠到主機埠。
Jupyter與PostgreSQL的持久化組態
在本章的最後一個應用程式中,我們將建立一個包含Jupyter Notebook和PostgreSQL的應用程式,並組態PostgreSQL使用資料卷實作資料持久化。
圖表翻譯:
此圖示展示了Jupyter Notebook與PostgreSQL容器之間的連線關係,以及資料卷的使用。
- Jupyter Notebook容器透過Docker網路與PostgreSQL容器通訊。
- PostgreSQL容器掛載資料卷以實作資料持久化。
這樣的組態確保了資料的安全性和應用的可靠性。透過Docker Compose的管理,我們可以輕鬆地啟動和停止整個應用程式,同時保持各個服務之間的協同工作。