jk's notes
  • 使用 Docker 镜像来运行 Oracle

使用 Docker 镜像来运行 Oracle

基本步骤:

  1. 拉取镜像
  2. 创建容器
  3. 配置环境并列(SID和密码)
  4. 配置本地 NET 服务名, 用户名为 system, 即可连接.

给出一个示例

docker pull container-registry.oracle.com/database/free:latest
docker volume create OracleVolumeDev
docker run -d --name my-oracle-dev \
    -p 1521:1521 \
    -e ORACLE_PWD Sa12345678 \
    -v OracleVolumeDev:/opt/oracle/oradata \
    container-registry.oracle.com/database/free:latest

不要修改 SID, 默认 SID 为 FREE 创建容器名需要使用小写 PowerShell 中使用 ` 代替 \

如果使用 PL/SQL 去连接, 配置 net (在 实例文件夹中找到 network, 然后在 admin 中有 tnsnames.ora 文件)

LOCALFREE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = FREE)
    )
  )

连接时看看容器日志, 以确保初始化完毕. 初始化的时间一般比较常.

查看当前 Oracle 版本:

SELECT * FROM v$version

文档详细说明

2023年10月31日, 此时官方给出的数据库版本为 23c

文档从 oracle 官网 > 产品 > 数据库 > 下载数据库 进入下载页面, 里面会有 Docker 连接.

该镜像是 Oracle Free Release 23c (23.3.0.0) 的镜像, 运行在 Oracle Linux 8 上. 该数据库包含可插拔多租户配置.

更详细的细节可以参考文档: http://docs.oracle.com/en/database/

仓库 URL https://container-registry.oracle.com/ords/ocr/ba/database/free, 也是文档所在.

拉取最新镜像:

docker pull container-registry.oracle.com/database/free:latest

image-20231031103619226

使用该镜像启动 Oracle Database Server 实例

镜像包含预构建数据 (pre-build database), 因此启动非常快.

快速启动非常适用于 CI/CD 场景. 启动 数据库服务实例, 可以执行下面命令, 其中 <oracle-db> 为容器名.

$ podman run -d --name <oracle-db> container-registry.oracle.com/database/free:latest

启动容器时, SYS, SYSTEM, 和 PDBADMIN 用户使用随机密码, 该密码为默认密码.

文档使用 podman 作为工具, 直接使用 docker 也是一样

在 podman 下 数据库 STATUS 为 healthy 后即可连接使用. 可以使用 ps 子命令进行查看.

例如: docker ps, podman ps 等.

image-20231031111137996

自定义配置

数据库容器带有很多参数可供快速配置. 还是官方示例:

podman run --name <容器名> \
  -P | -p <本地端口>:1521 \
  -e ORACLE_PWD=<数据库密码> \
  -e ORACLE_CHARACTERSET=<字符集> \
  -v [主机挂载点:]/opt/oracle/oradata \
  container-registry.oracle.com/database/free:latest

其中参数:

  • 如果不提供容器名, 则会生成随机名
  • 本地端口如果不冲突建议使用默认的 1521
  • 数据库密码为 SYS, SYSTEM, PDBADMIN 的默认密码, 如果不设置会生成随机密码.
  • 字符集默认为 AL32UTF8. 注意该命令只在第一次初始化数据库文件时生效.
  • /opt/oracle/oradata 为数据库文件存储的路径. 如果省略数据库将无法持久化数据.
  • /opt/oracle/scripts/startup 可选卷. 可包含自定义脚本, 在数据库启动时运行.
  • /opt/oracle/scripts/setup 可选卷. 可包含脚本, 在数据库 setup 后运行.

然后文档介绍了, 使用 podman 生成密码, 以及重新连接数据库, 以及本地连接, 远程连接的介绍. 这里略去.

因为还不会 podman, 也许后续会加, 也许不会 (docker 已经很好用了)

复用已存在数据库

数据库的文件格式是标准的, 只要将文件放在一个目录中作为卷的挂载, 在运行数据库容器即可.

podman run -d \
  --name <oracle-db> \
  -v <主机路径要求有可写权限>:/opt/oracle/oradata \
  container-registry.oracle.com/database/free:latest

setup 和 startup 卷

然后文档介绍了 setup 卷和 startup 卷的作用. 脚本中可以支持的文件有 .sh 和 .sql.

为了确保执行的顺序, 可以在文件开头用数字编号.

注意: startup 在数据库 setup 后第一次启动时执行.

其他

文档最后给出了镜像的拉取地址.

Last Updated:
Contributors: jk