在資料科學領域,有效管理資料儲存至關重要。Docker 提供了輕量級、可移植的容器化方案,能簡化資料函式庫的佈署和管理流程。本文將介紹如何使用 Docker 佈署 Redis、MongoDB 和 PostgreSQL,並在 Jupyter Notebook 中與這些資料函式庫進行互動。同時,我們也會探討 Docker Compose 如何在多容器應用程式佈署中發揮作用,提升開發效率。透過實際案例,示範如何結合 Jupyter Notebook 和 Redis,構建一個完整的工作流程。
Docker 與資料科學中的資料儲存與管理
前言
本章節主要探討在資料科學領域中,如何利用 Docker 技術來進行資料儲存與管理。我們將介紹三種主要的資料儲存系統:Redis、MongoDB 和 PostgreSQL,並討論如何使用 Docker 來佈署和管理這些系統。同時,我們也將探討如何在 Jupyter Notebook 中與這些資料儲存系統進行互動。
使用 Docker 佈署資料儲存系統
Redis
Redis 是一種高效能的鍵值對資料函式庫,常用於快取和即時資料處理。使用 Docker 佈署 Redis 非常簡單,只需要執行以下指令:
docker run -d --name my-redis -p 6379:6379 redis
MongoDB
MongoDB 是一種檔案導向的 NoSQL 資料函式庫,常用於處理大量非結構化資料。使用 Docker 佈署 MongoDB 可以執行以下指令:
docker run -d --name my-mongo -p 27017:27017 mongo
PostgreSQL
PostgreSQL 是一種功能強大的開源關係型資料函式庫,常用於處理結構化資料。使用 Docker 佈署 PostgreSQL 可以執行以下指令:
docker run -d --name my-postgres -p 5432:5432 postgres
在 Jupyter Notebook 中與資料儲存系統互動
連線 PostgreSQL 資料函式庫
要連線 PostgreSQL 資料函式庫,需要使用 psycopg2 函式庫。首先,需要安裝 psycopg2:
!pip install psycopg2-binary
然後,可以使用以下程式碼連線資料函式庫:
import psycopg2 as pg2
import psycopg2.extras as pgex
con = pg2.connect(host='localhost', user='postgres', database='postgres')
cur = con.cursor(cursor_factory=pgex.RealDictCursor)
執行 SQL 查詢
連線資料函式庫後,可以執行 SQL 查詢:
cur.execute("SELECT * FROM test;")
results = cur.fetchall()
print(results)
將資料載入 PostgreSQL 資料函式庫
要將資料載入 PostgreSQL 資料函式庫,可以使用 INSERT INTO 語法:
cur.execute("""
BEGIN;
INSERT INTO from_jupyter_test VALUES (1, 'spam', '{1,2,3,4,5}');
INSERT INTO from_jupyter_test VALUES (2, 'eggs', '{1,4,9,16,25}');
COMMIT;
""")
使用 numpy 與 PostgreSQL 二進位型別互動
PostgreSQL 的 BYTEA 型別可以用來儲存二進位資料,例如 numpy 陣列。要將 numpy 陣列儲存到 PostgreSQL 資料函式庫中,需要先將其轉換為二進位格式:
import numpy as np
ary = np.array([1, 2, 3, 4, 5])
bin_ary = pg2.Binary(ary)
cur.execute("""
BEGIN;
UPDATE from_jupyter_test SET vector = %s WHERE _id = 1;
COMMIT;
""", (bin_ary,))
然後,可以使用 np.frombuffer 函式將二進位資料轉換回 numpy 陣列:
cur.execute("SELECT vector FROM from_jupyter_test WHERE _id = 1;")
result = cur.fetchone()
ary = np.frombuffer(result['vector'])
print(ary)
Docker Compose 與多容器應用程式
Docker Compose 是一個用於定義和執行多容器 Docker 應用程式的工具。使用 Docker Compose,可以輕鬆地定義和執行多個容器,並管理它們之間的依賴關係。
安裝 Docker Compose
要安裝 Docker Compose,可以執行以下指令:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
使用 Docker Compose 定義多容器應用程式
要使用 Docker Compose 定義多容器應用程式,需要建立一個 docker-compose.yml 檔案。例如:
version: '3'
services:
postgres:
image: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- ./data:/var/lib/postgresql/data
jupyter:
build: .
ports:
- "8888:8888"
depends_on:
- postgres
environment:
- JUPYTER_TOKEN=secret-token
這個 docker-compose.yml 檔案定義了兩個服務:postgres 和 jupyter。postgres 服務使用官方的 Postgres 映象,並將容器的 5432 連線埠對映到主機的 5432 連線埠。jupyter 服務使用當前目錄中的 Dockerfile 建立映象,並將容器的 8888 連線埠對映到主機的 8888 連線埠。
使用 Docker Compose 執行多容器應用程式
要使用 Docker Compose 執行多容器應用程式,可以執行以下指令:
docker-compose up -d
這個指令會在背景執行 docker-compose.yml 檔案中定義的所有服務。
Docker Compose 深度解析與實務應用
Docker Compose 是管理多容器 Docker 應用程式的強大工具,透過單一 docker-compose.yml 檔案定義應用程式的服務、網路和磁碟區組態,簡化了複雜應用程式的佈署和管理流程。本章將探討 Docker Compose 的安裝、基本用法、以及如何建立一個簡單的 Jupyter Notebook 與 Redis 伺服器組合應用。
安裝 Docker Compose
在 Linux 系統上安裝 Docker Compose 需要手動下載並組態可執行檔。以下是安裝步驟:
步驟1:下載 Docker Compose 二進位制檔案
$ sudo curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` > docker-compose
步驟2:將二進位制檔案移動到適當的位置
$ sudo mv docker-compose /usr/local/bin/docker-compose
步驟3:賦予執行許可權
$ sudo chmod +x /usr/local/bin/docker-compose
步驟4:驗證安裝
$ docker-compose --version
docker-compose version 1.12.0, build b31ff33
內容解密:
- 使用
curl命令從 GitHub 下載特定版本的 Docker Compose 二進位制檔案。 - 將下載的檔案移動到
/usr/local/bin/目錄下,使其成為系統可執行檔。 - 使用
chmod命令賦予該檔案執行許可權。 - 透過檢查版本確認安裝成功。
Docker Compose 版本與基本概念
目前 Docker Compose 檔案語法已更新至第三版。雖然建議使用最新版本,但舊版本仍然相容。docker-compose.yml 檔案的第一行需指定使用的版本。
範例:指定版本3的 docker-compose.yml 檔案
version: '3'
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
driver: mydriver
內容解密:
version: '3'指定了 Docker Compose 檔案的版本。services定義了組成應用程式的各個服務。volumes定義了持久化資料的磁碟區。
建立簡單的 Docker Compose 應用程式
本文將建立一個包含 Jupyter Notebook Server 和 Redis Server 的簡單應用程式。
步驟1:建立專案目錄
$ mkdir ch_9_jupyter_redis
$ cd ch_9_jupyter_redis
步驟2:建立 docker-compose.yml 檔案
version: '3'
services:
this_jupyter:
image: jupyter/scipy-notebook
ports:
- "8888:8888"
volumes:
- .:/home/jovyan
this_redis:
image: redis:alpine
內容解密:
- 定義了兩個服務:
this_jupyter和this_redis。 this_jupyter使用jupyter/scipy-notebook映象,將主機的8888埠對映到容器的8888埠,並掛載當前目錄到容器的/home/jovyan目錄。this_redis使用redis:alpine映象,提供 Redis 服務。
啟動與管理應用程式
使用 docker-compose up 命令啟動應用程式:
$ docker-compose up -d
Creating network "ch9jupyterredis_default" with the default driver
Creating ch9jupyterredis_this_redis_1
Creating ch9jupyterredis_this_jupyter_1
內容解密:
-d引數使應用程式在背景執行。- Docker Compose 自動建立網路供容器間通訊。
- 建立並啟動定義在
docker-compose.yml中的容器。
檢視容器狀態
使用 docker-compose ps 檢視當前專案的容器狀態:
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------
ch9jupyterredis_this_jupyter_1 tini -- start-notebook.sh Up 0.0.0.0:8888->8888/tcp
ch9jupyterredis_this_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
內容解密:
- 列出當前
docker-compose.yml所定義的容器狀態。 - 顯示容器的名稱、執行的命令、狀態和埠對映資訊。
連線到 Jupyter 容器並檢查環境變數
使用 docker exec 連線到 Jupyter 容器並檢查環境變數:
$ docker exec -it ch9jupyterredis_this_jupyter_1 bash
jovyan@container_id:~$ env | grep redis
內容解密:
- 使用
docker exec命令進入正在執行的 Jupyter 容器。 - 使用
env命令列出環境變數,並透過grep篩選出包含 “redis” 的變數,以驗證容器間的連線是否成功建立。
隨著容器化技術的發展,Docker Compose 將繼續演進,提供更多功能以支援更複雜的應用場景。未來可能的發展方向包括增強對 Kubernetes 的支援、改進多主機佈署的管理,以及進一步簡化組態檔案的語法等。
Docker Compose 工作流程圖示
graph LR;
A[建立docker-compose.yml] --> B[執行docker-compose up];
B --> C[建立網路];
B --> D[建立容器];
C --> E[容器間通訊];
D --> E;
E --> F[應用程式執行];
圖表翻譯:
此圖示展示了使用 Docker Compose 的基本工作流程。首先,建立 docker-compose.yml 檔案定義應用服務。然後,執行 docker-compose up 命令,Docker Compose 將根據組態檔案建立所需的網路和容器。建立完成後,容器之間可以透過建立的網路進行通訊,最終實作應用程式的執行。
Docker Compose 深入解析
Docker Compose 是 Docker 官方提供的一個用於定義和執行多容器 Docker 應用程式的工具。它允許使用者透過一個單獨的 YAML 檔案來定義多個容器之間的關係、組態和服務,從而簡化了複雜應用程式的佈署和管理。
Docker Compose 的基本概念
在開始使用 Docker Compose 之前,瞭解其基本概念是非常重要的。Docker Compose 的核心是 docker-compose.yml 檔案,這個檔案定義了服務、網路和資料卷等組態。
服務(Services)
服務是 Docker Compose 中的基本單位,代表了一個容器及其組態。在 docker-compose.yml 檔案中,你可以定義多個服務,每個服務對應一個容器。
網路(Networks)
Docker Compose 允許你定義自定義網路,使得容器之間可以互相通訊。預設情況下,Docker Compose 會為你的應用程式建立一個預設網路,但你也可以根據需要定義自己的網路。
資料卷(Volumes)
資料卷用於持久化資料,即使容器被刪除,資料仍然保留。Docker Compose 允許你在 docker-compose.yml 檔案中定義資料卷,並將其掛載到容器中。
使用 Docker Compose 佈署 Jupyter 和 Redis
在本文中,我們將透過一個實際的例子來演示如何使用 Docker Compose 佈署一個包含 Jupyter 和 Redis 的應用程式。
步驟1:建立 docker-compose.yml 檔案
首先,我們需要建立一個 docker-compose.yml 檔案來定義我們的服務。
version: '3'
services:
this_jupyter:
build: docker/jupyter
ports:
- "8888:8888"
volumes:
- .:/home/jovyan
env_file:
- config/jupyter.env
this_redis:
image: redis
這個檔案定義了兩個服務:this_jupyter 和 this_redis。this_jupyter 服務是透過 docker/jupyter 目錄中的 Dockerfile 構建的,而 this_redis 服務則直接使用了官方的 Redis 映象。
步驟2:構建 Jupyter 映象
我們需要在 docker/jupyter 目錄中建立一個 Dockerfile,用於構建 Jupyter 映象。
FROM jupyter/scipy-notebook
USER root
RUN conda install --yes --name root spacy pymongo
RUN ["bash", "-c", "source activate root && pip install twitter"]
RUN python -m spacy download en
USER jovyan
步驟3:組態環境變數
我們需要在 config 目錄中建立一個 jupyter.env 檔案,用於存放 Jupyter 的環境變數。
# config/jupyter.env
TWITTER_API_KEY=your_api_key
TWITTER_API_SECRET=your_api_secret
TWITTER_ACCESS_TOKEN=your_access_token
TWITTER_ACCESS_TOKEN_SECRET=your_access_token_secret
#### 內容解密:
- 環境變數檔案:在
docker-compose.yml中透過env_file指定了config/jupyter.env檔案,這使得 Jupyter 容器可以讀取到 Twitter API 的憑證。 - Jupyter 映象構建:透過 Dockerfile,我們為 Jupyter 映象安裝了所需的 Python 包,如
spacy、pymongo和twitter。 - Redis 連線:在 Jupyter Notebook 中,我們可以直接透過服務名
this_redis連線到 Redis 容器,無需知道其 IP 地址。
連線到 Redis
在 Jupyter Notebook 中,我們可以透過以下程式碼連線到 Redis:
import redis
REDIS = redis.Redis(host='this_redis')
REDIS.incr('my_incrementor')
print(REDIS.get('my_incrementor'))
#### 內容解密:
redis函式庫的使用:首先匯入redis函式庫,並建立一個連線到this_redis的 Redis 物件。INCR命令:使用INCR命令對my_incrementor鍵的值進行遞增操作。GET命令:使用GET命令取得my_incrementor鍵的當前值。
銷毀應用程式
當我們完成實驗後,可以透過以下命令銷毀整個應用程式:
docker-compose down
#### 內容解密:
docker-compose down命令:該命令會停止並刪除由docker-compose up命令啟動的所有容器、網路和資料卷。- 資源清理:透過這個命令,我們可以確保所有與該應用程式相關的資源都被正確清理,避免佔用系統資源。
圖表說明
graph LR;
A[Docker Compose] --> B[定義服務];
A --> C[定義網路];
A --> D[定義資料卷];
B --> E[this_jupyter];
B --> F[this_redis];
E --> G[Jupyter Notebook];
F --> H[Redis];
圖表翻譯:
- Docker Compose 是整個流程的核心,用於定義和管理多個容器。
this_jupyter和this_redis是兩個主要的服務,分別對應 Jupyter Notebook 和 Redis。- 服務之間的關係 透過 Docker Compose 的組態進行管理,使得它們可以在同一網路中互相通訊。
隨著容器化技術的不斷發展,Docker Compose 將繼續在多容器應用程式的管理中發揮重要作用。未來,我們可以期待更多功能和改進,以進一步簡化複雜應用程式的佈署和管理。