篇幅受限制,关于持久化数据的方法请参见我的另一边文章
docker搭建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
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"]
此目录中包含了很多脚本,及oracle安装时需要用到的配置文件.
https://github.com/jaspeen/oracle-11g
jaspeen是基于oracle11.2.0.4进行的配置,所以如果你下载的压缩包也是相同版本,并且对配置相关信息没有兴趣研究,可以选择略过。
#!/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}"
}
定义了三个函数,分别用来将echo
输出的字体显示为红,黄,绿色
# 如果脚本文件中的命令执行后结果状态码不是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
环境变量,有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
# 用于定义网络连接可用本地端口的最小和最大端口的限制,默认情况下为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
# 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
#!/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"
#!/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
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
但是,其中变化最多的篇幅主要还是注释,所以,这里我们主要关注那些需要的改动:
请根据实际情况来指定,这里我安装的是日文版
#-------------------------------------------------------------------------------
# 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
只安装数据库软件
#------------------------------------------------------------------------------
# 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
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
#!/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
在此文件中很多内容感觉不太能理解,比如很多地方竟然会有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"
个人分析,作者本意应该是想要在install.sh
文件中调用此脚本的,但目前来看是把下面的脚本命令写在了install.sh
中,所以此文件未被使用,可以自行选择是改调用处,或者是干脆不用此文件.
#!/usr/bin/env bash
/install/database/runInstaller -silent -ignorePrereq -waitforcompletion -responseFile /assets/db_install.rsp
经过上面的分析,我们对各个文件都有了了解,所以现在要做的是按照自己的实际情况来进行相应的修改.
还是要建议大家,使用前务必仔细阅读所有文件内容,以便有个初步的了解和认识之后,做出自己的合理配置,切勿拿来主义,以免出现问题毫无头绪
这里建议需要修改的文件有:
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"
#1 Dockerfile
#2 assets目录
放入此目录中.
sudo docker build -t shuu/oracle11g:preinstall .
安装完成后会得到如何的镜像,REPOSITORY
和TAG
的命名可以自行选择
# /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/
sudo docker run --name oracle11g --privileged -p 1521:1521 -v /home/shuu/install:/install \
shuu/oracle11g:preinstall
安装数据库会很慢,耐心等到最后发现有黄色的Starting database...
等信息,并且下面有启动Oracle实例就表示成功了,但是这是开启了oracle服务,所以如果想直接访问可以使用-it
选项,或者使用-d让它在后台运行
这里演示是用另一个终端窗口进行的.
sudo docker exec -it oracle11g /bin/bash
谁也不会每次启动容器前先花费个3,40分钟来重新安装一次Oracle服务吧…
一定要记得多sync几次,之前搭集群时碰到过2次不sync的话文件未被落盘保存.
sync
sync
sync
......
sudo docker commit -m "oracle11g" oracle11g shuu/oracle11g