在資料科學領域,有效管理資料儲存至關重要。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 檔案定義了兩個服務:postgresjupyterpostgres 服務使用官方的 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

內容解密:

  1. 使用 curl 命令從 GitHub 下載特定版本的 Docker Compose 二進位制檔案。
  2. 將下載的檔案移動到 /usr/local/bin/ 目錄下,使其成為系統可執行檔。
  3. 使用 chmod 命令賦予該檔案執行許可權。
  4. 透過檢查版本確認安裝成功。

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

內容解密:

  1. version: '3' 指定了 Docker Compose 檔案的版本。
  2. services 定義了組成應用程式的各個服務。
  3. 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

內容解密:

  1. 定義了兩個服務:this_jupyterthis_redis
  2. this_jupyter 使用 jupyter/scipy-notebook 映象,將主機的8888埠對映到容器的8888埠,並掛載當前目錄到容器的 /home/jovyan 目錄。
  3. 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

內容解密:

  1. -d 引數使應用程式在背景執行。
  2. Docker Compose 自動建立網路供容器間通訊。
  3. 建立並啟動定義在 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         

內容解密:

  1. 列出當前 docker-compose.yml 所定義的容器狀態。
  2. 顯示容器的名稱、執行的命令、狀態和埠對映資訊。

連線到 Jupyter 容器並檢查環境變數

使用 docker exec 連線到 Jupyter 容器並檢查環境變數:

$ docker exec -it ch9jupyterredis_this_jupyter_1 bash
jovyan@container_id:~$ env | grep redis

內容解密:

  1. 使用 docker exec 命令進入正在執行的 Jupyter 容器。
  2. 使用 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_jupyterthis_redisthis_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

#### 內容解密:

  1. 環境變數檔案:在 docker-compose.yml 中透過 env_file 指定了 config/jupyter.env 檔案,這使得 Jupyter 容器可以讀取到 Twitter API 的憑證。
  2. Jupyter 映象構建:透過 Dockerfile,我們為 Jupyter 映象安裝了所需的 Python 包,如 spacypymongotwitter
  3. 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'))

#### 內容解密:

  1. redis 函式庫的使用:首先匯入 redis 函式庫,並建立一個連線到 this_redis 的 Redis 物件。
  2. INCR 命令:使用 INCR 命令對 my_incrementor 鍵的值進行遞增操作。
  3. GET 命令:使用 GET 命令取得 my_incrementor 鍵的當前值。

銷毀應用程式

當我們完成實驗後,可以透過以下命令銷毀整個應用程式:

docker-compose down

#### 內容解密:

  1. docker-compose down 命令:該命令會停止並刪除由 docker-compose up 命令啟動的所有容器、網路和資料卷。
  2. 資源清理:透過這個命令,我們可以確保所有與該應用程式相關的資源都被正確清理,避免佔用系統資源。

圖表說明

  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];

圖表翻譯:

  1. Docker Compose 是整個流程的核心,用於定義和管理多個容器。
  2. this_jupyterthis_redis 是兩個主要的服務,分別對應 Jupyter Notebook 和 Redis。
  3. 服務之間的關係 透過 Docker Compose 的組態進行管理,使得它們可以在同一網路中互相通訊。

隨著容器化技術的不斷發展,Docker Compose 將繼續在多容器應用程式的管理中發揮重要作用。未來,我們可以期待更多功能和改進,以進一步簡化複雜應用程式的佈署和管理。