前言
在一个裸机 Linux 上安装 Oracle 步骤很多,且对安装环境有不少要求,一不小心就容易出错。安装过 Oracle 的想必都有一定感触。
在有些场合中我们对 Oralce 没有那么高的要求,比如临时测试、临时运行个项目等单数据库实例场景。这种情况使用 docker 一键启动运行 docker 会特别方便,运行时将数据挂载出来也能在很大程度上保证数据安全问题。
Oracle 官方已经正式发布了应该构建 Oracle 镜像的 dockerfile,目前支持列表如下(引用自官方):
Oracle Database 21c (21.3.0) Enterprise Edition, Standard Edition 2 and Express Edition (XE)
Oracle Database 19c (19.3.0) Enterprise Edition and Standard Edition 2
Oracle Database 18c (18.4.0) Express Edition (XE)
Oracle Database 18c (18.3.0) Enterprise Edition and Standard Edition 2
Oracle Database 12c Release 2 (12.2.0.2) Enterprise Edition and Standard Edition 2
Oracle Database 12c Release 1 (12.1.0.2) Enterprise Edition and Standard Edition 2
Oracle Database 11g Release 2 (11.2.0.2) Express Edition (XE)
Oracle on docker 是非常优秀的体验和测试 Oracle 数据库的方法。
教程
本文以构建 19.3.0 版本的镜像为例,做一下步骤教程:
1、下载官方的 Oracle 构建包
https://www.oracle.com/database/technologies/oracle-database-software-downloads.html
2、下载官方的 dockerfile 构建包
https://github.com/oracle/docker-images
3、构建 docker 镜像
1、下面是我下载好的两个压缩包
2、解压缩 docker-images-main.zip
3、进入 ./docker-images-main/OracleDatabase/SingleInstance/dockerfiles
4、根据需要进入对应的版本目录(本例 19.3.0
)
5、将下载的 Oracle zip 附件拷贝到该目录中
6、构建DOCKER镜像
$ cd ~/docker-images/OracleDatabase/SingleInstance/dockerfiles
$ ./buildContainerImage.sh -v 19.3.0 -e
慢慢等待执行……
完成以后使用 docker images
可以看到已经有成功构建的 Oracle 19c
镜像了,同时构建了 Oracle Linux 7
的基础镜像,如下:
[root@localhost dockerfiles]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
oracle/database 19.3.0-ee b4d8488865d1 About a minute ago 6.54GB
oraclelinux 7-slim 4133e87bc7fa 5 weeks ago 132MB
4、运行 Oracle 容器
1、新创建一个 oracle 用户,这初始属于 oinstall 组,且同时让他也属于 dba 组
[root@harbor ~]# groupadd oinstall
[root@harbor ~]# groupadd dba
[root@harbor ~]# useradd oracle -g oinstall -G dba
2、切换到 oracle 用户,然后创建数据目录
su - oracle
mkdir -p ~/oradata/oracle19c
3、启动 oracle 容器
docker run -itd --name oracle19c \
-p 1521:1521 \
-p 5500:5500 \
-v /home/oracle/oradata/oracle19c:/opt/oracle/oradata \
oracle/database:19.3.0-ee
在第一次运行容器的时候,会自动创建新的数据库,其中使用 -v
参数,是将上面新创建数据目录映射到容器内的 /opt/oracle/oradata
目录中,这样就完成了将数据文件存储在本机文件系统中而非docker容器内,避免删除容器导致数据丢失的问题。
docker run 的更多参数,可以详见官方文档 docker-images/OracleDatabase/SingleInstance/README.md
4、密码
容器启动后,通过 docker logs -f oracle19c
,查看日志,能看到自动生成的SYS等用户的密码,如下示例:
ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: aGHc3GKeSBj=1
如果需要修改数据库用户密码,可以在容器运行之后,通过以下命令修改。
docker exec <container name> ./setPassword.sh <your password>
比如下面的例子,将数据库sys用户密码设置为简单的 oracle123456888
$ docker exec oracle19c ./setPassword.sh oracle123456888
The Oracle base remains unchanged with value /opt/oracle
SQL*Plus: Release 19.0.0.0.0 - Production on Tue May 21 15:30:50 2019
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
User altered.
SQL>
User altered.
SQL>
Session altered.
SQL>
User altered.
SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
一直到出现以下字样,表示数据库已经正常创建并且可以使用了。
######################### DATABASE IS READY TO USE! #########################
5、关于 SID
默认创建的数据库SID是ORCLCDB,创建的PDB是ORCLPDB1,也可以在第一次docker run的时候,用 -e 参数来指定SID和PDB的名字。比如:
docker run -itd --name new-oracle19c \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=ORCL \
-e ORACLE_PDB=MYPDB1 \
-v /home/oracle/oradata/oracle19c:/opt/oracle/oradata \
oracle/database:19.3.0-ee
6、登录验证
直接登录容器使用sqlplus做简单的验证。注意使用之前docker run时候回显的用户密码。
[root@docker dockerfiles]# docker exec -it oracle-19c /bin/bash
[oracle@6a5cd3f9fb6c dbs]$ export ORACLE_SID=ORCLCDB
[oracle@6a5cd3f9fb6c dbs]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 8 02:00:16 2020
Version 19.3.0.0.0
Copyright © 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
2 PDB$SEED READ ONLY NO
3 LEIPDB READ WRITE NO
SQL>
也可以在浏览器中登录Oracle 19c内置的EM Express来通过图形界面 https://localhost:5500/em 访问和监控。
注意是 https,Username:sys,Password:***,Container Name:不用填
最后你可以选择将这个镜像 push 到你的私服中给其他地方使用。
(END)