一、为什么选择 Docker 部署 Oracle?
在传统架构中部署 Oracle 数据库常常面临安装流程繁琐、依赖复杂、环境不一致等问题。而 Docker 提供了轻量级、快速可复制的容器化环境,极大提升了数据库实验、测试与轻量部署的效率。通过 Oracle 官方维护的镜像构建脚本,我们可以用脚本方式快速生成 Oracle 12c 容器,做到"即拉即用"。
二、准备工作:镜像构建
1. 登录远程主机
使用 MobaXterm 登录远程服务器:
bash
ssh myuser@192.168.100.115
# 密码为 TEST123
提示:建议登录后立即更改密码并配置公钥登录,增强安全性。
2. 下载 Oracle 镜像构建项目
bash
git clone https://github.com/oracle/docker-images.git
该仓库包含构建 Oracle 镜像的 buildContainerImage.sh
脚本和所需的 Dockerfile 模板。
3. 放置 Oracle 安装介质
将 LINUX.X64_12201_database.zip
放在:
bash
/home/myuser/docker-images/OracleDatabase/SingleInstance/dockerfiles/12.2.0.1/

4. 构建镜像
bash
cd docker-images/OracleDatabase/SingleInstance/dockerfiles
./buildContainerImage.sh -v 12.2.0.1 -e
⚠️ 若非 root 用户使用
sudo ./buildContainerImage.sh -v 12.2.0.1 -e
构建成功后镜像名为:
bash
oracle/database:12.2.0.1-ee
三、运行容器并配置数据库
1. 启动容器
bash
docker run --name ocl-12c \
-p 20301:1521 -p 20302:5500 \
-e ORACLE_SID=MY \
-e ORACLE_PDB=MYPDB \
-e ORACLE_PWD=Test123 \
-v MY-OracleData:/opt/oracle/oradata \
oracle/database:12.2.0.1-ee
✅ 挂载数据卷保证数据持久性;映射 1521/5500 端口供外部访问。
四、容器内数据库操作
1. 进入容器:
bash
docker exec -it ocl-12c /bin/bash
bash
export ORACLE_SID=MY
sqlplus / as sysdba
2. 若启动时报错
sql
shutdown immediate;
exit

3. 回到主机修改权限
bash
chmod -R 777 /var/lib/docker/volumes/MY-OracleData/_data/MY/
再次进入容器, 查询有哪些PDB:
bash
startup;
select con_id,dbid,NAME,OPEN_MODE from v$pdbs;
五、切换 PDB 并初始化业务用户
sql
alter session set container=MYPDB;
创建表空间
sql
CREATE SMALLFILE TABLESPACE "SCHEMA"
DATAFILE '/opt/oracle/oradata/MY/MYPDB/SCHEMA.DBF' SIZE 100M
AUTOEXTEND ON NEXT 20M MAXSIZE UNLIMITED
LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
创建用户并授权
sql
CREATE USER "SCHEMA" IDENTIFIED BY "SCHEMA" DEFAULT TABLESPACE "SCHEMA" ACCOUNT UNLOCK;
GRANT UNLIMITED TABLESPACE TO "SCHEMA";
GRANT CONNECT, DBA TO "SCHEMA";
六、数据导入导出(使用 expdp/impdp)
导出:
bash
expdp SCHEMA/SCHEMA@10.39.107.41:1521/MHBKSG schemas=SCHEMA \
directory=DATA_PUMP_DIR dumpfile=SCHEMA.dmp logfile=SCHEMA.log;
导入:
bash
docker cp ./SCHEMA.DMP ocl-12c:/opt/oracle/oradata/MY/MYPDB/
impdp SCHEMA/SCHEMA@MYPDB directory=DATA_PUMP_DIR \
dumpfile=SCHEMA.DMP logfile=SCHEMA.log full=y ignore=y;
七、监听与远程连接配置
bash
cd /opt/oracle/product/12.2.0.1/dbhome_1/network/admin/
修改 listener.ora:
ini
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = MY)
(SID_NAME = MY)
)
(SID_DESC =
(GLOBAL_DBNAME = MYPDB)
(SID_NAME = MY)
)
)
修改 sqlnet.ora:
ini
SQLNET.ALLOWED_LOGON_VERSION_SERVER=11
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=11
八、容器内权限与用户管理
安装 passwd
和 sudo
:
bash
yum install passwd sudo -y
修改 oracle 用户密码:
bash
passwd oracle
修改 sudoers 文件:
bash
visudo
# 在 root 行后添加
oracle ALL=(ALL) ALL
chmod 444 /etc/sudoers
九、深入理解与实战反思
✅ 成功点:
- 容器构建自动化:借助 Oracle 官方脚本,将复杂环境集成进容器镜像。
- 权限与监听灵活配置:将权限操作与监听配置独立处理,便于排错。
- 数据卷挂载:数据持久化、便于外部备份和迁移。
- PDB 与表空间管理:体现 Oracle 多租户架构优势。
- 容器内外协作调试 :通过
docker exec
+host chmod
快速修复权限问题。
⚠️ 风险提示:
- 默认
chmod -R 777
存在安全隐患,仅建议测试或短期使用。 - 不建议将
SYSDBA
权限授予普通业务用户。 - 生产环境中应使用 bind mount 或 NAS 存储替代 volume。
✨ 总结
本实战笔记完整覆盖了 Oracle 12c 容器化部署、数据初始化、PDB 配置、权限管理、数据导入导出及监听配置等流程,配合对容器与数据库核心机制的理解,实现了可迁移、可维护、可追踪的轻量级 Oracle 部署方案。
如用于开发/测试场景,这是目前最便捷可靠的 Oracle 搭建方式之一。如果你想在容器中探索数据库开发、PDB 管理、自动化导入导出等流程,本文是你的完美起点。