Oracle Docker 容器化部署

Oracle Docker 容器化部署

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


1. 概述

Oracle 官方提供 Docker 镜像[1]:

镜像

  • Oracle 19c EE
  • Oracle 23ai Free
  • Oracle XE

2. 环境准备

2.1 Docker 安装

# CentOS / OL
dnf install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker

# 验证
docker version

2.2 镜像获取

# 官方
docker pull container-registry.oracle.com/database/enterprise:19.19.0.0

# 23ai Free
docker pull container-registry.oracle.com/database/free:23.4

# Docker Hub
docker pull oracle/database:19.3.0-ee

3. 19c EE 部署

3.1 准备

mkdir -p ******
mkdir -p ******
chmod -R 775 /u01

3.2 启动

docker run -d \
  --name orcl \
  -p ****** \
  -p ****** \
  -e ORACLE_SID=orcl \
  -e ORACLE_PWD=****** \
  -e ORACLE_PDB=orclpdb \
  -e ORACLE_CHARACTERSET=AL32UTF8 \
  -v /u01/oradata:/opt/oracle/oradata \
  -v /u01/scripts:/opt/oracle/scripts/startup \
  container-registry.oracle.com/database/enterprise:19.19.0.0

3.3 验证

# 状态
docker logs orcl

# 连接
sqlplus sys/Oracle123@localhost:1521/orcl as sysdba

4. 23ai Free 部署

4.1 启动

docker run -d \
  --name oracle23ai \
  -p ****** \
  -p ****** \
  -e ORACLE_PWD=****** \
  -e ORACLE_CHARACTERSET=AL32UTF8 \
  -v /u01/oradata:/opt/oracle/oradata \
  container-registry.oracle.com/database/free:23.4

4.2 连接

sqlplus sys/Oracle123@localhost:1521/FREE as sysdba

5. 自定义镜像

5.1 Dockerfile

FROM container-registry.oracle.com/database/enterprise:19.19.0.0

# 自定义脚本
COPY init.sql /opt/oracle/scripts/startup/

# 环境变量
ENV ORACLE_SID=orcl
ENV ORACLE_PWD=******

# 暴露端口
EXPOSE 1521 5500

5.2 构建

docker build -t my-oracle:19c .

5.3 运行

docker run -d --name orcl -p ****** my-oracle:19c

6. 初始化脚本

6.1 startup 脚本

# /u01/scripts/01_init.sql
CREATE TABLESPACE my_data DATAFILE SIZE 1G;
CREATE USER my_user IDENTIFIED BY ****** DEFAULT TABLESPACE my_data;
GRANT CONNECT, RESOURCE TO my_user;

# 启动时自动执行

6.2 setup 脚本

# /u01/scripts/setup/01_users.sh
#!/bin/bash
sqlplus / as sysdba <<EOF
CREATE USER ...
EOF

7. 数据持久化

7.1 数据卷

# 数据卷
docker volume create oracle_data

docker run -d \
  --name orcl \
  -v oracle_data:/opt/oracle/oradata \
  ...

7.2 挂载目录

-v /u01/oradata:/opt/oracle/oradata

7.3 备份

# 1. 停止
docker stop orcl

# 2. 备份目录
tar -czf orcl_backup.tar.gz /u01/oradata

# 3. 启动
docker start orcl

8. 网络配置

8.1 端口映射

-p ******  # 数据库
-p ******  # EM Express
-p ******      # SSH

8.2 自定义网络

docker network create oracle_net

docker run -d --name orcl --network oracle_net ...

8.3 容器互联

# 应用容器连接
docker run -d --name app --network oracle_net \
  -e DB_HOST=orcl \
  -e DB_PORT=1521 \
  my_app

9. 管理

9.1 启停

docker stop orcl
docker start orcl
docker restart orcl

9.2 进入

docker exec -it orcl bash
docker exec -it orcl sqlplus / as sysdba

9.3 日志

docker logs orcl
docker logs -f orcl
docker logs --tail 100 orcl

10. 资源限制

10.1 内存

docker run -d --name orcl \
  --memory=8g \
  --memory-swap=8g \
  ...

10.2 CPU

--cpus=4
--cpu-shares=512

10.3 存储

--storage-opt size=100G

11. Docker Compose

11.1 docker-compose.yml

version: '3.8'
services:
  oracle:
    image: container-registry.oracle.com/database/enterprise:19.19.0.0
    container_name: orcl
    ports:
      - "1521:1521"
      - "5500:5500"
    environment:
      - ORACLE_SID=orcl
      - ORACLE_PWD=******
      - ORACLE_PDB=orclpdb
      - ORACLE_CHARACTERSET=AL32UTF8
    volumes:
      - oracle_data:/opt/oracle/oradata
      - ./scripts:/opt/oracle/scripts/startup
    mem_limit: 8g
    cpus: 4

volumes:
  oracle_data:

11.2 启动

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

12. 常见坑与排错

12.1 启动慢

# 1. 内存
docker stats orcl

# 2. 等待初始化
docker logs -f orcl
# DATABASE IS READY TO USE!

12.2 密码丢失

# 1. 进入容器
docker exec -it orcl bash

# 2. 重置
sqlplus / as sysdba
SQL> ALTER USER sys IDENTIFIED BY ******

12.3 数据丢失

# 1. 检查挂载
docker inspect orcl | grep -A 20 Mounts

# 2. 持久化
-v /u01/oradata:/opt/oracle/oradata

13. 最佳实践

  1. 数据卷:持久化
  2. 环境变量密码:自动
  3. 初始化脚本:自动化
  4. 资源限制:稳定
  5. Compose 编排:管理
  6. 23ai Free:开发
  7. 19c EE:生产
  8. 网络:容器互联
  9. 日志监控:问题
  10. 备份:保护

14. 参考资料

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