Docker 构建 Oracle 12c R2 12.2.0.1.0 镜像
环境:
- centos7
- docker --version: 20.12.0-ce
参考文档
- 官方构建文档:https://github.com/oracle/docker-images/blob/main/OracleDatabase/SingleInstance/README.md
- 三方构建文档:Oracle Docker 镜像(制作)
- 三方构建文档:docker- 构建 oracle2c-r2(12.2.0.1) 的镜像
准备工作
- 下载 oracle 12c R2(12.2.0.1.0) linux x64 压缩包:Oracle 11g 12C 等旧版-下载总结
- 下载 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 命令时,可根据报错信息来修正命名。
- 将以上两个压缩包复制到装有 docker 的 linux 主机上,并解压缩 docker-images-main.zip
- unzip docker-images-main.zip
- 将 linuxx64_12201_database.zip 安装包移动到上一步解压缩后的指定文件夹下:
- 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】