云原生学习笔记(七) Docker 实战:使用 Docker 快速构建 Oracle 12c 容器

一、为什么选择 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

八、容器内权限与用户管理

安装 passwdsudo

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 管理、自动化导入导出等流程,本文是你的完美起点。


相关推荐
m0_623955662 小时前
Oracle使用SQL一次性向表中插入多行数据
数据库·sql·oracle
jnrjian4 小时前
Oracle RAC环境 加错数据文件 的修复 归档非归档都没问题
sql·oracle
呆萌的代Ma5 小时前
解决Mac上的老版本docker desktop 无法启动/启动后一直转圈/无法登陆账号的问题
macos·docker·eureka
feilieren5 小时前
Docker 安装 Elasticsearch 9
运维·elasticsearch·docker·es
KaiwuDB6 小时前
使用Docker实现KWDB数据库的快速部署与配置
数据库·docker
cleble7 小时前
(转)使用DockerCompose部署微服务
docker
朱杰jjj9 小时前
Docker容器中无法使用vim、vi命令处理
docker·容器·vim
东林牧之10 小时前
CICD[软件安装]:docker安装gitlab
docker·容器·gitlab
东林牧之10 小时前
CICD[导航]、docker+gitlab+harbor+jenkins从安装到部署
docker·gitlab·jenkins
焱焱枫18 小时前
Oracle获取执行计划之10046 技术详解
数据库·oracle