

1. 前言
Docker 部署 Oracle 具有部署快、资源省、迁移易等优势,尤其适用于开发测试、CI/CD 及个人学习等非核心生产场景。
适用场景:Linux 服务器部署 Oracle 数据库,涵盖有网/无网两种环境。
版本选择:本文以 Oracle 19c 为例,实际操作可替换为 18c、21c、23ai 等其他版本,只需更换镜像标签即可。
2. 环境准备:Docker 安装
2.1 标准安装步骤
有网环境下,直接执行以下命令安装 Docker:
# 安装 Docker
sudo yum install -y docker
# 启动 Docker 服务
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker
# 验证安装
docker --version
2.2 yum 仓库失效导致安装失败(异常处理)
执行 yum install 时如遇到以下报错,按步骤处理:
Errors during downloading metadata for repo 'xxx': Status code: 404
错误:Failed to download metadata for repo 'xxx'
原因:系统配置了已失效的第三方 yum 仓库,YUM 更新元数据时遇到任一仓库失败即终止整个安装。
解决方案:
# 1. 查找失效仓库配置文件
sudo grep -l "失效仓库关键词" /etc/yum.repos.d/*.repo
# 2. 编辑该文件,将 enabled=1 改为 enabled=0
sudo vi /etc/yum.repos.d/xxx.repo
# 3. 清理缓存后重试安装
sudo yum clean all
sudo yum install -y docker
2.3 验证 Docker 安装成功
正常输出版本号即表示安装成功
docker --version
3. 获取 Oracle Docker 镜像
3.1 方式一:阿里云镜像(免登录,推荐)
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
3.2 方式二:Oracle 官方镜像(需登录)
docker login container-registry.oracle.com
docker pull container-registry.oracle.com/database/enterprise:19.3.0.0
3.3 方式三:社区镜像(备选)
docker pull docker.cnb.cool/kangaroohy/open-source/images/oracle:19.19.0-ee
3.4 镜像版本选择说明
| 版本 | 镜像标签示例 | 说明 |
|---|---|---|
| Oracle 18c | oracle:18c |
较老版本,部分环境仍在使用 |
| Oracle 19c | oracle:19c |
长期支持版本,推荐生产使用 |
| Oracle 21c | oracle:21c |
创新版本,适合新项目评估 |
| Oracle 23ai | free:23.7.0.0 |
最新版本,AI 特性增强 |
选择时注意镜像仓库是否提供对应架构(x86_64 / aarch64)支持。
4. 镜像导出与无网环境迁移(可选)
当目标服务器处于隔离内网、无法直接拉取镜像时,采用 save + load 方式迁移。
4.1 有网机器导出镜像为 tar
# Windows
docker save -o C:\oracle19c.tar registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
# Linux / Mac
docker save -o /opt/oracle19c.tar registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
4.2 传输 tar 文件至目标服务器
使用 U 盘、SCP、FTP 等方式将 tar 文件复制到目标服务器
4.3 无网目标服务器导入镜像
docker load -i /opt/oracle19c.tar
docker images | grep oracle # 验证导入成功
示例

5. 启动 Oracle 容器
5.1 创建数据持久化目录
在宿主机上创建一个目录,用于存放 Oracle 数据文件,防止容器删除后数据丢失。路径可根据实际情况自定义(例如 /data/oracle、/home/oracle-data 等)。
mkdir -p /your/custom/path
建议选择磁盘空间充足的目录,并与后续
-v挂载参数保持一致。
5.2 docker run 启动命令
以下为启动模板,带 # 请按需修改 注释的项请根据实际环境调整:
docker run -d \
--name oracle19c \
-p 1521:1521 \ # 外部端口:容器内端口,可修改外部端口(如 -p 15211:1521)
-p 5500:5500 \ # EM 控制台端口,可修改外部端口
-e ORACLE_PDB=orclpdb \ # 可插拔数据库名称,连接时需使用
-e ORACLE_PWD=YourStrongPassword \ # 管理员密码,请修改为强密码
-e ORACLE_CHARACTERSET=AL32UTF8 \ # 字符集,可按需修改
-e INIT_SGA_SIZE=3000 \ # SGA 内存(MB),根据宿主机资源调整
-e INIT_PGA_SIZE=1000 \ # PGA 内存(MB),根据宿主机资源调整
-v /your/custom/path:/opt/oracle/oradata \ # 左侧替换为 5.1 创建的目录
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
可变参数说明:
| 参数 | 说明 | 常见调整示例 |
|---|---|---|
-p 1521:1521 |
左为宿主机监听端口,右为容器内固定端口 | 宿主机端口可改为 15211、30015 等 |
-p 5500:5500 |
左为宿主机 EM 端口,右为容器内固定端口 | 宿主机端口可改为 5501 等 |
-v |
左为宿主机目录,右为容器内数据目录(固定) | 左侧改为 5.1 中创建的实际路径 |
ORACLE_PDB |
数据库服务名 | 可自定义,外部连接时需保持一致 |
INIT_SGA_SIZE / INIT_PGA_SIZE |
内存分配 | 根据宿主机内存调整,建议 SGA 不超过物理内存的 50% |
外部连接时,服务名填写
ORACLE_PDB的值,端口填写-p左侧配置的宿主机端口。
5.3 验证容器运行状态
docker ps | grep oracle19c
docker logs -f oracle19c # 首次启动约 5-15 分钟,出现 "DATABASE IS READY TO USE!" 即就绪
6. 连接与验证
6.1 容器内连接
docker exec -it oracle19c /bin/bash
sqlplus / as sysdba
验证 oracle本机可正常执行:

6.2 外部工具连接(Navicat / SQL*Plus)
| 连接项 | 值 |
|---|---|
| 主机 | 服务器 IP(如 192.168.86.102) |
| 端口 | 1521(或映射的外部端口) |
| 服务名 | orclpdb(与 ORACLE_PDB 保持一致) |
| 用户名 | system |
| 密码 | ORACLE_PWD 设置的值 |
7. 常见问题排查
7.1 外部无法连接容器(IPv4 转发未开启)
现象 :容器内部 sqlplus 可正常连接,但外部 Navicat 等工具连接超时或拒绝。
根因:Docker 宿主机 IPv4 转发功能被禁用,外部流量无法通过端口映射进入容器。
关键日志 (docker logs 中可见):
WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方案:
# 1. 临时启用 IPv4 转发
sudo sysctl net.ipv4.ip_forward=1
# 2. 永久生效
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
# 3. 重启 Docker 服务及容器
sudo systemctl restart docker
docker start oracle19c
验证端口可达:
# Windows 本机测试
Test-NetConnection -ComputerName 192.168.86.102 -Port 1521
看到 TcpTestSucceeded : True 即表示正常,Navicat 即可连接。

