Skip to content

Docker 构建 Oracle 19c 镜像

Oracle 官方镜像下载:https://container-registry.oracle.com/

但由于官方没有较早的数据库版本镜像(amd64, arm64),所以需要自行构建。

参考文档

Oracle 19c Linux 安装文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/index.html

官方构建文档:https://github.com/oracle/docker-images/blob/main/OracleDatabase/SingleInstance/README.md

Oracle 数据库安装包下载:https://www.oracle.com/

参考文档:Oracle 11g 12C 等旧版-下载总结

Oracle Database 19c (19.3) for Linux x86-64:https://www.oracle.com/cn/database/technologies/oracle19c-linux-downloads.html

Oracle Database 19c (19.19) for LINUX ARM (aarch64):https://www.oracle.com/database/technologies/oracle19c-linux-arm64-downloads.html

下载安装介质和构建脚本

  1. 下载 Oracle 安装包。
  2. 下载 docker 构建包脚本压缩包:https://github.com/oracle/docker-images

下载好的压缩包清单如下:

注意:安装包的名称要强制保持一致

  • docker 构建脚本:
    • docker-images-main.zip
  • oracle 安装包(下载所需的其中的某版本):
    • 12.1.0.2(amd64)
      • linuxamd64_12102_database_1of2.zip
      • linuxamd64_12102_database_2of2.zip
    • 12.2.0.1(amd64)
      • linuxx64_12201_database.zip
    • 19.3.0.0 (amd64)
      • LINUX.X64_193000_db_home.zip
    • 19.19.0.0(arm64 暂不支持,官方脚本只能在 arm64 操作系统下构建)
      • LINUX.ARM64_1919000_db_home.zip

说明:

txt
1. 此数据库安装包必须命名必须和 docker-images-main.zip 构建脚本中的目录保持一致。
2. 12C R1(12.1.0.2) 版本下载下来的安装包为两个压缩包,因此命名也需要命名为两个。
3. 提示:运行 ./buildContainerImage.sh -v 19.3.0 -e 命令时,如果报错,可根据报错信息来修正命名。

准备工作

我们以 19.3.0.0 (amd64) 版本为例。

假如现在有下载的工具包在 /home 目录。如下:

shell
/home/docker-images-main.zip
/home/LINUX.X64_193000_db_home.zip
shell
cd /home

# 解压到 /home/docker-images-main/ 目录
unzip docker-images-main.zip

# 解压后,就有如下目录
# 19.3.0 是数据库版本号目录,当然也包含其它的,比如:12.1.0.2、12.2.0.1 等不同的文件夹
# 注意:目录名称没有版本中最后一个 0
/home/docker-images-main/OracleDatabase/SingleInstance/dockerfiles/19.3.0/

# 移动安装包到指定版本目录(实际操作时,选择实际版本的文件夹目录即可)
mv LINUX.X64_193000_db_home.zip ./docker-images-main/OracleDatabase/SingleInstance/dockerfiles/19.3.0/

构建 DOCKER 镜像

shell
# 进入 buildContainerImage.sh 脚本所在目录
$ cd ./docker-images-main/OracleDatabase/SingleInstance/dockerfiles

# 执行脚本构建
# -v:指定镜像版本(跟目录名称版本一样,没有最后一个 0)
# -e:构建企业版
$ ./buildContainerImage.sh -v 19.3.0 -e
# 然后就是半小时漫长等待(取决于网络)

直到出现如下信息,则构建成功:

shell
Successfully built 5d4779f2076c
Successfully tagged oracle/database:19.3.0-ee
  Oracle Database container image for 'ee' version 19.3.0 is ready to be extended:
    --> oracle/database:19.3.0-ee
  Build completed in 1910 seconds.

构建完成后,查看镜像

shell
[root@ls dockerfiles]# docker images
REPOSITORY       TAG          IMAGE ID       CREATED         SIZE
oracle/database  19.3.0-ee  5d4779f2076c   3 minutes ago   6.15GB

推送到 docker hub

shell
# 登录 docker hub
[root@ls dockerfiles]# docker login
# 然后根据提示输入用户名和密码

# 打镜像 tag。将镜像 oracle/database:19.3.0-ee 标记为 mengweijin/oracle:19.3.0-ee 镜像。
[root@ls dockerfiles]# docker tag oracle/database:19.3.0-ee mengweijin/oracle:19.3.0-ee

[root@ls dockerfiles]# docker images
REPOSITORY         TAG        IMAGE ID       CREATED          SIZE
mengweijin/oracle  19.3.0-ee  5d4779f2076c   12 minutes ago   6.15GB
oracle/database    19.3.0-ee  5d4779f2076c   12 minutes ago   6.15GB

# 上传本地镜像 mengweijin/oracle:19.3.0-ee 到镜像仓库中。
[root@ls dockerfiles]# docker push mengweijin/oracle:19.3.0-ee

