Oracle Database 26ai Free – Docker Compose 安裝手冊

文件版本:1.0
最後更新:2026-01-09
適用版本:Oracle Database 26ai Free (23.26.0)


1. 環境需求

1.1 虛擬機硬體需求

項目最低需求建議配置說明
vCPU2 核心2 核心Free 版本限制最多 2 核心
RAM4 GB6-8 GBFree 版本限制最多 2 GB
磁碟40 GB60 GB建議 SSD
Swap2 GB4 GB

1.2 軟體需求

軟體版本
作業系統Oracle Linux 8 / Ubuntu 22.04+
Docker20.10+
Docker Composev2.0+

1.3 Free 版本限制

項目限制
CPU最多 2 核心
記憶體最多 2 GB
User Data最多 12 GB
SID固定 FREE
PDB固定 FREEPDB1

2. 系統準備

2.1 Oracle Linux 8

# 更新系統
sudo dnf update -y

# 安裝 Docker
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 啟動 Docker
sudo systemctl start docker
sudo systemctl enable docker

# 加入 docker 群組
sudo usermod -aG docker $USER
newgrp docker

# 設定防火牆
sudo firewall-cmd --permanent --add-port=1521/tcp
sudo firewall-cmd --reload

2.2 Ubuntu 22.04/24.04

# 更新系統
sudo apt update && sudo apt upgrade -y

# 安裝 Docker
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 加入 docker 群組
sudo usermod -aG docker $USER
newgrp docker

# 設定防火牆
sudo ufw allow 1521/tcp

2.3 驗證安裝

docker --version
docker compose version

3. Docker Compose 部署

3.1 建立專案目錄

mkdir -p ~/oracle-free
cd ~/oracle-free

3.2 建立目錄結構

mkdir -p oradata scripts/setup scripts/startup

完成後目錄結構如下:

oracle-free/
├── docker-compose.yml
├── .env
├── .env.example
├── .gitignore
├── oradata/
└── scripts/
    ├── setup/
    └── startup/

3.3 建立 .env.example

cat << 'EOF' > .env.example
# Oracle Database Free 環境變數範本
# 複製此檔案為 .env 並填入實際值:cp .env.example .env

# 資料庫密碼(必填,至少 8 字元,含大小寫和數字)
ORACLE_PWD=

# 字元集(選填)
ORACLE_CHARACTERSET=AL32UTF8

# 啟用歸檔日誌(選填)
ENABLE_ARCHIVELOG=false

# 啟用強制日誌(選填)
ENABLE_FORCE_LOGGING=false

# 資料目錄
ORACLE_DATA_DIR=./oradata
EOF

3.4 建立 .env

cat << 'EOF' > .env
# Oracle Database Free 環境變數
ORACLE_PWD=YourSecurePassword123
ORACLE_CHARACTERSET=AL32UTF8
ENABLE_ARCHIVELOG=false
ENABLE_FORCE_LOGGING=false
ORACLE_DATA_DIR=./oradata
EOF

請修改 ORACLE_PWD 為你的密碼(至少 8 字元,含大小寫和數字)

3.5 建立 docker-compose.yml

cat << 'EOF' > docker-compose.yml
version: "3.8"

services:
  oracle-free:
    image: container-registry.oracle.com/database/free:latest
    container_name: oracle-free
    hostname: oracle-free
    ports:
      - "1521:1521"
    environment:
      - ORACLE_PWD=${ORACLE_PWD}
      - ORACLE_CHARACTERSET=${ORACLE_CHARACTERSET:-AL32UTF8}
      - ENABLE_ARCHIVELOG=${ENABLE_ARCHIVELOG:-false}
      - ENABLE_FORCE_LOGGING=${ENABLE_FORCE_LOGGING:-false}
    volumes:
      - ${ORACLE_DATA_DIR:-./oradata}:/opt/oracle/oradata
      - ./scripts/setup:/opt/oracle/scripts/setup
      - ./scripts/startup:/opt/oracle/scripts/startup
    healthcheck:
      test: ["CMD", "sqlplus", "-L", "sys/${ORACLE_PWD}@FREE as sysdba", "@/dev/null"]
      interval: 30s
      timeout: 10s
      retries: 10
      start_period: 300s
    restart: unless-stopped

networks:
  default:
    name: oracle-network
EOF

3.6 建立 .gitignore(選用)

cat << 'EOF' > .gitignore
# 環境變數(含密碼)
.env

# 資料目錄
oradata/

# 日誌
*.log
EOF

3.7 設定資料目錄權限

sudo chown -R 54321:54321 oradata

