docker实战部署并配置oracle21方式(官方镜像)

 更新时间:2025年05月30日 10:22:57   作者:zlk_xiaofan  
这篇文章主要介绍了docker实战部署并配置oracle21方式(官方镜像),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

基础环境信息

名称详细信息
linux环境CentOS Linux release 7.9.2009 (Core)
内核版本3.10.0-1160.el7.x86_64
docker环境26.1.4

1.linux

2.docker

一、环境准备

1. 安装 Docker 环境

首先,确保你的系统已经安装了 Docker 环境。可参考:Centos7实战docker安装配置。安装完成后,确保 Docker 可以正常运行。

2.拉取官方镜像

1.如图所示为oracle官网的数据库镜像地址

2.根据大版本选择自己所需要的镜像,如作者选择的为express版本。进入之后页面拉到底,选择具体的版本号,作者选择的为21.3.0.0。此处需要注意,部分镜像的获取需要有特定权限,如企业版本(enterprise)

其中

docker pull container-registry.oracle.com/database/express:21.3.0-xe

即为在docker中可以拉取镜像的命令,

3.在docker中执行此命令,拉取官方镜像,等待执行完成,完成后会得到一个11.4G大小的镜像文件

4.对应镜像提供了详细的配置参数以及相关参数配置方法,具体可参考官网,不同版本可使用的参数不同,完整的参数解释可参考下一章节中的

参数解释

3.查看镜像

docker images

4.重命名镜像

docker tag [原镜像名称]:[原镜像标签] [新镜像名称]:[新镜像标签] 

通过重命名镜像名称,设置成自己所需要的镜像名。

  • container-registry.oracle.com/database/express:为原镜像名称。
  • oracle21:为自定义镜像名称。
  • 21.3.0-xe:为标签信息。
docker tag container-registry.oracle.com/database/express:21.3.0-xe oracle21:21.3.0-xe

修改完成之后会有2个相同镜像ID的问题,是因为同一个镜像有2个不同的名称,可以通过删除其他未使用的镜像名称,保留自己需要的镜像。

5.删除镜像

docker rmi [镜像名称]:[标签]

二、oracle安装

1.创建数据存放文件夹

用于存放oracle数据文件

mkdir -p /home/data/oracle/oradata

2.文件授权

为了确保oracle数据有权限写入文件,此处需要对文件进行授权

chmod 777 /home/data/oracle/oradata

3.启动容器

docker run -d \
--name oracle21 \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_PWD=123456 \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v /home/data/oracle/oradata:/opt/oracle/oradata \
oracle21:21.3.0-xe

容器正常创建后会返回容器ID

4.参数解释

  • docker run: 这是 Docker 命令的一部分,用于在容器中运行一个镜像。
  • -d: 这个选项告诉 Docker 在后台运行容器,即“detached”模式。
  • -p 1521:1521 -p 5500:5500: 这两个选项指定了端口映射。它们将容器内部的端口 1521 映射到主机的端口 1521,以及将容器内部的端口 5500 映射到主机的端口 5500。Oracle 数据库通常使用 1521 端口进行连接,而 5500 端口用于 Oracle Enterprise Manager Express。前一个为主机的端口,后一个为容器内部端口。

-e:这些选项用于设置容器中 Oracle 数据库的一些环境变量

  • -e ORACLE_SID=ORCLCDB:设置 Oracle 的系统标识符(SID),这里设置为ORCLCDB。
  • -e ORACLE_PDB=ORCLPDB:设置 Oracle 的 Pluggable Database 名称,这里设置为 ORCLPDB1。
  • -e ORACLE_PWD=123456:设置 Oracle 的管理员密码,这里设置为 123456。此处设置的密码为:SYS, SYSTEM and PDBADMIN用户
  • -e ORACLE_EDITION=standard:设置 Oracle 的版本/版本类型,这里设置为标准版,若想使用分表操作则需要设置为企业版(enterprise)
  • -e ORACLE_CHARACTERSET=AL32UTF8:设置 Oracle 数据库的字符集,这里设置为 AL32UTF8,即 Unicode 字符集。
  • -v /home/data/oracle/oradata:/opt/oracle/oradata: 这个选项用于挂载主机文件系统的目录到容器中。在这个例子中,它将主机上的 /home/data/oracle/oradata 目录挂载到容器中的 /opt/oracle/oradata 目录。此处:/opt/oracle/oradata不可更改,这样做是为了将 Oracle 数据库的数据文件存储到主机文件系统中,以便数据持久化,即使容器被删除也不会丢失数据。如果是window则修改自己的window目录 C:\docker\volumes\oracle21.3.0.0\oradata:/opt/oracle/oradata
  • --privileged=true:赋予容器全部的特权,通常用于一些需要较高权限的操作。
  • --name oracle: 这个选项用于为容器指定一个名称,这里命名为 oracle。
  • oracle21:21.3.0-xe: 这是要运行的 Oracle镜像的名称及其标签

