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 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
下载安装介质和构建脚本
- 下载 Oracle 安装包。
- 下载 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
- 12.1.0.2(amd64)
说明:
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 目录。如下:
/home/docker-images-main.zip
/home/LINUX.X64_193000_db_home.zipcd /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 镜像
# 进入 buildContainerImage.sh 脚本所在目录
$ cd ./docker-images-main/OracleDatabase/SingleInstance/dockerfiles
# 执行脚本构建
# -v:指定镜像版本(跟目录名称版本一样,没有最后一个 0)
# -e:构建企业版
$ ./buildContainerImage.sh -v 19.3.0 -e
# 然后就是半小时漫长等待(取决于网络)直到出现如下信息,则构建成功:
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.构建完成后,查看镜像
[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
# 登录 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,则容器第一次启动初始化会没有权限而报错。不挂载卷则没有这个问题。
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 连接
# 进入容器
docker exec -it oracle /bin/bash
# 登录sqlplus(如果不是docker,可以用终端或命令提示符使用 sqlplus)
sql> sqlplus /nolog
sql> connect /as sysdba
# 然后就可以做任何想做的事情了,比如修改密码永不过期、创建用户等操作客户端连接
# SID和服务名: ORCLCDB
# jdbc url: jdbc:oracle:thin:@//localhost:1521/ORCLCDB
# 用户名:SYS, SYSTEM and PDB_ADMIN
# 密码: 123456修改密码永不过期
# 用 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';创建用户
# 创建用户,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 角色。
create user C##TEST identified by "1qaz2wsx";
grant "CONNECT","RESOURCE" to "C##TEST";重启容器
docker stop oracle
docker start oracle