Oracle Docker 容器化详解

Oracle Docker 容器化详解

适用版本:Oracle Database 19c / 23ai Free 文档版本:v1.0 / 2026-07


1. 概述

Docker 容器化简化部署[1]:

优势

  • 快速
  • 一致
  • 隔离
  • CI/CD

详细见:Oracle Docker 安装指南


2. Docker 安装

2.1 安装

dnf install -y dnf-utils
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker

2.2 验证

docker version
docker info

3. Oracle 23ai Free

3.1 拉取

docker pull container-registry.oracle.com/database/free:23.5-lite

3.2 启动

docker run -d \
  --name oracle-23ai \
  -p ****** \
  -p ****** \
  -e ORACLE_PWD=****** \
  -v /data/oracle/oradata:/opt/oracle/oradata \
  -v /data/oracle/scripts:/opt/oracle/scripts/startup \
  --restart=always \
  container-registry.oracle.com/database/free:23.5-lite

3.3 验证

docker logs -f oracle-23ai

docker exec -it oracle-23ai sqlplus / as sysdba
SQL> SELECT banner_full FROM v$version;

4. Oracle 19c

4.1 镜像构建

git clone https://github.com/oracle/docker-images.git
cd docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0
cp LINUX.X64_193000_db_home.zip .
cd ..
./buildContainerImage.sh -v 19.3.0 -t oracle-db:19c -e

4.2 启动

docker run -d \
  --name oracle-19c \
  -p ****** \
  -p ****** \
  -e ORACLE_PWD=****** \
  -e ORACLE_SID=orcl \
  -e ORACLE_PDB=orclpdb \
  -v /data/oracle/oradata:/opt/oracle/oradata \
  --restart=always \
  oracle-db:19c

5. 数据卷

5.1 持久化

# oradata 持久化
-v /data/oracle/oradata:/opt/oracle/oradata

# 启动脚本
-v /data/oracle/scripts/startup:/opt/oracle/scripts/startup

# 初始化脚本
-v /data/oracle/scripts/setup:/opt/oracle/scripts/setup

5.2 自定义脚本

# /data/oracle/scripts/startup/01_create_user.sql
CREATE USER myapp IDENTIFIED BY ******
GRANT CONNECT, RESOURCE TO myapp;
ALTER USER myapp DEFAULT TABLESPACE users;

6. 网络

6.1 自定义

docker network create oracle-net

docker run -d \
  --name oracle \
  --network oracle-net \
  -p ****** \
  ...

6.2 连接

# 主机
sqlplus sys/Oracle123@localhost:1521/orcl as sysdba

# 容器间
sqlplus sys/Oracle123@oracle:1521/orcl as sysdba

7. Docker Compose

7.1 docker-compose.yml

version: '3.8'

services:
  oracle:
    image: container-registry.oracle.com/database/free:23.5-lite
    container_name: oracle-23ai
    ports:
      - "1521:1521"
      - "5500:5500"
    environment:
      - ORACLE_PWD=******
      - ORACLE_SID=orcl
      - ORACLE_PDB=orclpdb
    volumes:
      - oracle-data:/opt/oracle/oradata
      - ./scripts:/opt/oracle/scripts/startup
    restart: always
    shm_size: '1gb'

volumes:
  oracle-data:

7.2 启动

docker-compose up -d
docker-compose logs -f
docker-compose down

8. 管理

8.1 启停

docker stop oracle-23ai
docker start oracle-23ai
docker restart oracle-23ai

8.2 进入

docker exec -it oracle-23ai bash

# sqlplus
docker exec -it oracle-23ai sqlplus / as sysdba

8.3 日志

docker logs oracle-23ai
docker logs -f --tail 100 oracle-23ai

8.4 监控

docker stats oracle-23ai

9. 备份

9.1 卷备份

docker stop oracle-23ai
tar -czf /backup/oracle-$(date +%Y%m%d).tar.gz /data/oracle/oradata
docker start oracle-23ai

9.2 RMAN

docker exec -it oracle-23ai rman target /

RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

详细见:Oracle RMAN 备份恢复

9.3 Data Pump

docker exec -it oracle-23ai expdp system/Oracle123 ...

详细见:Oracle Data Pump 全集


10. 升级

10.1 数据迁移

# 旧容器
docker stop oracle-old
docker run --rm -v /data/oracle/oradata:/data oracle-old tar czf - /data > /backup/data.tar.gz

# 新容器
docker run -d --name oracle-new -v /data/oracle/oradata:/opt/oracle/oradata oracle-new:23ai

10.2 镜像升级

docker pull container-registry.oracle.com/database/free:23.6-lite
docker-compose down
docker-compose up -d

11. 性能

11.1 SHM

# Oracle 使用 /dev/shm
docker run --shm-size=1g ...

11.2 CPU

docker run --cpus="2" ...

11.3 内存

docker run --memory="4g" ...

12. 安全

12.1 非 root

docker run --user oracle ...

12.2 只读

docker run --read-only ... -v /data/oracle/oradata:/opt/oracle/oradata

12.3 网络

docker run --network=internal ...

13. Kubernetes

13.1 部署

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: oracle
spec:
  serviceName: oracle
  replicas: 1
  selector:
    matchLabels:
      app: oracle
  template:
    metadata:
      labels:
        app: oracle
    spec:
      containers:
      - name: oracle
        image: container-registry.oracle.com/database/free:23.5-lite
        ports:
        - containerPort: 1521
        env:
        - name: ORACLE_PWD
          value: Oracle123
        volumeMounts:
        - name: data
          mountPath: /opt/oracle/oradata
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 50Gi

14. 常见坑与排错

14.1 /dev/shm

- ORA-00845
- --shm-size

14.2 内存

- ORA-04031
- --memory
- 增大

14.3 端口冲突

docker ps
netstat -tlnp | grep 1521

14.4 数据丢失

- 持久化卷
- 验证挂载

15. 最佳实践

  1. 官方镜像:稳定
  2. 持久化卷:数据
  3. 资源限制:稳定
  4. SHM 大小:Oracle
  5. 网络隔离:安全
  6. Compose:编排
  7. K8s:生产
  8. 备份:保护
  9. 监控:及时
  10. 文档化:配置

16. 参考资料

[1] Oracle Database on Docker https://container-registry.oracle.com/