Skip to content

Docker 构建 Oracle 12c R2 12.2.0.1.0 镜像

环境:

  • centos7
  • docker --version: 20.12.0-ce

参考文档

  1. 官方构建文档:https://github.com/oracle/docker-images/blob/main/OracleDatabase/SingleInstance/README.md
  2. 三方构建文档:Oracle Docker 镜像(制作)
  3. 三方构建文档:docker- 构建 oracle2c-r2(12.2.0.1) 的镜像

准备工作

  1. 下载 oracle 12c R2(12.2.0.1.0) linux x64 压缩包:Oracle 11g 12C 等旧版-下载总结
  2. 下载 oracle 官方 github 上的构建包脚本压缩包:https://github.com/oracle/docker-images

下载好的压缩包为:

txt
docker-images-main.zip
linuxx64_12201_database.zip

# --------------------------------------------------------------
# 此数据库安装包必须命名为这样的格式:linuxx64_<version>_database.zip (可查看 github 上官方构建文档)
# 当前安装包版本:12.2.0.1.0
# 按照 docker-images-main.zip 中的目录层级,版本号没有最后一个 0
# 所以命名为 linuxx64_12201_database.zip

# 注意:19.3.0.0.0 版本的命名规则与 12 的版本不一样
# 19.3.0.0.0 版本应该命名为:LINUX.X64_193000_db_home.zip

# 提示,运行 ./buildContainerImage.sh -v 19.3.0 -e 命令时,可根据报错信息来修正命名。
  1. 将以上两个压缩包复制到装有 docker 的 linux 主机上,并解压缩 docker-images-main.zip
    1. unzip docker-images-main.zip
  2. 将 linuxx64_12201_database.zip 安装包移动到上一步解压缩后的指定文件夹下:
    1. docker-images-main/OracleDatabase/SingleInstance/dockerfiles/12.2.0.1/linuxx64_12201_database.zip

提示:如果从 oracle 官方下载的安装包是两个压缩包,则需要命名两个压缩包。比如 12C R1(12.1.0.2) 版本,需要分别命名为:

  • linuxamd64_12102_database_1of2.zip
  • linuxamd64_12102_database_2of2.zip

构建 DOCKER 镜像

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

# 执行脚本构建(-v:指定镜像版本;-e:构建企业版)
$ ./buildContainerImage.sh -v 12.2.0.1 -e
# 然后就是半小时漫长等待(取决于网络)

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

shell
Step 22/22 : CMD exec $ORACLE_BASE/$RUN_FILE
 ---> Running in fbb1bb03ac4f
Removing intermediate container fbb1bb03ac4f
 ---> 5d4779f2076c
Successfully built 5d4779f2076c
Successfully tagged oracle/database:12.2.0.1-ee

  Oracle Database container image for 'ee' version 12.2.0.1 is ready to be extended:

    --> oracle/database:12.2.0.1-ee

  Build completed in 1910 seconds.

[root@ls dockerfiles]#

构建完成后,查看镜像

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

推送到 docker hub

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

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

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

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

启动容器

shell
docker pull mengweijin/oracle:12.2.0.1-ee

# 注意:如果挂载卷,可能需要给本地物理机挂载的文件夹授权 775
# 比如:chmod -R a+w /opt/oracle/oradata
# 否则容器第一次启动初始化会没有权限而报错。
# 不挂载卷则没有这个问题。

docker run --name oracle12c \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=ORCLCDB \
-e ORACLE_PDB=ORCLPDB \
-e ORACLE_PWD=123456 \
-v [<host mount point>:]/opt/oracle/oradata \
-d mengweijin/oracle:12.2.0.1-ee

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

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

sqlplus 连接

shell
# 进入容器
docker exec -it oracle12c /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 oracle12c
docker start oracle12c

备注说明

非 docker 安装的 oracle,通过客户端工具连接时,可能遇到这些问题:

sqlplus 可以连接,但客户端工具无法使用 SYS 用户连接 ORA-12541

ORA-12541: Cannot connect. No listener at host 192.168.188.141 port 1521. (CONNECTION_ID=YWFMDX8WQVqJpeOreyFc4w==)

ORA-12541: TNS: 无监听程序

使用 oracle 服务器上的 net configuration assistant 工具重新配置【监听程序配置】和【本地网络服务名配置】。

配置【监听程序配置】时,选择:

  • 【重新配置】
  • 【LISTENER】
  • 【TCP】
  • 【1521】

配置【本地网络服务名配置】时,选择:

  • 【重新配置】
  • 服务名选择【ORCL】(根据自己实际情况)
  • 【TCP】
  • 主机名写 ip 地址【192.168.1.100】
  • 【1521】
  • 【是,进行测试】
  • 【更改登录】修改用户名和密码为自己创建的普通角色的用户。
  • 提示测试成功,则完成配置。

创建的新用户无法登录 ORA-01017

ORA-01017: invalid username/password; logon denied

检查客户端工具是不是【角色】没有选【Normal】