Docker 安装 Oracle 12C

镜像

bash 复制代码
https://docker.aityp.com/image/docker.io/truevoly/oracle-12c:latest
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/truevoly/oracle-12c:latest
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/truevoly/oracle-12c:latest  docker.io/truevoly/oracle-12c:latest
docker images

创建并启动容器

bash 复制代码
# 容器内端口默认1521,且通过 -p 参数修改不成功,所以只能修改外部的端口
docker run -itd --name oracle12c --restart=always -p 1522:1521 -e ORACLE_PWD=oracle -v /home/oracle/app/oracle12c/oradata:/home/oracle/app/oracle12c/oradata docker.io/truevoly/oracle-12c:latest

查看日志

bash 复制代码
docker logs -f --tail 100 oracle12c
bash 复制代码
Database not initialized. Initializing database.
Starting tnslsnr
Copying database files
1% complete
3% complete
11% complete
18% complete
26% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
50% complete
55% complete
56% complete
60% complete
62% complete
Completing Database Creation
66% complete
70% complete
73% complete
85% complete
96% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/xe/xe.log" for further details.
Configuring Apex console
Database initialized. Please visit http://#containeer:8080/em http://#containeer:8080/apex for extra configuration if needed
Starting web management console

PL/SQL procedure successfully completed.

