在工作中,我们经常会遇到需要快速搭建一个Oracle数据库的场景中,例如,CI/CD(持续集成/持续交付)、DevOps、Demo场景、Training等场景,甚至,有时候只是为了验证某个架构设计是否可行。
对于这些场景,通常我们采用以下方式:
在物理机上安装应用服务器、数据库,导入数据,应用调试;
采用虚拟机的方式,先创建应用和数据库的虚机镜像,导入虚机镜像;
在一个操作系统中,安装多个数据库;
在Oracle 12c的多租户环境中,采用克隆方式创建多个可插拔数据库(PDB)。
除了以上方式外,现在我们还有更简单快捷的方式,实现快速部署Oracle Database :
一种方式是采用Oracle数据库云服务(Database Cloud Service)的方式,一键式部署Oracle数据库;
一种采用Docker容器中运行Oracle Database;
前几天,老余曾经在Oracle的公有云环境中测试过,从云上自己搭建的Docker 私有库中,下载已经上传的Oracle 11g Docker镜像,然后在云上的Linux实例上部署一个11g的环境,全程只用了3分钟,详情参见本公众号文章《3分钟在云上快速搭建Oracle 11g环境》,效率惊人!
随后,又测试了从Docker Store,下载Oracle Database 12c企业版的Docker镜像到Oracle云,在云上的Linux实例中运行12c企业版容器,全程耗时20分钟,速度也非常快,详情参见本公众号文章《在Docker容器中运行Oracle Database 12c企业版》。对比这两次测试,除了数据库版本不一样外,主要的区别在于,前者的Docker镜像中,数据库软件已经安装完毕,数据库也已经创建好,而后者的镜像中,还需要解压数据库软件,同时重新创建数据库,时间都消耗在解压和建库上。
另外,Oracle公司还把这些产品的Docker镜像直接发布在Docker Store上,用户可以免费下载镜像,用于开发、测试的目的,不能用于生产环境!
相关链接:https://store.docker.com/search?q=Oracle&source=verified&type=image
Oracle公司发布的Docker镜像,是经过官方认证,在安全和性能上有保障,建议大家在开发、测试环境中,尽量选用官方提供的镜像,当然了,这些镜像可以免费用于开发、测试的用途。
但是,当前官方的镜像还不支持Docker Volume映射,即无法将容器中的数据存放在持久化的存储上,也就意味着,一旦容器被删除,容器中的所有数据都将丢失,如果需要将数据文件持久化存放,就不要使用这个镜像,用户只能通过自己定制镜像来满足这个需求。本文将演示,如何创建Oracle Database 12c企业版的Docker镜像,并将镜像上传到自己的Docker Registry中。
实验环境:
服务器:Oracle云上创建的Linux实例
操作系统版本:Oracle Linux Server release 7.3
Docker环境:Docker 1.12.6
数据库版本:Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit
Docker Registry:Docker registry:2
关于实验环境的准备,本公众号已有相关文章详细介绍,详情参见相关文章:
《在Oracle云上安装和部署Docker Engine(OL7)》
第一部分:创建Oracle 12.2 Docker镜像
Oracle公司已经将创建数据库Docker镜像要用到的所有脚本都上传到GitHub上,我们可以直接使用。
下载Docker创建脚本
$ wget https://github.com/oracle/docker-images/archive/master.zip
--2017-06-22 23:29:08-- https://github.com/oracle/docker-images/archive/master.zip
Resolving github.com (github.com)... 192.30.255.112, 192.30.255.113
Connecting to github.com (github.com)|192.30.255.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/oracle/docker-images/zip/master[following]
--2017-06-22 23:29:09-- https://codeload.github.com/oracle/docker-images/zip/master
Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121
Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: ‘master.zip’
[ <=> ] 4,334,327 9.28MB/s in 0.4s
2017-06-22 23:29:10 (9.28 MB/s) - ‘master.zip’ saved [4334327]
解压master.zip,将生成一个docker-images-master的目录。
[opc@f807e9 ~]$ cd docker-images-master
[opc@f807e9 docker-images-master]$ ls
ContainerCloud GraalVM NoSQL OracleCoherence OracleFMWInfrastructure OracleJava OracleTuxedo README.md
GlassFish MySQL OpenJDK OracleDatabase OracleHTTPServer OracleTSAM OracleWebLogic
[opc@f807e9 dockerfiles]$ cd home/opc/docker-images-master/OracleDatabase/dockerfiles
[opc@f807e9 dockerfiles]$ pwd
/home/opc/docker-images-master/OracleDatabase/dockerfiles
[opc@f807e9 dockerfiles]$ ls
11.2.0.2 12.1.0.2 12.2.0.1 buildDockerImage.sh
这个目录下有不同版本数据库的脚本,本文将演示12.2.0.1的创建过程,进入目录12.2.0.1,
[opc@f807e9 dockerfiles]$ cd 12.2.0.1
[opc@f807e9 12.2.0.1]$ pwd
/home/opc/docker-images-master/OracleDatabase/dockerfiles/12.2.0.1
[opc@f807e9 12.2.0.1]$ ll
total 3372828
-rwxr-xr-x 1 opc opc 1259 Jun 19 17:27 checkDBStatus.sh
-rwxr-xr-x 1 opc opc 839 Jun 19 17:27 checkSpace.sh
-rw-rw-r-- 1 opc opc 62 Jun 19 17:27 Checksum.ee
-rw-rw-r-- 1 opc opc 62 Jun 19 17:27 Checksum.se2
-rwxr-xr-x 1 opc opc 2898 Jun 19 17:27 createDB.sh
-rw-rw-r-- 1 opc opc 9264 Jun 19 17:27 dbca.rsp.tmpl
-rw-rw-r-- 1 opc opc 6878 Jun 19 17:27 db_inst.rsp
-rw-rw-r-- 1 opc opc 2547 Jun 19 17:27 Dockerfile.ee
-rw-rw-r-- 1 opc opc 2549 Jun 19 17:27 Dockerfile.se2
-rwxr-xr-x 1 opc opc 2057 Jun 19 17:27 installDBBinaries.sh
-rwxr-xr-x 1 opc opc 1065 Jun 19 17:27 installPerl.sh
-rwxr-xr-x 1 opc opc 5332 Jun 19 17:27 runOracle.sh
-rwxr-xr-x 1 opc opc 769 Jun 19 17:27 setPassword.sh
-rwxr-xr-x 1 opc opc 876 Jun 19 17:27 setupLinuxEnv.sh
-rwxr-xr-x 1 opc opc 689 Jun 19 17:27 startDB.sh
在Docker镜像创建过程中,以上脚本都会用到,如果大家有兴趣,可以深入研究这些脚本,我们也可以根据自己的需要,通过修改这些脚本,来获得一个定制化镜像。
另外,我们还需要从Oracle官方网站上,下载一个Oracle 12.2的安装介质。
下载链接:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

