docker實戰(zhàn)部署并配置oracle21方式(官方鏡像)
基礎(chǔ)環(huán)境信息
| 名稱 | 詳細(xì)信息 |
|---|---|
| linux環(huán)境 | CentOS Linux release 7.9.2009 (Core) |
| 內(nèi)核版本 | 3.10.0-1160.el7.x86_64 |
| docker環(huán)境 | 26.1.4 |
1.linux

2.docker

一、環(huán)境準(zhǔn)備
1. 安裝 Docker 環(huán)境
首先,確保你的系統(tǒng)已經(jīng)安裝了 Docker 環(huán)境??蓞⒖迹篊entos7實戰(zhàn)docker安裝配置。安裝完成后,確保 Docker 可以正常運(yùn)行。

2.拉取官方鏡像
1.如圖所示為oracle官網(wǎng)的數(shù)據(jù)庫鏡像地址

2.根據(jù)大版本選擇自己所需要的鏡像,如作者選擇的為express版本。進(jìn)入之后頁面拉到底,選擇具體的版本號,作者選擇的為21.3.0.0。此處需要注意,部分鏡像的獲取需要有特定權(quán)限,如企業(yè)版本(enterprise)

其中
docker pull container-registry.oracle.com/database/express:21.3.0-xe
即為在docker中可以拉取鏡像的命令,
3.在docker中執(zhí)行此命令,拉取官方鏡像,等待執(zhí)行完成,完成后會得到一個11.4G大小的鏡像文件
4.對應(yīng)鏡像提供了詳細(xì)的配置參數(shù)以及相關(guān)參數(shù)配置方法,具體可參考官網(wǎng),不同版本可使用的參數(shù)不同,完整的參數(shù)解釋可參考下一章節(jié)中的
參數(shù)解釋

3.查看鏡像
docker images

4.重命名鏡像
docker tag [原鏡像名稱]:[原鏡像標(biāo)簽] [新鏡像名稱]:[新鏡像標(biāo)簽]
通過重命名鏡像名稱,設(shè)置成自己所需要的鏡像名。
- container-registry.oracle.com/database/express:為原鏡像名稱。
- oracle21:為自定義鏡像名稱。
- 21.3.0-xe:為標(biāo)簽信息。
docker tag container-registry.oracle.com/database/express:21.3.0-xe oracle21:21.3.0-xe

修改完成之后會有2個相同鏡像ID的問題,是因為同一個鏡像有2個不同的名稱,可以通過刪除其他未使用的鏡像名稱,保留自己需要的鏡像。
5.刪除鏡像
docker rmi [鏡像名稱]:[標(biāo)簽]

二、oracle安裝
1.創(chuàng)建數(shù)據(jù)存放文件夾
用于存放oracle數(shù)據(jù)文件
mkdir -p /home/data/oracle/oradata
2.文件授權(quán)
為了確保oracle數(shù)據(jù)有權(quán)限寫入文件,此處需要對文件進(jìn)行授權(quán)
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
容器正常創(chuàng)建后會返回容器ID