Starting import from '/docker-entrypoint-initdb.d':
ls: cannot access /docker-entrypoint-initdb.d/*: No such file or directory
Import finished

Database ready to use. Enjoy! ;)

登录到容器内

bash 复制代码
docker exec -it oracle12c bash

配置环境变量

bash 复制代码
vi /etc/profile
export ORACLE_HOME=/u01/app/oracle-product/12.1.0/xe
export PATH=$ORACLE_HOME/bin:$PATH
source /etc/profile

vi /home/oracle/.bashrc
export ORACLE_HOME=/u01/app/oracle-product/12.1.0/xe
export PATH=$ORACLE_HOME/bin:$PATH
source /home/oracle/.bashrc

登录

bash 复制代码
# 必须要切到 oracle 用户
su oracle
sqlplus / as sysdba

命令解释:

  • sqlplus / as sysdba : 使用操作系统认证以 SYSDBA 特权用户身份连接到 Oracle 数据库的命令
    • sqlplus:Oracle 提供的命令行工具,用于与数据库交互(SQL*Plus 的缩写)。
    • /:表示使用操作系统认证(OS Authentication),无需显式输入用户名和密码。
    • as sysdba:以 SYSDBA 特权角色连接,拥有最高权限(如启动 / 关闭数据库、创建用户等)。
  • sqlplus sys/oracle as sysdba : 使用用户名密码以 SYSDBA 特权身份连接到 Oracle 数据库 (不过这里用户名密码不管写什么都能连接)
    • sys/oracle:用户名和密码
    • sys:Oracle 数据库的超级管理员用户(拥有最高权限)
    • oracle:默认密码
  • sqlplus /nolog : 启动 SQL*Plus 工具但不立即连接到数据库的命令
  • CONNECT sys/oracle AS SYSDBA :SQL*Plus 中使用用户名密码以 SYSDBA 特权身份连接到 Oracle 数据库的命令。(同样的这里用户名密码不管写什么都能连接)
    • CONNECT:SQL*Plus 内置命令,用于建立或切换数据库连接(可简写为 CONN 或 LOGON)。
  • conn / as sysdba 是 Oracle SQL*Plus 中使用操作系统认证以 SYSDBA 特权身份连接数据库的命令

登录异常

bash 复制代码
sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Tue Jun 10 11:32:04 2025

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied

解决:以oracle用户登录。

启动数据库

sql 复制代码
SQL> startup
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2924928 bytes
Variable Size            1006636672 bytes
Database Buffers          587202560 bytes
Redo Buffers               13848576 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode

解决 cannot mount database in EXCLUSIVE mode

首先关闭数据库

bash 复制代码
SHUTDOWN IMMEDIATE;
方法1
bash 复制代码
su oracle
# 查找共享内存和信号量:
ipcs -m
ipcs -s
# 清理共享内存和信号量:
ipcrm -m <shmid>
ipcrm -s <semid>

参考:https://blog.csdn.net/qq_47502724/article/details/144828940

方法2

和我在之前写的Centos7 安装oracle11中用的方法一样: 通过 fuser -k 释放占用 lk<SID> 的进程。一般系统自带 fuser 命令,但是我们装的oracle 容器内没有自带,所以需要先安装对应的命令。

bash 复制代码
sudo apt update
sudo apt install psmisc

需要先联网 update ,再安装 psmisc,联网需要修改 /etc/resolv.conf ,添加 DNS(前提是宿主机也能联网):

bash 复制代码
nameserver 223.5.5.5
nameserver 10.100.1.12
nameserver 114.114.114.114

在 Docker 容器中使用 vi 编辑文件时, 可能遇到一些体验问题(如方向键乱码、退格键失效等),可通过安装最小化的 vim-tiny

bash 复制代码
apt-get install -y vim-tiny
ln -s /usr/bin/vim.tiny /usr/bin/vim  # 替换vim为vim-tiny

lk<SID> 在 $ORACLE_HOME/dbs

bash 复制代码
su oracle
cd $ORACLE_HOME/dbs
fuser -u lkXE
fuser -k lkXE
fuser -u lkXE

查询数据库状态

sql 复制代码
SELECT status FROM v$instance;

STATUS
------------
OPEN

返回值说明:

  • STARTED:实例已启动,但未装载数据库。
  • MOUNTED:实例已装载数据库(ALTER DATABASE MOUNT)。
  • OPEN:数据库正常打开,可读写。
  • OPEN READ ONLY:数据库只读模式。

连接验证

  • SID 和 Service Name 均为 XE
  • 用密码密码: sys/oracle 和 system/oracle
    • sys 用户:具有 "SYSDBA" 或者 "SYSOPER" 系统权限,登录EM(企业管理器)也只能用这两个身份,不能用normal(普通用户)身份。SYSDBA是管理 Oracle 实例的,拥有最高的系统权限,可完成数据库的所有管理任务,如创建数据库、删除数据库、数据库日志归档、执行不完全恢复,以及创建其它的SYSOPER和SYSDBA用户等
    • system 用户:SYSTEM用户:默认拥有普通DBA角色权限,能完成除备份恢复、升级之外的大部分数据库管理任务。但只能用normal身份登录EM,除非对它授予了SYSDBA或SYSOPER系统权限。如果SYSTEM用户以AS SYSDBA登录,其结果实际上是作为SYS用户登录的。

修改密码

sql 复制代码
alter user system identified by test123;
alter user sys identified by test123;

删除 Docker 容器

bash 复制代码
docker stop oracle12c
docker rm oracle12c
相关推荐
kura_tsuki10 小时前
[Oracle数据库] Oracle 常用函数
数据库·oracle
__lll_18 小时前
手把手教你用 Docker 部署 Vue 项目(含国内镜像加速 + 踩坑指南)
docker
程思扬1 天前
Nextcloud容器化部署革新:Docker+Cpolar构建高效私有云远程访问新架构
docker·容器·架构
码出财富1 天前
SQL语法大全指南
数据库·mysql·oracle
豆芽脚脚1 天前
docker compose再阿里云上无法使用的问题
阿里云·docker·容器
十行代码九行报错1 天前
Docker基础学习笔记
笔记·学习·docker
听雪楼主.2 天前
Oracle Undo Tablespace 使用率暴涨案例分析
数据库·oracle·架构
Agome992 天前
Docker之自定义jkd镜像上传阿里云
阿里云·docker·容器
无能百分百2 天前
阿里云服务器ECS安装Docker(CentOS 7.x)
docker
天上掉下来个程小白2 天前
Docker-14.项目部署-DockerCompose
运维·docker·微服务·容器