本文主要就是为了验证下oracle是否能够在docker容器中安装并持久化数据存储。中间遇到不少问题,本文仅做一个总结,希望对其他人也有一定帮助或者参考借鉴。
选择一个合适镜像
oracle官网没有提供docker镜像,需要自己封装,在https://hub.docker.com/上能查到已经封装好的镜像,本文中选择的是jaspeen/oracle-11g。该镜像并没有将oracle安装包封装到镜像中,只是封装了安装命令。所以使用该镜像的话,需要自己下载需要的oracle版本。本文中使用的oracle-11g
- jaspeen/oracle-11g 结构说明
注意jaspeen/oracle-11g 中的安装脚本的执行目录。从github上查看源码分析到改镜像的安装脚本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
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"
su oracle -c "/install/database/runInstaller -silent -ignorePrereq -waitforcompletion -responseFile /assets/db_install.rsp"
/opt/oracle/oraInventory/orainstRoot.sh
/opt/oracle/app/product/11.2.0/dbhome_1/root.sh
通过上述shell脚本可以看到,镜像的安装命令是从/install/database目录去执行安装脚本的。
然后我们在hub.docker上也能看到该镜像的使用说明。需要自己下载oracle linux版本的安装包,然后解压到某个目录,并且将改目录挂载到容器的/install目录下。
持久化挂载
数据库安装肯定都需要对数据文件存储目录做持久化挂载。这里在做持久化的时候比较麻烦。首先我们不能配置持久化挂载oradata目录。如下图只配置了安装目录的挂载映射。
执行以下命令完成pod的创建
kubectl create -f oracle.yaml
这里提供一个 配置好的yaml文件
此时我们需要将oradata 目录从容器中复制到宿主机,复制的命令如下:
docker cp 03ea024262d7:/opt/oracle/app/oradata /home/oracle/app/
复制完成后,我们就可以通过持久化存储挂载实现oracle容器的数据持久化了。同样这里只需要将挂载配置注释放开就行。
爬坑指南
整个过程中遇到两个问题,一个是宿主机的swap问题。一个是挂载目录的权限问题
swap
在安装oracle容器时,容器没有启动成功,查看日志发现错误信息,信息
[oracle@localhost database]$ ./runInstaller -silent -responseFile /home/oracle/db_install.rsp
Starting Oracle Universal Installer...
Checking Temp space: must be greater than 120 MB. Actual 150565 MB Passed
Checking swap space: 0 MB available, 150 MB required. Failed <<<<
Some requirement checks failed. You must fulfill these requirements before
continuing with the installation,
大概意思是swap space没有配置。解决方案是配置swap并开启即可.
dd if=/dev/zero of=/swapfile bs=1024 count=512k
mkswap /swapfile
swapon /swapfile
swapon -s
持久化挂载目录的权限问题。
因为在oracle docker 镜像的安装脚本中,其实是新建了一个oracle用户来执行安装oracle。所以此时宿主的挂载目,oracle用户其实是没有权限的。所以我们需要授权。
- 先查看下oracle用户的ID和group id
查到信息后再宿主机中执行以下命令
chown -R 440.200 /home/oracle/app/
440标识group id,200 表示用户id,/home/oracle/app/是需要授权的目录。