4. 啟動服務

4.1 登入 Oracle Container Registry

首次使用需登入(使用 Oracle 帳號):

docker login container-registry.oracle.com

4.2 啟動容器

# 啟動(背景執行)
docker compose up -d

# 查看啟動日誌
docker compose logs -f

4.3 等待資料庫就緒

首次啟動需要 3-10 分鐘初始化,等待出現以下訊息:

#########################
DATABASE IS READY TO USE!
#########################

4.4 檢查狀態

# 容器狀態
docker compose ps

# 健康檢查狀態
docker inspect oracle-free --format='{{.State.Health.Status}}'

5. 連線測試

5.1 連線資訊

項目
Hostlocalhost 或 VM IP
Port1521
SIDFREE
Service Name (CDB)FREE
Service Name (PDB)FREEPDB1
SYS 密碼.env 中設定的 ORACLE_PWD

5.2 使用 sqlplus 連線

# 連線到 CDB(以 sysdba 身份)
docker exec -it oracle-free sqlplus sys/\${ORACLE_PWD}@FREE as sysdba

# 連線到 PDB
docker exec -it oracle-free sqlplus pdbadmin/\${ORACLE_PWD}@FREEPDB1

或直接指定密碼:

docker exec -it oracle-free sqlplus sys/YourSecurePassword123@FREE as sysdba

5.3 驗證 SQL

-- 檢查實例狀態
SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;

-- 檢查 PDB
SELECT NAME, OPEN_MODE FROM V$PDBS;

-- 檢查版本
SELECT BANNER FROM V$VERSION WHERE ROWNUM = 1;

-- 離開
EXIT;

6. 常用操作

6.1 服務管理

# 啟動
docker compose up -d

# 停止
docker compose down

# 重啟
docker compose restart

# 查看日誌
docker compose logs -f

# 查看即時日誌(最後 100 行)
docker compose logs -f --tail 100

6.2 變更密碼

docker exec oracle-free /opt/oracle/setPassword.sh NewPassword456

記得同步更新 .env 檔案中的 ORACLE_PWD

6.3 進入容器

# Bash shell
docker exec -it oracle-free bash

# 直接進入 sqlplus
docker exec -it oracle-free sqlplus / as sysdba

6.4 查看 Alert Log

docker exec oracle-free tail -100 /opt/oracle/diag/rdbms/free/FREE/trace/alert_FREE.log

7. 自訂初始化腳本

7.1 腳本說明

目錄執行時機
scripts/setup/資料庫首次建立後執行一次
scripts/startup/每次容器啟動後執行

支援 .sql.sh 檔案,依檔名順序執行(建議加數字前綴)。

7.2 範例:建立應用程式使用者

cat << 'EOF' > scripts/setup/01_create_appuser.sql
-- 切換到 PDB
ALTER SESSION SET CONTAINER = FREEPDB1;

-- 建立使用者
CREATE USER appuser IDENTIFIED BY "AppUserPassword123"
  DEFAULT TABLESPACE USERS
  TEMPORARY TABLESPACE TEMP
  QUOTA UNLIMITED ON USERS;

-- 授權
GRANT CONNECT, RESOURCE TO appuser;
GRANT CREATE VIEW, CREATE SYNONYM TO appuser;

COMMIT;
EXIT;
EOF

7.3 範例:建立範例資料表

cat << 'EOF' > scripts/setup/02_create_tables.sql
ALTER SESSION SET CONTAINER = FREEPDB1;

-- 切換到 appuser
ALTER SESSION SET CURRENT_SCHEMA = appuser;

