iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
生成式 AI

一起來打造 PTT 文章智慧問答系統!系列 第 4

【Day 04】Docker 環境建置 - 建立可攜式開發與執行環境 (上)

  • 分享至 

  • xImage
  •  

Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com


在今天,我們將建立一個基於 Docker + docker-compose 的開發環境,把 Django、MariaDB 封裝在容器中。這樣做的好處是:

  • 環境一致,跨平台不再「Works on my machine」
  • 一鍵啟動/重建環境
  • 將來部署到伺服器更簡單

本日目標

  1. 安裝 Docker 與 docker-compose
  2. 建立 Dockerfiledocker-compose.yml

為什麼選擇 Docker?

Docker 是一套容器化技術,可以將應用程式及其所有依賴打包成一個容器(Container)。透過 Docker,我們可以:

  • 快速部署應用程式
  • 不受作業系統影響(可在 Windows/Mac/Linux 一致執行)
  • 輕鬆管理資料庫、後端 API、前端應用程式等多個服務

Dockerfile 與 docker-compose.yml 是什麼?

docker-compose.yml 是一個 YAML 檔,用來定義和管理多個 Docker 容器的設定與組合。它解決了單靠 Dockerfile 難以處理多容器協作的問題(例如:前端 + 後端 + 資料庫)。

Dockerfile 是一個純文字檔,用來定義一個 Docker 映像檔(image)如何建立。它就像是一份「建構藍圖」,告訴 Docker 要安裝什麼、執行什麼,才能建出你需要的環境。

步驟一:安裝 Docker 與 docker-compose

  • 前往 Docker 官方網站 下載 Docker Desktop(支援 macOS / Windows)
  • 安裝完成後,可在終端機確認版本:
docker --version
docker-compose --version

步驟二:建立 Dockerfile

在專案根目錄建立 Dockerfile

FROM python:3.11-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

RUN apt-get update && apt-get install -y \
    gcc \
    default-libmysqlclient-dev \
    pkg-config \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --upgrade pip && pip install -r requirements.txt

這份檔案主要目的是最後兩行: 依照 requirements.txt 安裝套件,也就是建立虛擬環境

這是一個用來建立 Python 應用程式 Docker 映像檔的 Dockerfile。以下是各行的簡單說明:

FROM python:3.11-slim

使用 Python 3.11 的輕量版映像作為基礎,可以快速建立起來。

ENV PYTHONDONTWRITEBYTECODE=1

避免 Python 產生 .pyc 位元組碼檔案(不必要的檔案)。

ENV PYTHONUNBUFFERED=1

讓 Python 輸出不使用緩衝區,方便日誌立即輸出到終端。

WORKDIR /app

設定容器內的工作目錄為 /app

RUN apt-get update && apt-get install -y \ ...

安裝必要的系統套件,如:

  • gcc: 編譯 C 擴展用
  • default-libmysqlclient-dev: 安裝 MySQL 用的開發套件
  • pkg-config: 編譯時用來偵測套件的工具
    安裝完後清除快取以減少映像大小。

COPY requirements.txt .

將本地的 requirements.txt 複製到容器的 /app 目錄。

RUN pip install --upgrade pip && pip install -r requirements.txt

升級 pip 並安裝 requirements.txt 中列出的 Python 套件。

因此在部署之前要確保 requirements.txt 內有所有我們會用到的套件。


步驟三:建立 docker-compose.yml

在根目錄新增 docker-compose.yml 檔案:

version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: django_web
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:11.7.2
    container_name: my_mariadb
    restart: always
    environment:
      MYSQL_DATABASE: my_database
      MYSQL_USER: ptt_rag
      MYSQL_PASSWORD: ptt_rag
      MYSQL_ROOT_PASSWORD: root

    ports:
      - "3307:3306"
    volumes:
      - ./mariadb_data:/var/lib/mysql

這份檔案可視為一份部署計畫書,目的是建立這兩個服務(容器):

  1. web:
    Django 的 Web 服務,透過 build 指定的 Dockerfile 建立環境,啟動時執行 python manage.py runserver 命令對外開放在 8000 埠口,並掛載本機目錄以利開發同步。
  2. mariadb:
    是資料庫服務,使用官方的 MariaDB 映像版本 11.7.2,透過環境變數初始化資料庫與使用者,將資料存放在主機的 mariadb_data 目錄以確保持久化儲存。web 服務會依賴 mariadb,確保資料庫先啟動以供 Django 應用連線。

mariadb 本地的 port 號設成 3307 是因為我們本地測試的部分是 3306 ,避免撞號。


明天【Day05】:Docker 環境建置 - 建立可攜式開發與執行環境 (下),我們將接續今天未完成的部分,完整部署到 Docker 的容器!


上一篇
【Day 03】環境建置與必要工具安裝 - MariaDB
下一篇
【Day 05】Docker 環境建置 - 建立可攜式開發與執行環境 (下)
系列文
一起來打造 PTT 文章智慧問答系統!14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言