选择Linux x86-64,下载。安装介质有3.2GB。
将安装介质上传到服务器上,与所有的脚本放在同一个目录(/home/opc/docker-images-master/OracleDatabase/dockerfiles/12.2.0.1)。
创建镜像
返回到上一级目录,用root用户执行命令,创建镜像
[opc@f807e9 12.2.0.1]$ pwd
/home/opc/docker-images-master/OracleDatabase/dockerfiles/12.2.0.1
[opc@f807e9 12.2.0.1]$ cd ..
[opc@f807e9 dockerfiles]$ ls
11.2.0.2 12.1.0.2 12.2.0.1 buildDockerImage.sh
[opc@f807e9 dockerfiles]$ pwd
/home/opc/docker-images-master/OracleDatabase/dockerfiles
[opc@f807e9 dockerfiles]$ sudo -s
[root@f807e9 dockerfiles]# pwd
/home/opc/docker-images-master/OracleDatabase/dockerfiles
[root@f807e9 dockerfiles]#./buildDockerImage.sh -v 12.2.0.1 -e
Checking if required packages are present and valid...
linuxx64_12201_database.zip: OK
=====================
Building image 'oracle/database:12.2.0.1-ee' ...
<….此处省略一万字….>
Oracle Database Docker Image for 'ee' version 12.2.0.1 is ready to be extended:
--> oracle/database:12.2.0.1-ee
Build completed in 841 seconds.
镜像创建完成!
查看镜像状态
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
oracle/database 12.2.0.1-ee b557c69a4f8c 2 minutes ago 14.84 GB
oraclelinux 7-slim 08a01cc7be97 40 hours ago 114.4 MB
alpine latest 665ffb03bfae 2 days ago 3.962 MB
在正式运行镜像时,需要做几个准备工作。
这个镜像可以将数据库持久化存储,因此需要在宿主机上为容器准备一个目录,将容器中数据库的数据文件存放目录映射到宿主机上,用来存放容器内的数据库的相关数据文件,实现容器数据库的持久化存储。这样一来,即便容器被删除,也不会影响到数据库的文件,数据文件会一直在宿主机上持久化存放。
# mkdir -p var/lib/docker/oradata
接下来的操作更重要,需要修改这个目录的属组信息,确保容器对目录有读写权限。
首先,我们需要查看容器内Oracle用户的属组信息。
执行下面的命令,查看容器内容Oracle用户的属组信息:
[root@f807e9 dockerfiles]# docker run -ti --rm --entrypoint="/bin/bash" oracle/database:12.2.0.1-ee -c "id oracle"
uid=54321(oracle) gid=54321(oinstall)groups=54321(oinstall),54322(dba)
将oradata目录的属组改为与容器内oracle用户一致
[root@f807e9 docker]#cd /var/lib/docker
[root@f807e9 docker]#chown -R 54321:54321 oradata
[root@f807e9 docker]# ls -l
total 0
drwx------ 1 root root 20 Jun 1 04:29 btrfs
drwx------ 1 root root 128 Jun 22 11:40 containers
drwx------ 1 root root 10 May 26 12:42 image
drwxr-x--- 1 root root 10 May 26 12:42 network
drwxr-xr-x 1 54321 54321 64 Jun 22 11:18 oradata
drwx------ 1 root root 0 May 26 12:42 swarm
drwx------ 1 root root 0 Jun 22 10:38 tmp
drwx------ 1 root root 0 May 26 12:42 trust
drwx------ 1 root root 22 Jun 22 11:40 volumes
运行容器
# docker run --name ora122 \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=ora122 \
-e ORACLE_PDB=pdb1 \
-e ORACLE_PWD=Welcome1 \
-e ORACLE_CHARACTERSET=ZHS16GBK \
-v /var/lib/docker/oradata:/opt/oracle/oradata \
oracle/database:12.2.0.1-ee
以上的参数均能自定义,有几个关键的参数需要重点关注:
--name: 容器名称,如果不指定,系统将自动生成;
-p: 端口映射,容器已经将两个端口暴露出来:1521 (Oracle Listener), 5500 (OEM Express),可以选择将宿主指定端口映射到这两个端口,确保外部应用可以通过这些端口访问容器内的1521和5500端口。
-e ORACLE_SID: 指定数据库实例名称(缺省: ORCLCDB)
-e ORACLE_PDB: 指定PDB名称 (缺省值: ORCLPDB1)
-e ORACLE_PWD: 为数据库用户指定密码:SYS, SYSTEM 和PDB_ADMIN (缺省: 系统自动生成)
-e ORACLE_CHARACTERSET: 为数据库指定字符集(缺省: AL32UTF8)
-v :将宿主机上的数据卷映射到容器中,作为容器内数据库的持久化存储,注意:需要将宿主机的目录的属组设置为与容器内的Oracle用户一致。
容器将在后台运行,可以使用命令查看运行状态:
[root@f807e9 dockerfiles]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2df3c8c7a8c8 oracle/database:12.2.0.1-ee "/bin/sh -c 'exec $OR" 13 hours ago Up 12 hours 0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp ora122
[root@f807e9 dockerfiles]# docker logs -f 2df3c8c7a8c8
使用上面的命令实时查看docker运行日志。
如果容器内数据库创建成功,将在日志中看到以下信息:
#########################
DATABASE IS READY TO USE!
#########################
从外部访问数据库,查看数据库状态
[opc@f807e9 bin]$ ./sql "system/Welcome1@129.191.27.7:1521/pdb1"
SQLcl: Release 4.2.0 Production on Thu Jun 22 11:25:53 2017
Copyright (c) 1982, 2017, Oracle. All rights reserved.
Last Successful login time: Thu Jun 22 2017 11:25:55 -04:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> exit
至此,容器内数据库运行正常!
第二部分:创建Oracle 12.2 Docker镜像
先将本地的镜像oracle/database 打上tag,再上传到Docker Registry上,主要新的tag上要将Docker registry服务器的IP和端口加上去。
[root@f807e9 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
oracle/database 12.2.0.1-ee b557c69a4f8c 14 hours ago 14.84 GB
oraclelinux 7-slim 08a01cc7be97 2 days ago 114.4 MB
alpine latest 665ffb03bfae 3 days ago 3.962 MB
[root@f807e9 ~]# docker tag oracle/database:12.2.0.1-ee 129.191.26.216:5000/oracle/database:12.2.0.1-ee
[root@f807e9 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
129.191.26.216:5000/oracle/database 12.2.0.1-ee b557c69a4f8c 14 hours ago 14.84 GB
oracle/database 12.2.0.1-ee b557c69a4f8c 14 hours ago 14.84 GB
oraclelinux 7-slim 08a01cc7be97 2 days ago 114.4 MB
alpine latest 665ffb03bfae 3 days ago 3.962 MB
上传到Docker registry上
[root@f807e9 ~]# docker push 129.191.26.216:5000/oracle/database
The push refers to a repository [129.191.26.216:5000/oracle/database]
a4ccef407af9: Pushed
7169fcfd5666: Pushed
014cfcfa39e3: Pushed
641bda7def74: Pushed
0f204a1e461a: Pushed
a8cf2f688ac8: Pushed
12.2.0.1-ee: digest: sha256:dc5f5eaddd07e1a53c87aa5de39e2367e5a81e93a1576d96df60b8a0abeb83aa size: 1590

注:Oracle官方在去年就已经发布了Oracle 产品的Docker镜像,在GitHub上可以找到以下产品的Dockerfile和示例脚本,用户可以根据这些脚本和示例,定制自己的Docker 镜像:
Oracle Coherence
Oracle Database
Oracle HTTP Server
Oracle Java
Oracle Linux
Oracle NoSQL Database
Oracle Tuxedo
Oracle WebLogic
相关链接: github.com/oracle/docker-images