-- 建立資料表
CREATE TABLE employees (
  id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR2(100) NOT NULL,
  email VARCHAR2(100),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入測試資料
INSERT INTO employees (name, email) VALUES ('張三', 'zhang@example.com');
INSERT INTO employees (name, email) VALUES ('李四', 'li@example.com');

COMMIT;
EXIT;
EOF

7.4 套用腳本

如果容器已在運行,需要重建:

# 停止並移除容器和資料
docker compose down -v
sudo rm -rf oradata/*
sudo chown -R 54321:54321 oradata

# 重新啟動
docker compose up -d

8. 備份與還原

8.1 使用 Data Pump 匯出

# 建立備份目錄
docker exec oracle-free mkdir -p /opt/oracle/backup

# 匯出 Schema
docker exec oracle-free expdp system/${ORACLE_PWD}@FREEPDB1 \
  directory=DATA_PUMP_DIR \
  dumpfile=backup_$(date +%Y%m%d).dmp \
  logfile=backup_$(date +%Y%m%d).log \
  schemas=APPUSER

# 複製到主機
docker cp oracle-free:/opt/oracle/admin/FREE/dpdump/ ./backup/

8.2 使用 Data Pump 匯入

# 複製備份到容器
docker cp ./backup/backup_20260109.dmp oracle-free:/opt/oracle/admin/FREE/dpdump/

# 匯入
docker exec oracle-free impdp system/${ORACLE_PWD}@FREEPDB1 \
  directory=DATA_PUMP_DIR \
  dumpfile=backup_20260109.dmp \
  schemas=APPUSER

8.3 備份整個資料目錄

# 停止容器
docker compose down

# 備份資料目錄
sudo tar -czvf oracle-free-backup-$(date +%Y%m%d).tar.gz oradata/

# 重新啟動
docker compose up -d

9. 故障排除

9.1 容器無法啟動

# 檢查日誌
docker compose logs

# 常見原因:
# 1. 資料目錄權限不正確
sudo chown -R 54321:54321 oradata

# 2. 磁碟空間不足
df -h

# 3. 記憶體不足
free -h

9.2 連線被拒絕

# 確認容器運行中
docker compose ps

# 確認 Listener 狀態
docker exec oracle-free lsnrctl status

# 確認防火牆
sudo firewall-cmd --list-ports  # Oracle Linux
sudo ufw status                  # Ubuntu

9.3 密碼錯誤

# 重設密碼
docker exec oracle-free /opt/oracle/setPassword.sh NewPassword

# 更新 .env 檔案
vim .env

9.4 完全重建

# 停止並刪除所有資料
docker compose down -v
sudo rm -rf oradata/*
sudo chown -R 54321:54321 oradata

# 重新建立
docker compose up -d

10. 完整檔案範本

10.1 一鍵建立所有檔案

#!/bin/bash
# create-oracle-free.sh

# 建立目錄
mkdir -p ~/oracle-free/{oradata,scripts/setup,scripts/startup}
cd ~/oracle-free

# 建立 .env.example
cat << 'EOF' > .env.example
ORACLE_PWD=
ORACLE_CHARACTERSET=AL32UTF8
ENABLE_ARCHIVELOG=false
ENABLE_FORCE_LOGGING=false
ORACLE_DATA_DIR=./oradata
EOF

# 建立 .env
cat << 'EOF' > .env
ORACLE_PWD=YourSecurePassword123
ORACLE_CHARACTERSET=AL32UTF8
ENABLE_ARCHIVELOG=false
ENABLE_FORCE_LOGGING=false
ORACLE_DATA_DIR=./oradata
EOF

# 建立 docker-compose.yml
cat << 'EOF' > docker-compose.yml
version: "3.8"

services:
  oracle-free:
    image: container-registry.oracle.com/database/free:latest
    container_name: oracle-free
    hostname: oracle-free
    ports:
      - "1521:1521"
    environment:
      - ORACLE_PWD=${ORACLE_PWD}
      - ORACLE_CHARACTERSET=${ORACLE_CHARACTERSET:-AL32UTF8}
      - ENABLE_ARCHIVELOG=${ENABLE_ARCHIVELOG:-false}
      - ENABLE_FORCE_LOGGING=${ENABLE_FORCE_LOGGING:-false}
    volumes:
      - ${ORACLE_DATA_DIR:-./oradata}:/opt/oracle/oradata
      - ./scripts/setup:/opt/oracle/scripts/setup
      - ./scripts/startup:/opt/oracle/scripts/startup
    healthcheck:
      test: ["CMD", "sqlplus", "-L", "sys/${ORACLE_PWD}@FREE as sysdba", "@/dev/null"]
      interval: 30s
      timeout: 10s
      retries: 10
      start_period: 300s
    restart: unless-stopped

networks:
  default:
    name: oracle-network
EOF

# 建立 .gitignore
cat << 'EOF' > .gitignore
.env
oradata/
*.log
EOF

# 設定權限
sudo chown -R 54321:54321 oradata

echo "=== 建立完成 ==="
echo "1. 編輯 .env 設定密碼"
echo "2. 執行 docker compose up -d 啟動"

10.2 使用方式

# 儲存腳本
vim create-oracle-free.sh

# 執行
bash create-oracle-free.sh

# 編輯密碼
cd ~/oracle-free
vim .env

# 登入 Oracle Container Registry
docker login container-registry.oracle.com

# 啟動
docker compose up -d

# 查看日誌
docker compose logs -f

參考資源


文件由 Claude 整理

404NOTE
404NOTE
文章: 45

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *