docker實戰(zhàn)部署并配置oracle21方式(官方鏡像)
基礎環(huán)境信息
| 名稱 | 詳細信息 |
|---|---|
| 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)境準備
1. 安裝 Docker 環(huán)境
首先,確保你的系統(tǒng)已經(jīng)安裝了 Docker 環(huán)境??蓞⒖迹篊entos7實戰(zhàn)docker安裝配置。安裝完成后,確保 Docker 可以正常運行。

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

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

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

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.創(chuàng)建數(shù)據(jù)存放文件夾
用于存放oracle數(shù)據(jù)文件
mkdir -p /home/data/oracle/oradata
2.文件授權
為了確保oracle數(shù)據(jù)有權限寫入文件,此處需要對文件進行授權
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 命令的一部分,用于在容器中運行一個鏡像。-d: 這個選項告訴 Docker 在后臺運行容器,即“detached”模式。-p 1521:1521 -p 5500:5500: 這兩個選項指定了端口映射。它們將容器內(nèi)部的端口 1521 映射到主機的端口 1521,以及將容器內(nèi)部的端口 5500 映射到主機的端口 5500。Oracle 數(shù)據(jù)庫通常使用 1521 端口進行連接,而 5500 端口用于 Oracle Enterprise Manager Express。前一個為主機的端口,后一個為容器內(nèi)部端口。
-e:這些選項用于設置容器中 Oracle 數(shù)據(jù)庫的一些環(huán)境變量
-e ORACLE_SID=ORCLCDB:設置 Oracle 的系統(tǒng)標識符(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 的版本/版本類型,這里設置為標準版,若想使用分表操作則需要設置為企業(yè)版(enterprise)-e ORACLE_CHARACTERSET=AL32UTF8:設置 Oracle 數(shù)據(jù)庫的字符集,這里設置為 AL32UTF8,即 Unicode 字符集。-v /home/data/oracle/oradata:/opt/oracle/oradata: 這個選項用于掛載主機文件系統(tǒng)的目錄到容器中。在這個例子中,它將主機上的/home/data/oracle/oradata目錄掛載到容器中的/opt/oracle/oradata目錄。此處:/opt/oracle/oradata不可更改,這樣做是為了將 Oracle 數(shù)據(jù)庫的數(shù)據(jù)文件存儲到主機文件系統(tǒng)中,以便數(shù)據(jù)持久化,即使容器被刪除也不會丟失數(shù)據(jù)。如果是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 環(huán)境變量
1.進入容器內(nèi)部
創(chuàng)建并啟動容器后,你可以進入容器內(nèi)部進行配置
docker exec -it 容器名稱 /bin/bash
此命令會讓你進入 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.關閉數(shù)據(jù)庫
修改前需要先關閉數(shù)據(jù)庫
#關閉數(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
若提示無權限,則需要先切換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ù)進行登錄

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

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

進入容器后,采用替換時區(qū)文件的方法。進入/usr/share/zoneinfo/Asia目錄下,查看是否有需要的時區(qū)文件。
如果有,可以直接執(zhí)行cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime命令,替換系統(tǒng)時區(qū)文件,再執(zhí)行date -R查看時間是否正常。
如果沒有,而且對應的文件夾也沒有的話,需要先創(chuàng)建對應的文件夾,mkdir -p/usr/share/zoneinfo/Asia。創(chuàng)建好后,使用exit命令先退出回到宿主機,從宿主機中進入/usr/share/zoneinfo/Asia目錄下找到對應的時區(qū)文件。
執(zhí)行docker cp/usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia 命令,將宿主機中的時區(qū)文件拷貝得到docker容器中。再以root權限進入容器替換系統(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 #如果沒有對應的時區(qū)文件夾,就創(chuàng)建 bash-4.2# exit exit [root@localhost ~]# docker cp/usr/share/zoneinfo/Asia/Shanghai oracle21:/usr/share/zoneinfo/Asia #將宿主機的時區(qū)文件copy到容器對應的時區(qū)文件夾中 [root@localhost ~]# docker exec -it -u root test /bin/bash #再次進入容器 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
若提示無權限,則通過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ù)查詢出來的結果時間與實際時間對比,如果是一致的就是對的,不用再看下面的了。

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

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

完成上面的步驟 Oracle數(shù)據(jù)庫的時間問題也就解決了,可以在進入數(shù)據(jù)庫,查詢系統(tǒng)時間檢查一下。
四、創(chuàng)建并配置用戶
在 Oracle 多租戶架構中(從 Oracle 12c 開始),用戶分為
普通用戶(Common User)
- 1.用戶的名稱必須以 C## 開頭,在CDB中創(chuàng)建
- 2.適用于管理員用戶,用戶管理CDB下的多個PDB
本地用戶(Local User)
- 1.用戶的名稱無需以 C## 開頭,在PDB中創(chuàng)建
- 2.更適合應用開發(fā)和租戶管理
- 3.我們平時開發(fā)時用的多是本地用戶
數(shù)據(jù)庫剛被安裝后,并沒有本地用戶,我們需要通過system用戶登錄Oracle之后,創(chuàng)建本地用戶。
1.進入docker內(nèi)部并且登錄oracle
# 進入 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.查看當前容器
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、創(chuàng)建用戶
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、創(chuàng)建表并查看
CREATE TABLE TEST_USER.PERSON_TABLE (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
age NUMBER,
email VARCHAR2(100),
created_date DATE
) ;
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Docker自定義鏡像的實現(xiàn)步驟(SpringBoot程序為例)
Docker自定義鏡像指的是用戶根據(jù)自己的需求和規(guī)范,使用Dockerfile或其他方式創(chuàng)建的一個Docker鏡像,本文給大家介紹了Docker自定義鏡像的實現(xiàn)步驟,文中通過圖文講解的非常詳細,需要的朋友可以參考下2024-06-06
ubuntu系統(tǒng)使用docker gitlab 磁盤空間滿的問題及解決
這篇文章主要介紹了ubuntu系統(tǒng)使用docker gitlab 磁盤空間滿的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
Docker部署php運行環(huán)境(php-fpm+nginx)
Docker?是一種流行的容器化平臺,可以幫助開發(fā)人員快速創(chuàng)建、部署和管理容器化應用程序,本文將介紹如何使用?Docker?搭建?PHP?開發(fā)環(huán)境服務器,讓您能夠輕松地開始?PHP?開發(fā)工作,感興趣的可以了解一下2023-11-11
淺析docker-compose部署mysql無法訪問的問題
Compose 是 Docker 容器進行編排的工具,定義和運行多容器的應用,可以一條命令啟動多個容器,使用Docker Compose不再需要使用shell腳本來啟動容器。接下來通過本文給大家分享docker-compose部署mysql無法訪問的問題,需要的朋友參考下吧2018-10-10
使用Docker Compose 實現(xiàn)nginx負載均衡的方法步驟
這篇文章主要介紹了使用Docker Compose 實現(xiàn)nginx負載均衡的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
如何讓docker中的mysql啟動時自動執(zhí)行sql語句
這篇文章主要介紹了讓docker中的mysql啟動時自動執(zhí)行sql的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09