4.參數(shù)解釋
docker run: 這是 Docker 命令的一部分,用于在容器中運(yùn)行一個鏡像。-d: 這個選項告訴 Docker 在后臺運(yùn)行容器,即“detached”模式。-p 1521:1521 -p 5500:5500: 這兩個選項指定了端口映射。它們將容器內(nèi)部的端口 1521 映射到主機(jī)的端口 1521,以及將容器內(nèi)部的端口 5500 映射到主機(jī)的端口 5500。Oracle 數(shù)據(jù)庫通常使用 1521 端口進(jìn)行連接,而 5500 端口用于 Oracle Enterprise Manager Express。前一個為主機(jī)的端口,后一個為容器內(nèi)部端口。
-e:這些選項用于設(shè)置容器中 Oracle 數(shù)據(jù)庫的一些環(huán)境變量
-e ORACLE_SID=ORCLCDB:設(shè)置 Oracle 的系統(tǒng)標(biāo)識符(SID),這里設(shè)置為ORCLCDB。-e ORACLE_PDB=ORCLPDB:設(shè)置 Oracle 的 Pluggable Database 名稱,這里設(shè)置為 ORCLPDB1。-e ORACLE_PWD=123456:設(shè)置 Oracle 的管理員密碼,這里設(shè)置為 123456。此處設(shè)置的密碼為:SYS, SYSTEM and PDBADMIN用戶-e ORACLE_EDITION=standard:設(shè)置 Oracle 的版本/版本類型,這里設(shè)置為標(biāo)準(zhǔn)版,若想使用分表操作則需要設(shè)置為企業(yè)版(enterprise)-e ORACLE_CHARACTERSET=AL32UTF8:設(shè)置 Oracle 數(shù)據(jù)庫的字符集,這里設(shè)置為 AL32UTF8,即 Unicode 字符集。-v /home/data/oracle/oradata:/opt/oracle/oradata: 這個選項用于掛載主機(jī)文件系統(tǒng)的目錄到容器中。在這個例子中,它將主機(jī)上的/home/data/oracle/oradata目錄掛載到容器中的/opt/oracle/oradata目錄。此處:/opt/oracle/oradata不可更改,這樣做是為了將 Oracle 數(shù)據(jù)庫的數(shù)據(jù)文件存儲到主機(jī)文件系統(tǒng)中,以便數(shù)據(jù)持久化,即使容器被刪除也不會丟失數(shù)據(jù)。如果是window則修改自己的window目錄C:\docker\volumes\oracle21.3.0.0\oradata:/opt/oracle/oradata--privileged=true:賦予容器全部的特權(quán),通常用于一些需要較高權(quán)限的操作。--name oracle: 這個選項用于為容器指定一個名稱,這里命名為 oracle。oracle21:21.3.0-xe: 這是要運(yùn)行的 Oracle鏡像的名稱及其標(biāo)簽
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啟動成功。可以通過客戶端登錄。
注意本地機(jī)器的防火墻對端口的開放
6.查看的容器
查看運(yùn)行中的容器
docker ps

查看所有的容器
docker ps -a

三、配置 Oracle 環(huán)境變量
1.進(jìn)入容器內(nèi)部
創(chuàng)建并啟動容器后,你可以進(jìn)入容器內(nèi)部進(jìn)行配置
docker exec -it 容器名稱 /bin/bash
此命令會讓你進(jìn)入 Oracle 容器的 Bash 環(huán)境。
docker exec -it oracle21 /bin/bash

后續(xù)所有的配置均在容器內(nèi)部,請勿退出容器,否則配置無法生效
2.配置SID
1.查看現(xiàn)有SID的開啟狀態(tài)
cat /etc/oratab
此處表示,現(xiàn)有的SID名稱為XE,開啟狀態(tài)為Y(已啟用),若此處為N,則需要先修改為Y,以下為修改SID的過程

2.登錄oracle
sqlplus / as sysdba

3.關(guān)閉數(shù)據(jù)庫
修改前需要先關(guān)閉數(shù)據(jù)庫
#關(guān)閉數(shù)據(jù)庫 shutdown immediate; exit;
4.修改SID開啟狀態(tài)
vim /etc/oratab
將XE:/opt/oracle/product/21c/dbhomeXE:N 修改為XE:/opt/oracle/product/21c/dbhomeXE:Y
此處可能會提示vim不是有效的命令,需要先裝vim,參考centos安裝vim命令即可
5.重新登錄數(shù)據(jù)庫并開啟數(shù)據(jù)庫
#登錄數(shù)據(jù)庫 sqlplus / as sysdba #開啟數(shù)據(jù)庫 startup
6.安裝vim
yum install vim
若提示無權(quán)限,則需要先切換root賬戶

3.修改賬號密碼
1.登錄數(shù)據(jù)庫
sqlplus / as sysdba
2.修改指定賬號密碼
#將system賬號的密碼修改為itcast alter user system identified by itcast; #刷新 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; #退出 exit

3.登錄數(shù)據(jù)庫
通過數(shù)據(jù)庫工具,配置鏈接參數(shù)進(jìn)行登錄

