docker搭建oracle11g服务

事前准备

篇幅受限制,关于持久化数据的方法请参见我的另一边文章docker搭建oracle服务持久化数据

1. oracle下载

版本:11.2.0.1,这个版本可以免费下载,11.2.0.4需要付费帐号才行
下载需要登陆Oracle账号,会有授权参数共2个zip包,下载速度很慢,推荐迅雷下载,但是我这里迅雷下第一个zip包很快,第二个非常慢,尝试了腾讯云下载,竟然比迅雷还慢,最后用的阿里云服务器,我这里很快,如果还有免费试用资格的可以试下.
下载地址:

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#11g

docker搭建oracle11g服务_第1张图片

2. 从Jaspeen大神的github,下载/准备相关内容

docker搭建oracle11g服务_第2张图片

1)Dockerfile

https://github.com/jaspeen/oracle-11g/blob/master/Dockerfile
# 基于cnetos:7制作镜像,可以根据自己的需求来选择不同的镜像我这里用的centos:centos7
FROM centos:7

# 作者名:
MAINTAINER shuu

# ADD在Dockerfile进行build时,会将assets目录,复制到容器根目录.
ADD assets /assets

# 修改目录权限
RUN chmod -R 755 /assets
# 执行setup.sh脚本,进行安装前的准备工作
RUN /assets/setup.sh

# 暴露1521和8080端口
EXPOSE 1521
EXPOSE 8080

# 当容器被启动时,会执行entrypoint.sh脚本,进行oracle的安装
CMD ["/assets/entrypoint.sh"]

2)assets目录

此目录中包含了很多脚本,及oracle安装时需要用到的配置文件.

https://github.com/jaspeen/oracle-11g

docker搭建oracle11g服务_第3张图片
docker搭建oracle11g服务_第4张图片

3)将上述的文件放到同一个目录中

在这里插入图片描述

3. assets文件分析

jaspeen是基于oracle11.2.0.4进行的配置,所以如果你下载的压缩包也是相同版本,并且对配置相关信息没有兴趣研究,可以选择略过。

1)colorecho

#!/usr/bin/env bash

ccred='\033[0;31m'
ccyellow='\033[0;33m'
ccgreen='\033[32m'
ccend='\033[0m'

echo_red() {
    echo -e "${ccred}$@${ccend}"
}

echo_yellow() {
    echo -e "${ccyellow}$@${ccend}"
}

echo_green() {
    echo -e "${ccgreen}$@${ccend}"
}

docker搭建oracle11g服务_第5张图片
定义了三个函数,分别用来将echo输出的字体显示为红,黄,绿色

2)setup.sh

# 如果脚本文件中的命令执行后结果状态码不是0,则立即退出脚本.
set -e

# 引入 1)解释过的文件,为了能够使用自定义的带颜色的echo
source /assets/colorecho
# trap的作用:
# 当捕捉到GIGTERM/SIGINT信号时,分别执行对应的命令.
trap "echo_red '******* ERROR: Something went wrong.'; exit 1" SIGTERM
trap "echo_red '******* Caught SIGINT signal. Stopping...'; exit 2" SIGINT

#Install prerequisites directly without virtual package
deps () {
	echo "Installing dependencies"
	yum -y install binutils compat-libstdc++-33 compat-libstdc++-33.i686 ksh elfutils-libelf \
	elfutils-libelf-devel glibc glibc-common glibc-devel gcc gcc-c++ libaio libaio.i686 \
	libaio-devel libaio-devel.i686 libgcc libstdc++ libstdc++.i686 libstdc++-devel \
	libstdc++-devel.i686 make sysstat unixODBC unixODBC-devel
	yum clean all
	rm -rf /var/lib/{cache,log} /var/log/lastlog
}

users () {
	echo "Configuring users"
	# 创建oinstall及dba组,组ID分别为200和201
	groupadd -g 200 oinstall
	groupadd -g 201 dba
	# 创建oracle用户并指定其:
	# 用户id为 400
	# 初始组为 oinstall
	# 附加组为 dba
	# 家目录为 /opt/oracle
	useradd -u 440 -g oinstall -G dba -d /opt/oracle oracle
	# 为oracle及root用户赋予密码,均为install,这里可以自行修改
	echo "oracle:install" | chpasswd
	echo "root:install" | chpasswd
	# 将 /etc/pam.d/login文件中的内容:pam_namespace.so 替换为:下面2行信息(具体看一眼就明白了)
	# pam_namespace.so
	# session    required     pam_limits.so
	# pam_limits.so模块的主要功能是限制用户会话过程中对各种系统资源的使用情况。
	# 缺省情况下该模块的配置文件是/etc/security/limits.conf
	sed -i "s/pam_namespace.so/pam_namespace.so\nsession    required     pam_limits.so/g" \
	/etc/pam.d/login
	# 创建下列目录,并设置mode为755
	mkdir -p -m 755 /opt/oracle/app
	mkdir -p -m 755 /opt/oracle/oraInventory
	mkdir -p -m 755 /opt/oracle/dpdump
	# 将oracle用户的家目录及上面创建的三组目录owner和group进行变更
	chown -R oracle:oinstall /opt/oracle
	# 将/assets/profile中配置的环境变量信息追加到oracle用户家目录下的
	# .bash_profile及.bashrc文件中.
	cat /assets/profile >> ~oracle/.bash_profile
	cat /assets/profile >> ~oracle/.bashrc
}

