暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

创建Oracle Database 12c的Docker镜像

凛冬未至 2017-08-04
2424

在工作中,我们经常会遇到需要快速搭建一个Oracle数据库的场景中,例如,CI/CD(持续集成/持续交付)、DevOps、Demo场景、Training等场景,甚至,有时候只是为了验证某个架构设计是否可行。

对于这些场景,通常我们采用以下方式:

  1. 在物理机上安装应用服务器、数据库,导入数据,应用调试;

  2. 采用虚拟机的方式,先创建应用和数据库的虚机镜像,导入虚机镜像;

  3. 在一个操作系统中,安装多个数据库;

  4. 在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云上创建Oracle Linux实例》

《在Oracle云上安装和部署Docker Engine(OL7)》

《在Oracle云上部署Docker Registry》

  

第一部分:创建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

 


文章转载自凛冬未至,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论