4.時區(qū)配置
默認(rèn)時區(qū)非東8時區(qū),會導(dǎo)致數(shù)據(jù)庫時間異常

- 這是一個定時任務(wù),每天定時凌晨2點(diǎn)執(zhí)行。但是日志記錄的時間與真實時間不一致,相差8個小時。
- 這就會導(dǎo)致定時任務(wù)中如果涉及到系統(tǒng)時間的情況,那么其生成、處理的數(shù)據(jù)時間都將是錯誤的系統(tǒng)時間
1.檢查容器系統(tǒng)時間
在容器的Bash 環(huán)境下檢查容器系統(tǒng)時間是否異常
date -R

進(jìn)入容器后,采用替換時區(qū)文件的方法。進(jìn)入/usr/share/zoneinfo/Asia目錄下,查看是否有需要的時區(qū)文件。
如果有,可以直接執(zhí)行cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime命令,替換系統(tǒng)時區(qū)文件,再執(zhí)行date -R查看時間是否正常。
如果沒有,而且對應(yīng)的文件夾也沒有的話,需要先創(chuàng)建對應(yīng)的文件夾,mkdir -p/usr/share/zoneinfo/Asia。創(chuàng)建好后,使用exit命令先退出回到宿主機(jī),從宿主機(jī)中進(jìn)入/usr/share/zoneinfo/Asia目錄下找到對應(yīng)的時區(qū)文件。
執(zhí)行docker cp/usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia 命令,將宿主機(jī)中的時區(qū)文件拷貝得到docker容器中。再以root權(quán)限進(jìn)入容器替換系統(tǒng)時區(qū)文件
bash-4.2# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改容器的系統(tǒng)時區(qū)文件 bash-4.2# date -R #檢查時間是否正常 Sat, 12 Apr 2025 15:57:57 +0800 bash-4.2# mkdir -p/usr/share/zoneinfo/Asia #如果沒有對應(yīng)的時區(qū)文件夾,就創(chuàng)建 bash-4.2# exit exit [root@localhost ~]# docker cp/usr/share/zoneinfo/Asia/Shanghai oracle21:/usr/share/zoneinfo/Asia #將宿主機(jī)的時區(qū)文件copy到容器對應(yīng)的時區(qū)文件夾中 [root@localhost ~]# docker exec -it -u root test /bin/bash #再次進(jìn)入容器 bash-4.2# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改容器的系統(tǒng)時區(qū)文件 bash-4.2# date -R #檢查時間是否正常 Sat, 12 Apr 2025 15:57:57 +0800
若提示無權(quán)限,則通過su root先切換到root用戶
2.檢查時區(qū)
-- 查詢數(shù)據(jù)庫時區(qū) select dbtimezone from dual; -- 查詢數(shù)據(jù)庫時間 select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
第一句是檢查數(shù)據(jù)庫的時區(qū)。如果是+08:00一般都是正確的東8時區(qū)。
第二句是檢查系統(tǒng)時間,根據(jù)查詢出來的結(jié)果時間與實際時間對比,如果是一致的就是對的,不用再看下面的了。

3.修改數(shù)據(jù)庫時區(qū)
1.修改時區(qū)為正確的東8時區(qū)。
alter database set time_zone = '+8:00';

2.重啟數(shù)據(jù)庫讓配置生效
##關(guān)閉數(shù)據(jù)庫 shutdown immediate; ##啟動數(shù)據(jù)庫 startup