sysctl_and_limits () {
	# 使用/assets/sysctl.conf文件覆盖 /etc/sysctl.conf
	cp /assets/sysctl.conf /etc/sysctl.conf
	# 将/assets/limits.conf中的内容追加至 /etc/security/limits.conf文件
	cat /assets/limits.conf >> /etc/security/limits.conf
}
# 方法调用
deps
users
sysctl_and_limits

3)profile

环境变量,有oracle的安装目录,sid,数据库文件,配置PATH信息lib目录等等信息

export ORACLE_BASE=/opt/oracle/app
export ORACLE_SID=orcl
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_INVENTORY=/opt/oracle/oraInventory
export PATH=$PATH:$ORACLE_BASE/bin
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
export ORACLE_HOME_LISTNER=$ORACLE_HOME

4)sysctl.conf

# 用于定义网络连接可用本地端口的最小和最大端口的限制,默认情况下为32768   60999,
# 默认的28232个随机端口,看起来很多,但在繁忙的流量服务器的时候可能很容易达到这个限制
# 我个人学习用,顶多2,3个人一起用,所以涉及不到那么大多端口,所以我这里用的默认.
net.ipv4.ip_local_port_range = 9000 65500
# 该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量。
fs.file-max = 6815744
# 该参数控制可以使用的共享内存的总页数。 
# Linux 共享内存页大小为 4KB, 共享内存段的大小都是共享内存页大小的整数倍。
# 一个共享内存段的最大大小是 16G ,那么需要共享内存页数是 16GB/4KB==4194304 (页),
# 当内存为 12G 时, kernel.shmall = 3145728
# 当内存为 16G 时, kernel.shmall = 4194304
# 当内次为 32G 时, kernel.shmall = 8388608
# 当内存为 64G 时, kernel.shmall = 16777216
# 当内存为 128G 时, kernel.shmall = 33554432
# 。。。。我用的腾讯云,1核2G内存的,自己加了4G的swap,所以我这里按照1G设置好了...
# 1G ===>  1 * 1024 * 1024 / 4 = 262144
kernel.shmall = 10523004
# 同上一个相反,这个是最大共享内存,我这里没有那么大内存,按照官方建议,设置为:
# 物理内存 - 1byte,我这里是2G,即为2 * 1024 * 1024 * 1024 -1 = 2147483647‬
kernel.shmmax = 6465333657
# 该参数是共享内存段的最大数量。shmmni缺省值4096,一般肯定是够用了
kernel.shmmni = 4096
# kernel.sem:对应4个值 :
# SEMMSL、SEMMNS、SEMOPM、SEMMNI 具体由于个人也不是很了解,所以为避免误导
# 有想要详细了解的同学,请自行查看Oracle官方文档.
kernel.sem = 250 32000 100 128
# 接收socket缓冲区大小的默认值(单位:byte)
net.core.rmem_default=262144
# 发送socket缓冲区大小的默认值(单位:byte)。
net.core.wmem_default=262144
# 接收socket缓冲区大小的最大值(单位:byte)
# 我这里内存受限 将设置为 2G * 1024 * 1024 = 2097152
net.core.rmem_max=4194304
# 发送socket缓冲区大小的最大值单位:byte)。
# 我这里内存受限 将设置为 2G * 1024 * 1024 = 2097152
net.core.wmem_max=1048576
# 此参数限制并发未完成的异步请求数目,避免I/O子系统故障
fs.aio-max-nr = 1048576

5)limits.conf

# oracle 用户可以打开的最大进程数,超过后悔警告
oracle   soft   nproc   2047
# oracle 用户不能拥有超过16384个进程,并且会在拥有2047个进程时发出警告
oracle   hard   nproc   16384
# oracle 用户可以打开的最大的文件描述符数量,默认1024,这里的数值会限制tcp连接
oracle   soft   nofile   1024
# oracle 用户不能打开的超过65536个文件描述符,当超过1024时会发出警告
oracle   hard   nofile   65536

