【Docker-Oracle 19c】Linux 服务器 Docker 部署 Oracle 19c数据库指南

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 左为宿主机监听端口,右为容器内固定端口 宿主机端口可改为 1521130015
-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 即可连接。