docker安装oracle11g

235 阅读4分钟
  • 时间:2023-02-08

  • 标记:docker oracle 权限 volume

前言

首先,这篇文章是基于 helowin的镜像 完成的,本文的操作对该镜像做了以下优化:

  • 容器内的环境变量启动时自动加载

  • 解决卷持久化的权限问题

  • 容器可重建

基础镜像是这个: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

容器内的环境变量启动时自动加载

原博客里没有将这些变量重新打包,这里只好自己动手了,首先按原博客做法,在 /etc/profile 中添加好 export,以及创建对应的文件链接。之后,切换到 oracle 用户,在 ~/.bashrc 文件的末尾添加:

source /etc/profile

强制oracle用户打开终端时再次加载你配的东西。

然后,把该容器打成镜像,以便后来者使用,我本来想上传的,碍于公司制度,暂时搁置,此处我的容器名叫 ooo


docker commit ooo oracle-fixed:0.2

卷持久化的权限问题

主要是 --privileged ,其他做法比较麻烦我就没研究了,compose文件里对应加上

容器可重建

由于容器本身就属于可重建资源,比如 docker-compose 管理下,一点点变动都会重建。

看基于该镜像的博客基本都做成了不可销毁的状态(指销毁了就无法重建后装载相关数据,或许可以但我没研究出来)。重建之后,之前改的管理员密码,创建的表空间什么的全都无了,表空间都无了,你持久化的那些表也都查不。还好没通知客户迁入,不然哪天有人重建了容器我就要被打死了……

作为一个容器却不可以被重建,既限制了容器的一个特性,又有别于大家的常识,这肯定不行的。这好比你用 double 类型声明了一个变量,却在注释里写了这个变量绝对不可以有小数否则有严重后果,那就这加重开发中的心智负担了。

回归正题,我思索它系统信息应该是放到oradata下的,拷贝并挂载后发现这种报错:

oracle报错.png

在 sqlplus 中,查看日志位置 show parameter background_dump_dest,查看该日志末尾信息如下:

oracle报错2.png

可以推测,这是flash_recovery_areaoradata中某些控制文件的内容对不上,因此都挂载出来应该就没问题了。

初始化操作


docker run -it -d -p 1522:1521 --name ooo registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

先创建一个能启动的容器,从中拷贝出上述两个文件夹


docker cp ooo:/home/oracle/app/oracle/flash_recovery_area ./

docker cp ooo:/home/oracle/app/oracle/oradata ./

我这边已经在挂载目录了,因此如此拷贝。

挂载对应文件夹

这边使用 docker-compose 管理,对应文件配置如下:

version: "3.9"
services:
  oracle:
    image: oracle-fixed:0.2
    ports:
      - 1521:1521
    container_name: oracle
    privileged: true
    volumes:
      - '/apps/volume/oracle/data:/data/oracle'
      - '/apps/volume/oracle/oradata:/home/oracle/app/oracle/oradata'
      - '/apps/volume/oracle/flash_recovery_area:/home/oracle/app/oracle/flash_recovery_area'

但挂载后依然报上述错误,我检查过文件大小什么的,应该不存在启动容器时覆写这两个文件夹。所以,我推测可能是报错太模糊,实际上应该是没有权限读取,站在报错信息角度,读不到的数据确实可能以无法核对的形式报错。

权限问题

由于已经加了 --privileged ,所以我寻思不是挂载本身的问题。上述两个文件夹由于是挂载到容器的,因此它的权限很可能是 root:root,而 oracle 用户一般是访问 oracle:oinstall,到容器里一看,果然如此。但这个镜像用的是 oracle 用户进行处理,启动时没权限去更改这两个文件夹的所有者,因此在compose文件中改比较困难。我仔细观察了下,发现这个容器自己创建的文件夹的所有者是 500,我找不到这个神秘用户是什么,各位哪个知道请告诉我下谢谢(/etc/passwd 找不到)。于是我讲这两个文件夹都改成了这个用户为所有者。


chown -R 500 /home/oracle/app/oracle/flash_recovery_area /home/oracle/app/oracle/oradata

再次运行 docker-compose up -d ,没有报错,database 也正确挂载,可以正常登录,创表空间、用户、表、插入数据,移除容器,再启动,查询,有数据,OK了。

声明

需要声明的是,我对原作者没有恶意,也感谢他做的镜像,只是要达到我的需求还要再进一步,分享出来供大家参考下。