6)entrypoint.sh

#!/usr/bin/env bash

set -e
source /assets/colorecho
# 如果oracle目录不存在则代表并未安装,进行安装
if [ ! -d "/opt/oracle/app/product/11.2.0/dbhome_1" ]; then
        echo_yellow "Database is not installed. Installing..."
        /assets/install.sh
fi
# 切换至oracle用户,并执行entrypoint_oracle.sh脚本
su oracle -c "/assets/entrypoint_oracle.sh"

7)install.sh

#!/usr/bin/env bash
set -e
source /assets/colorecho

trap "echo_red '******* ERROR: Something went wrong.'; exit 1" SIGTERM
trap "echo_red '******* Caught SIGINT signal. Stopping...'; exit 2" SIGINT

# 这里要求事先将oracle11g的安装包 解压至 与docker容器内的 /install 目录使用 -v 参数
# 进行映射 的 外部目录之中.
if [ ! -d "/install/database" ]; then
        echo_red "Installation files not found. Unzip installation files into mounted(/install) folder"
        exit 1
fi

echo_yellow "Installing Oracle Database 11g"

# 切换至oracle用户,执行 /install/database/runInstaller进行oracle的安装
# -silent:
#  		对于无提示模式下的操作, 输入内容可以是一个响应文件(-responseFile), 也可以是命令行变量值对的列表。
# -ignorePrereq:
#		忽略运行先决条件检查
# -waitforcompletion:
#		安装程序将等待完成, 而不是衍生 Java 引擎并退出。
# -responseFile:
#		指定要使用的响应文件和路径。
su oracle -c "/install/database/runInstaller -silent -ignorePrereq -waitforcompletion -responseFile /assets/db_install.rsp"
# 设置产品目录位置与拥有该目录的操作系统组,并产生/etc/oraInst.loc
# 详见 http://blog.itpub.net/29496899/viewspace-1461562/ 同时感谢文章作者
/opt/oracle/oraInventory/orainstRoot.sh
# 用来设置必要的操作系统权限,并将orahome,oraenv,coraenv复制到/usr/local/bin目录下。
# 生成/etc/oratab,其中存放一些数据库相关信息。
/opt/oracle/app/product/11.2.0/dbhome_1/root.sh

8)db_install.rsp

oracle安装时需要的配置文件,由于是slient模式,所以平时我们在图形界面进行交互性的选择内容,这里都交由此文件,这里如果不是11.2.0.4版本的话,必须要将安装包内的db_install.rsp自行对照修改相应位置.
文件太长,这里就不贴出来了,至于11.2.0.1和11.2.0.4该文件的差异,可到自行对比下,或者可以直接去jaspeen的github查看.

https://github.com/jaspeen/oracle-11g/commit/4199e8a77d3d71d93e5667704097ecacba683b19

但是,其中变化最多的篇幅主要还是注释,所以,这里我们主要关注那些需要的改动:

8-1) oracle安装语言

请根据实际情况来指定,这里我安装的是日文版

#-------------------------------------------------------------------------------
# Specify the languages in which the components will be installed.             
#
# en   : English                  ja   : Japanese                  
# fr   : French                   ko   : Korean                    
# ar   : Arabic                   es   : Latin American Spanish    
# bn   : Bengali                  lv   : Latvian                   
# pt_BR: Brazilian Portuguese     lt   : Lithuanian                
# bg   : Bulgarian                ms   : Malay                     
# fr_CA: Canadian French          es_MX: Mexican Spanish           
# ca   : Catalan                  no   : Norwegian                 
# hr   : Croatian                 pl   : Polish                    
# cs   : Czech                    pt   : Portuguese                
# da   : Danish                   ro   : Romanian                  
# nl   : Dutch                    ru   : Russian                   
# ar_EG: Egyptian                 zh_CN: Simplified Chinese        
# en_GB: English (Great Britain)  sk   : Slovak                    
# et   : Estonian                 sl   : Slovenian                 
# fi   : Finnish                  es_ES: Spanish                   
# de   : German                   sv   : Swedish                   
# el   : Greek                    th   : Thai                      
# iw   : Hebrew                   zh_TW: Traditional Chinese       
# hu   : Hungarian                tr   : Turkish                   
# is   : Icelandic                uk   : Ukrainian                 
# in   : Indonesian               vi   : Vietnamese                
# it   : Italian                                                   
#
# Example : SELECTED_LANGUAGES=en,fr,ja
#------------------------------------------------------------------------------
SELECTED_LANGUAGES=en,ja