完成上面的步驟 Oracle數(shù)據(jù)庫的時間問題也就解決了,可以在進(jìn)入數(shù)據(jù)庫,查詢系統(tǒng)時間檢查一下。
四、創(chuàng)建并配置用戶
在 Oracle 多租戶架構(gòu)中(從 Oracle 12c 開始),用戶分為
普通用戶(Common User)
- 1.用戶的名稱必須以 C## 開頭,在CDB中創(chuàng)建
- 2.適用于管理員用戶,用戶管理CDB下的多個PDB
本地用戶(Local User)
- 1.用戶的名稱無需以 C## 開頭,在PDB中創(chuàng)建
- 2.更適合應(yīng)用開發(fā)和租戶管理
- 3.我們平時開發(fā)時用的多是本地用戶
數(shù)據(jù)庫剛被安裝后,并沒有本地用戶,我們需要通過system用戶登錄Oracle之后,創(chuàng)建本地用戶。
1.進(jìn)入docker內(nèi)部并且登錄oracle
# 進(jìn)入 Oracle 容器的 Bash 環(huán)境,oracle21 為容器名稱 docker exec -it oracle21 /bin/bash #登錄數(shù)據(jù)庫 sqlplus / as sysdba
2、切換session為PDB
在包含 CDB(容器數(shù)據(jù)庫)和 PDB(可插拔數(shù)據(jù)庫)的環(huán)境中,顯示會話所連接的容器的名稱。
容器可以是根容器(CDB R O O T )、種子數(shù)據(jù)庫( P D B ROOT)、種子數(shù)據(jù)庫(PDB ROOT)、種子數(shù)據(jù)庫(PDBSEED)或某個具體的 PDB。
1.查看數(shù)據(jù)庫中所有的PDB
##方式1 SELECT PDB_ID, PDB_NAME, STATUS FROM DBA_PDBS; ##方式1 SELECT NAME FROM V$PDBS;


2.查看當(dāng)前容器
SHOW CON_NAME;

3.切換當(dāng)前用戶的session為PDB
-- 切換session到根容器 SQL> ALTER SESSION SET CONTAINER = CDB$ROOT; Session altered. -- 切換session到PDB SQL> ALTER SESSION SET CONTAINER = XEPDB1; Session altered. -- 查看當(dāng)前容器名稱 SQL> SHOW CON_NAME; CON_NAME ------------------------------ XEPDB1 SQL>
3、創(chuàng)建用戶
create user 用戶名 identified by 密碼;
create user test_user identified by test_user123;

4、賬戶授權(quán)
grant connect,resource,create type,create view,recovery_catalog_owner to 用戶名;
注意:禁止使用:imp_full_database權(quán)限
grant connect,resource,create type,create view,recovery_catalog_owner to test_user;

5、賬戶登錄
此處需要注意的是,必須使用指定容器名進(jìn)行登錄,否則登錄不成功

6、創(chuàng)建表并查看
CREATE TABLE TEST_USER.PERSON_TABLE (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
age NUMBER,
email VARCHAR2(100),
created_date DATE
) ;
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker容器中無法獲取宿主機(jī)hostname的解決方案
這篇文章主要介紹了docker容器中無法獲取宿主機(jī)hostname的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Docker方式啟動tomcat訪問首頁出現(xiàn)404錯誤
這篇文章主要介紹了Docker方式啟動tomcat訪問首頁出現(xiàn)404錯誤。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
如何解決Docker啟動問題docker?is?starting…
這篇文章主要給大家介紹了關(guān)于如何解決Docker啟動問題docker?is?starting…的相關(guān)資料,文中通過圖文將解決的過程介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
使用docker創(chuàng)建和運(yùn)行跨平臺的容器化mssql數(shù)據(jù)庫
這篇文章主要介紹了使用docker創(chuàng)建和運(yùn)行跨平臺的容器化的mssql數(shù)據(jù)庫,本章介紹了在window10專業(yè)版下如何利用docker創(chuàng)建mssql數(shù)據(jù)庫,需要的朋友可以參考下2022-05-05
詳解利用Dockerfile構(gòu)建mysql鏡像并實現(xiàn)數(shù)據(jù)的初始化及權(quán)限設(shè)置
本篇文章主要介紹了詳解利用Dockerfile構(gòu)建mysql鏡像并實現(xiàn)數(shù)據(jù)的初始化及權(quán)限設(shè)置 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
docker服務(wù)關(guān)停的實現(xiàn)步驟
在我看來所謂的優(yōu)雅關(guān)閉,就是在系統(tǒng)關(guān)閉時,預(yù)留一些時間,讓你有機(jī)會來善后一些事情,本文就來介紹一下docker服務(wù)如何正確關(guān)停,感興趣的可以了解一下2023-10-10