5.查看容器启动日志

docker logs -f 容器名称

此处可以使用一下命令查看日志信息

docker logs -f oracle21

完整的启动日志如下:

Specify a password to be used for database accounts. Oracle recommendsthat the password entered should be at least 8 characters in length,contain at least 1 uppercase character, 1 lower case character and 1digit [0-9]. Note that the same password will be used for SYS, SYSTEMand PDBADMIN accounts: Confirm the password: Configuring OracleListener. Listener configuration succeeded. Configuring OracleDatabase XE. Enter SYS user password:***** Enter SYSTEM user password:****** Enter PDBADMIN User Password:********** Prepare for db operation 7% complete Copying database files 29% complete Creating and starting Oracle instance 30% complete 33%complete 37% complete 40% complete 43% complete Completing DatabaseCreation 47% complete 50% complete Creating Pluggable Databases 54%complete 71% complete Executing Post Configuration Actions 93%complete Running Custom Scripts 100% complete Database creationcomplete. For details check the logfiles at:/opt/oracle/cfgtoollogs/dbca/XE. Database Information: Global DatabaseName:XE System Identifier(SID):XE Look at the log file“/opt/oracle/cfgtoollogs/dbca/XE/XE.log” for further details.

Connect to Oracle Database using one of the connect strings:Pluggable database: 237e7e26b469/XEPDB1Multitenant container database: 237e7e26b469 Use https://localhost:5500/em to access Oracle Enterprise Manager forOracle Database XE

SQL*Plus: Release 21.0.0.0.0 - Production on Fri Apr 11 14:05:13 2025Version 21.3.0.0.0

Copyright © 1982, 2021, Oracle. All rights reserved.

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 -Production Version 21.3.0.0.0

SQL> System altered.

SQL> System altered.

SQL> Pluggable database altered.

SQL> PL/SQL procedure successfully completed.

SQL> SQL> Session altered.

SQL> User created.

SQL> Grant succeeded.

SQL> Grant succeeded.

SQL> Grant succeeded.

SQL> User altered.

SQL> SQL> Disconnected from Oracle Database 21c Express EditionRelease 21.0.0.0.0 - Production Version 21.3.0.0.0

SQL*Plus: Release 21.0.0.0.0 - Production on Fri Apr 11 14:05:13 2025Version 21.3.0.0.0

Copyright © 1982, 2021, Oracle. All rights reserved.

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 -Production Version 21.3.0.0.0

SQL> PL/SQL procedure successfully completed.

SQL> Disconnected from Oracle Database 21c Express Edition Release21.0.0.0.0 - Production Version 21.3.0.0.0 The Oracle base remains unchanged with value /opt/oracle The Oracle base remains unchangedwith value /opt/oracle######################### DATABASE IS READY TO USE!######################### The following output is now a tail of the alert.log: XEPDB1(3):Completed: ALTER DATABASE DEFAULT TABLESPACE“USERS” 2025-04-11T14:05:12.033406+00:00 ALTER PLUGGABLE DATABASEXEPDB1 SAVE STATE Completed: ALTER PLUGGABLE DATABASE XEPDB1 SAVESTATE 2025-04-11T14:05:13.180049+00:00 ALTER SYSTEM SETcontrol_files=‘/opt/oracle/oradata/XE/control01.ctl’ SCOPE=SPFILE;2025-04-11T14:05:13.294964+00:00 ALTER SYSTEM SET local_listener=‘’SCOPE=BOTH; ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE Completed:ALTER PLUGGABLE DATABASE XEPDB1 SAVE STATE

如果输出:DATABASE IS READY TO USE!,则表示oracle启动成功。可以通过客户端登录。

注意本地机器的防火墙对端口的开放

6.查看的容器

查看运行中的容器

docker ps

查看所有的容器

docker ps -a