8-2)安装选项

只安装数据库软件

#------------------------------------------------------------------------------
# Specify the installation option.
# It can be one of the following:
# 1. INSTALL_DB_SWONLY
# 2. INSTALL_DB_AND_CONFIG
# 3. UPGRADE_DB
#-------------------------------------------------------------------------------
oracle.install.option=INSTALL_DB_SWONLY

8-3)各种环境变量

ORACLE_HOSTNAME=database
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/opt/oracle/oraInventory
ORACLE_HOME=/opt/oracle/app/product/11.2.0/dbhome_1
ORACLE_BASE=/opt/oracle/app
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=dba
DECLINE_SECURITY_UPDATES=true

9)entrypoint_oracle.sh

#!/usr/bin/env bash

set -e
source /assets/colorecho
source ~/.bashrc

alert_log="$ORACLE_BASE/diag/rdbms/orcl/$ORACLE_SID/trace/alert_$ORACLE_SID.log"
listener_log="$ORACLE_BASE/diag/tnslsnr/$HOSTNAME/listener/trace/listener.log"
pfile=$ORACLE_HOME/dbs/init$ORACLE_SID.ora

# monitor $logfile
monitor() {
	# 对文件进行追踪,即使被删除,待同名文件出现时,会继续尝试追踪,0表示不显示当前文件的内容
	# 只有当文件被追加入内容时,才会显示追加的内容
    tail -F -n 0 $1 | while read line; do echo -e "$2: $line"; done
}


trap_db() {
	trap "echo_red 'Caught SIGTERM signal, shutting down...'; stop" SIGTERM;
	trap "echo_red 'Caught SIGINT signal, shutting down...'; stop" SIGINT;
}

start_db() {
	echo_yellow "Starting listener..."
	monitor $listener_log listener &
	# 启动监听,并将监听过程信息输出到日志文件.
	lsnrctl start | while read line; do echo -e "lsnrctl: $line"; done
	# $! 最后一条后台运行的进程ID
	MON_LSNR_PID=$!
	echo_yellow "Starting database..."
	trap_db
	monitor $alert_log alertlog &
	MON_ALERT_PID=$!
	# 无密码登录后,通过pfile方式启动,这里不是很了解,感兴趣的可以自行查阅资料
	sqlplus / as sysdba <<-EOF |
		pro Starting with pfile='$pfile' ...
		startup;
		alter system register;
		exit 0
	EOF
	while read line; do echo -e "sqlplus: $line"; done
	wait $MON_ALERT_PID
}

create_db() {
	echo_yellow "Database does not exist. Creating database..."
	date "+%F %T"
	monitor $alert_log alertlog &
	MON_ALERT_PID=$!
	monitor $listener_log listener &
	#lsnrctl start | while read line; do echo -e "lsnrctl: $line"; done
	#MON_LSNR_PID=$!
        echo "START DBCA"
    # Database Configuration Assistant顾名思义,数据库配置助手
    # 还是非交互模式,需要交互的选项直接走responseFile,所以需要认真配置dbca.rsp
	dbca -silent -createDatabase -responseFile /assets/dbca.rsp
	echo_green "Database created."
	date "+%F %T"
	# 创建data_pump_dir目录,此为impdp,expdp命令时需要的目录
	change_dpdump_dir
        touch $pfile
	trap_db
        kill $MON_ALERT_PID
	#wait $MON_ALERT_PID
}

# 关闭数据库服务及监听
stop() {
    trap '' SIGINT SIGTERM
	shu_immediate
	echo_yellow "Shutting down listener..."
	lsnrctl stop | while read line; do echo -e "lsnrctl: $line"; done
	kill $MON_ALERT_PID $MON_LSNR_PID
	exit 0
}
# 具体的关闭数据库服务的方法
shu_immediate() {
	ps -ef | grep ora_pmon | grep -v grep > /dev/null && \
	echo_yellow "Shutting down the database..." && \
	sqlplus / as sysdba <<-EOF |
		set echo on
		shutdown immediate;
		exit 0
	EOF
	while read line; do echo -e "sqlplus: $line"; done
}

change_dpdump_dir () {
	echo_green "Changind dpdump dir to /opt/oracle/dpdump"
	sqlplus / as sysdba <<-EOF |
		create or replace directory data_pump_dir as '/opt/oracle/dpdump';
		commit;
		exit 0
	EOF
	while read line; do echo -e "sqlplus: $line"; done
}

chmod 777 /opt/oracle/dpdump

