云原生学习笔记(七) 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 管理、自动化导入导出等流程,本文是你的完美起点。


相关推荐
香气袭人知骤暖几秒前
MVCC为什么不能完全解决幻读问题
数据库·oracle
jarreyer34 分钟前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟37 分钟前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝43 分钟前
docker部署gitlab
docker·容器·gitlab
知识分享小能手1 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker
Knight_AL1 小时前
使用 Docker 快速安装 GitLab(CentOS)
docker·centos·gitlab
牛奔3 小时前
Docker Compose 解决服务间 DNS 解析失败问题
运维·docker·容器
lkbhua莱克瓦243 小时前
进阶-SQL优化
java·数据库·sql·mysql·oracle
L1624763 小时前
Docker 安装部署全流程使用指南(Linux 通用版)
linux·docker·容器
Mr. Cao code3 小时前
MySQL数据卷实战:持久化存储秘籍
数据库·mysql·docker·容器