三、配置 Oracle 环境变量

1.进入容器内部

创建并启动容器后,你可以进入容器内部进行配置

docker exec -it 容器名称 /bin/bash

此命令会让你进入 Oracle 容器的 Bash 环境。

docker exec -it oracle21 /bin/bash

后续所有的配置均在容器内部,请勿退出容器,否则配置无法生效

2.配置SID

1.查看现有SID的开启状态

cat /etc/oratab

此处表示,现有的SID名称为XE,开启状态为Y(已启用),若此处为N,则需要先修改为Y,以下为修改SID的过程

2.登录oracle

sqlplus / as sysdba

3.关闭数据库

修改前需要先关闭数据库

#关闭数据库
shutdown immediate;
exit;

4.修改SID开启状态

vim /etc/oratab

将XE:/opt/oracle/product/21c/dbhomeXE:N 修改为XE:/opt/oracle/product/21c/dbhomeXE:Y

此处可能会提示vim不是有效的命令,需要先装vim,参考centos安装vim命令即可

5.重新登录数据库并开启数据库

#登录数据库
sqlplus / as sysdba

#开启数据库
startup

6.安装vim

yum install vim

若提示无权限,则需要先切换root账户

3.修改账号密码

1.登录数据库

sqlplus / as sysdba

2.修改指定账号密码

#将system账号的密码修改为itcast
alter user system identified by itcast;

#刷新
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
#退出
exit

3.登录数据库

通过数据库工具,配置链接参数进行登录

4.时区配置

默认时区非东8时区,会导致数据库时间异常

  • 这是一个定时任务,每天定时凌晨2点执行。但是日志记录的时间与真实时间不一致,相差8个小时。
  • 这就会导致定时任务中如果涉及到系统时间的情况,那么其生成、处理的数据时间都将是错误的系统时间

1.检查容器系统时间

在容器的Bash 环境下检查容器系统时间是否异常

date -R

进入容器后,采用替换时区文件的方法。进入/usr/share/zoneinfo/Asia目录下,查看是否有需要的时区文件。

如果有,可以直接执行cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime命令,替换系统时区文件,再执行date -R查看时间是否正常。

如果没有,而且对应的文件夹也没有的话,需要先创建对应的文件夹,mkdir -p/usr/share/zoneinfo/Asia。创建好后,使用exit命令先退出回到宿主机,从宿主机中进入/usr/share/zoneinfo/Asia目录下找到对应的时区文件。

执行docker cp/usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia 命令,将宿主机中的时区文件拷贝得到docker容器中。再以root权限进入容器替换系统时区文件

bash-4.2# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  #修改容器的系统时区文件
bash-4.2# date -R   #检查时间是否正常
Sat, 12 Apr 2025 15:57:57 +0800

bash-4.2# mkdir -p/usr/share/zoneinfo/Asia  #如果没有对应的时区文件夹,就创建
bash-4.2# exit
exit
[root@localhost ~]# docker cp/usr/share/zoneinfo/Asia/Shanghai oracle21:/usr/share/zoneinfo/Asia  #将宿主机的时区文件copy到容器对应的时区文件夹中
[root@localhost ~]# docker exec -it -u root test /bin/bash  #再次进入容器
bash-4.2# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime   #修改容器的系统时区文件
bash-4.2# date -R   #检查时间是否正常
Sat, 12 Apr 2025 15:57:57 +0800

若提示无权限,则通过su root先切换到root用户

2.检查时区

-- 查询数据库时区
select dbtimezone from dual;

-- 查询数据库时间
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;

第一句是检查数据库的时区。如果是+08:00一般都是正确的东8时区。

第二句是检查系统时间,根据查询出来的结果时间与实际时间对比,如果是一致的就是对的,不用再看下面的了。

3.修改数据库时区

1.修改时区为正确的东8时区。

alter database set time_zone = '+8:00';

2.重启数据库让配置生效

##关闭数据库
shutdown immediate;

##启动数据库
startup

完成上面的步骤 Oracle数据库的时间问题也就解决了,可以在进入数据库,查询系统时间检查一下。

四、创建并配置用户

在 Oracle 多租户架构中(从 Oracle 12c 开始),用户分为

普通用户(Common User)

  • 1.用户的名称必须以 C## 开头,在CDB中创建
  • 2.适用于管理员用户,用户管理CDB下的多个PDB