echo "Checking shared memory..."
# 查看共享内存是否挂载
df -h | grep "Mounted on" && df -h | egrep --color "^.*/dev/shm" || echo "Shared memory is not mounted."
if [ ! -f $pfile ]; then
  create_db;
fi 
start_db

10)dbca.rsp

在此文件中很多内容感觉不太能理解,比如很多地方竟然会有11c和12c的关键字,在结尾甚至还有很多配置是关于:
CDB(Container DataBase)容器级数据库
PDB(Pluggable DataBase)可插拔数据库

这里不是特别理解,因为这2个特质是oracle12c开始才有的,由于我还比较菜,尚不能完全理解,所以这些内容请允许我保留个人意见,我并没有添加,毕竟我用的不是oracle12c.
对于11g和12c的对于可以参照下面这篇文章,在此也要感谢作者.

# Oracle11g和12c的比较
https://blog.csdn.net/DBDeep/article/details/81737282

这里仅给出个人觉得需要修改的,即:在11.2.0.1安装包的dbca.rsp文件基础上要进行的改动

GDBNAME = "orcl"
SID = "orcl"
# SYS密码可以自行设定
SYSPASSWORD = "oracle"
# 同上
SYSTEMPASSWORD = "oracle"
DATAFILEDESTINATION=/opt/oracle/app/oradata
RECOVERYAREADESTINATION=/opt/oracle/app/oradata
STORAGETYPE=FS
CHARACTERSET="AL32UTF8"
AUTOMATICMEMORYMANAGEMENT="False"

11)run_installer.sh

个人分析,作者本意应该是想要在install.sh文件中调用此脚本的,但目前来看是把下面的脚本命令写在了install.sh中,所以此文件未被使用,可以自行选择是改调用处,或者是干脆不用此文件.

#!/usr/bin/env bash

/install/database/runInstaller -silent -ignorePrereq -waitforcompletion -responseFile /assets/db_install.rsp

4. 修改对应的文件

经过上面的分析,我们对各个文件都有了了解,所以现在要做的是按照自己的实际情况来进行相应的修改.
还是要建议大家,使用前务必仔细阅读所有文件内容,以便有个初步的了解和认识之后,做出自己的合理配置,切勿拿来主义,以免出现问题毫无头绪

这里建议需要修改的文件有:
1) sysctl.conf
2) db_install.rsp
3) dbca.rsp
4) 可选install.sh

su oracle -c "/install/database/runInstaller -silent -ignorePrereq -waitforcompletion -responseFile /assets/db_install.rsp"

改为

su oracle -c "/assets/run_installer.sh"

5. build镜像

1) 创建一个目录,将:

#1 Dockerfile
#2 assets目录
放入此目录中.
在这里插入图片描述

2)build镜像

切换到Dockerfile所在目录,进行编译
在这里插入图片描述

sudo docker build -t shuu/oracle11g:preinstall .

安装完成后会得到如何的镜像,REPOSITORYTAG的命名可以自行选择
在这里插入图片描述

6. 基于上边的镜像启动docker容器,自动化安装oracle11g

1)创建一个目录,用来存放解压缩后的oracle11g安装文件

# /home/shuu/install
mkdir install

解压缩

unzip -n linux.x64_11gR2_database_1of2.zip -d ~/install/
unzip -n linux.x64_11gR2_database_2of2.zip -d ~/install/

docker搭建oracle11g服务_第6张图片

2)启动docker容器,实现oracle安装

sudo docker run --name oracle11g --privileged -p 1521:1521 -v /home/shuu/install:/install \
shuu/oracle11g:preinstall

安装数据库会很慢,耐心等到最后发现有黄色的Starting database...等信息,并且下面有启动Oracle实例就表示成功了,但是这是开启了oracle服务,所以如果想直接访问可以使用-it选项,或者使用-d让它在后台运行
docker搭建oracle11g服务_第7张图片
这里演示是用另一个终端窗口进行的.

sudo docker exec -it oracle11g /bin/bash

docker搭建oracle11g服务_第8张图片
可以试着执行sql,如下所示,说明安装成功!
在这里插入图片描述

7. 基于当前容器,制作新的镜像

谁也不会每次启动容器前先花费个3,40分钟来重新安装一次Oracle服务吧…

1) sync

一定要记得多sync几次,之前搭集群时碰到过2次不sync的话文件未被落盘保存.

sync
sync
sync
......

2)制作新的镜像

sudo docker commit -m "oracle11g" oracle11g shuu/oracle11g

制作过程也需要耐心等待,成功后查看一下,6.05GB,好大!
在这里插入图片描述

你可能感兴趣的:(docker,oracle,docker,oracle)