启动容器

注意 1:主机内存不能太低,否则启动报错。

注意 2:启动命令中需要明确指定 --ulimit nofile=1024 参数,否则启动时会报打开文件不足的错误从而启动失败。

注意 3:如果挂载卷的话需要给本地物理机挂载的文件夹授权 775,则容器第一次启动初始化会没有权限而报错。不挂载卷则没有这个问题。

shell
docker pull mengweijin/oracle:19.3.0-ee

# 挂载卷位置
mkdir -p /opt/oracle/oradata
# 授权
chmod -R a+w /opt/oracle

docker run --name oracle \
--ulimit nofile=1024 \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=ORCLCDB \
-e ORACLE_PDB=ORCLPDB \
-e ORACLE_PWD=123456 \
-v /opt/oracle/oradata:/opt/oracle/oradata \
-d mengweijin/oracle:19.3.0-ee

# 查看安装日志
docker logs -ft oracle
# 等待安装完成一直到 100% complete,请耐心等待......

# 进入容器
docker exec -it oracle /bin/bash

关于 docker 启动命令中的 --ulimit nofile=1024 参数

启动命令中需要明确指定 --ulimit nofile=1024 参数,否则启动时会报打开文件不足的错误从而启动失败。

sqlplus 连接

shell
# 进入容器
docker exec -it oracle /bin/bash

# 登录sqlplus(如果不是docker,可以用终端或命令提示符使用 sqlplus)
 sql> sqlplus /nolog
 sql> connect /as sysdba

# 然后就可以做任何想做的事情了,比如修改密码永不过期、创建用户等操作

客户端连接

shell
# SID和服务名: ORCLCDB
# jdbc url: jdbc:oracle:thin:@//localhost:1521/ORCLCDB
# 用户名:SYS, SYSTEM and PDB_ADMIN
# 密码: 123456

修改密码永不过期

shell
# 用 SYS 用户登录系统后:
# 通过如下sql查询所用用户密码有效期配置。查询结果一般为:DEFAULT
Sql> select username, PROFILE FROM dba_users;

# 查询配置文件中的有效期参数(dba_profiles)默认 LIMIT=180
Sql> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME';

# 查看Oracle所有用户密码的有效期时间(dba_users)
Sql> SELECT username, account_status, expiry_date FROM dba_users;

# 将默认的有效期改成无限期
Sql> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

# 再次查询发现 LIMIT=UNLIMITED 了
Sql> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME';

创建用户

shell
# 创建用户,Oracle 12c 创建用户需要添加 C## :jdbc 连接的时候同样需要 C##
# 如果客户端批量执行创建和授权语句报错的话,则需要一条一条的执行。
create user C##TEST identified by "1qaz2wsx";
# 一般情况下,在新建数据库用户后,都会习惯性的给用户授权 CONNECT 角色和 RESOURCE 角色。
grant "CONNECT","RESOURCE" to "C##TEST";
# 如果 Oracle 报 ORA-01950 错误,则需要下面表空间授权:
GRANT UNLIMITED TABLESPACE TO C##TEST;
# 或
ALTER USER C##TEST QUOTA UNLIMITED ON USERS;
# 如果需要 DBA 权限,则授予 DBA 角色
grant "DBA" to "C##TEST";
# 删除用户
drop user C##TEST cascade;
# 修改密码
ALTER user C##TEST identified by "1qaz2wsx";

用户角色和授权

Oracle 数据库拥有三个标准的角色:CONNECT、RESOURCE、DBA

  • CONNECT 角色:是授予最终用户的典型权利,最基本的权力,能够连接到 ORACLE 数据库中,并在对其他用户的表有访问权限时,做 SELECT、UPDATE、INSERT 等操作。
    • ALTER SESSION --修改会话
    • CREATE CLUSTER --建立聚簇
    • CREATE DATABASE LINK --建立数据库链接
    • CREATE SEQUENCE --建立序列
    • CREATE SESSION --建立会话
    • CREATE SYNONYM --建立同义词
    • CREATE VIEW --建立视图
  • RESOURCE 角色:是授予开发人员的,能在自己的方案中创建表、序列、视图等。
    • CREATE CLUSTER --建立聚簇
    • CREATE PROCEDURE --建立过程
    • CREATE SEQUENCE --建立序列
    • CREATE TABLE --建表
    • CREATE TRIGGER --建立触发器
    • CREATE TYPE --建立类型
  • DBA 角色:是授予系统管理员的,拥有该角色的用户就能成为系统管理员了,它拥有所有的系统权限。

一般情况下,在新建数据库用户后,都会习惯性的给用户授权 CONNECT 角色和 RESOURCE 角色。

shell
create user C##TEST identified by "1qaz2wsx";

grant "CONNECT","RESOURCE" to "C##TEST";

重启容器

shell
docker stop oracle
docker start oracle