本地用户(Local User)

  • 1.用户的名称无需以 C## 开头,在PDB中创建
  • 2.更适合应用开发和租户管理
  • 3.我们平时开发时用的多是本地用户

数据库刚被安装后,并没有本地用户,我们需要通过system用户登录Oracle之后,创建本地用户。

1.进入docker内部并且登录oracle

# 进入 Oracle 容器的 Bash 环境,oracle21 为容器名称
docker exec -it oracle21 /bin/bash

#登录数据库
sqlplus / as sysdba

2、切换session为PDB

在包含 CDB(容器数据库)和 PDB(可插拔数据库)的环境中,显示会话所连接的容器的名称。

容器可以是根容器(CDB R O O T )、种子数据库( P D B ROOT)、种子数据库(PDB ROOT)、种子数据库(PDBSEED)或某个具体的 PDB。

1.查看数据库中所有的PDB

##方式1
SELECT PDB_ID, PDB_NAME, STATUS FROM DBA_PDBS;

##方式1
SELECT NAME FROM V$PDBS;

2.查看当前容器

SHOW CON_NAME;

3.切换当前用户的session为PDB

-- 切换session到根容器
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;

Session altered.

-- 切换session到PDB
SQL> ALTER SESSION SET CONTAINER = XEPDB1;

Session altered.

-- 查看当前容器名称
SQL> SHOW CON_NAME;

CON_NAME
------------------------------
XEPDB1
SQL>

3、创建用户

create user 用户名 identified by 密码;

create user test_user identified by test_user123;

4、账户授权

grant connect,resource,create type,create view,recovery_catalog_owner to 用户名;

注意:禁止使用:imp_full_database权限

grant connect,resource,create type,create view,recovery_catalog_owner to test_user;

5、账户登录

此处需要注意的是,必须使用指定容器名进行登录,否则登录不成功

6、创建表并查看

CREATE TABLE TEST_USER.PERSON_TABLE (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    age NUMBER,
    email VARCHAR2(100),
    created_date DATE
) ;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker自定义镜像的实现步骤(SpringBoot程序为例)

    Docker自定义镜像的实现步骤(SpringBoot程序为例)

    Docker自定义镜像指的是用户根据自己的需求和规范,使用Dockerfile或其他方式创建的一个Docker镜像,本文给大家介绍了Docker自定义镜像的实现步骤,文中通过图文讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • ubuntu系统使用docker gitlab 磁盘空间满的问题及解决

    ubuntu系统使用docker gitlab 磁盘空间满的问题及解决

    这篇文章主要介绍了ubuntu系统使用docker gitlab 磁盘空间满的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Docker部署php运行环境(php-fpm+nginx)

    Docker部署php运行环境(php-fpm+nginx)

    Docker 是一种流行的容器化平台,可以帮助开发人员快速创建、部署和管理容器化应用程序,本文将介绍如何使用 Docker 搭建 PHP 开发环境服务器,让您能够轻松地开始 PHP 开发工作,感兴趣的可以了解一下
    2023-11-11
  • 浅析docker-compose部署mysql无法访问的问题

    浅析docker-compose部署mysql无法访问的问题

    Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器。接下来通过本文给大家分享docker-compose部署mysql无法访问的问题,需要的朋友参考下吧
    2018-10-10
  • docker 手动构建新镜像的方法

    docker 手动构建新镜像的方法

    这篇文章主要介绍了docker 手动构建新镜像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • docker镜像导入的实现方法

    docker镜像导入的实现方法

    如果服务器网络不好或者pull不下来镜像,只能进行导入,本文主要介绍了docker镜像导入的实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • docker利用单个镜像映射到多个端口操作

    docker利用单个镜像映射到多个端口操作

    这篇文章主要介绍了docker利用单个镜像映射到多个端口操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 使用Docker Compose 实现nginx负载均衡的方法步骤

    使用Docker Compose 实现nginx负载均衡的方法步骤

    这篇文章主要介绍了使用Docker Compose 实现nginx负载均衡的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Docker容器的导入导出操作教程

    Docker容器的导入导出操作教程

    这篇文章主要给大家介绍了关于Docker容器的导入导出操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Docker具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 如何让docker中的mysql启动时自动执行sql语句

    如何让docker中的mysql启动时自动执行sql语句

    这篇文章主要介绍了让docker中的mysql启动时自动执行sql的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09

最新评论