制作Oracle11g Docker 镜像

news2025/3/26 15:04:07
  1. 基于Linux系统,宿主主机要设置如下环境变量,oracle为64位版本
    dockerfile中需要的数据库安装包可从csdn下载内找到
#!/bin/bash
# 在宿主机上运行以设置Oracle所需的内核参数
# 这些命令需要root权限

cat > /etc/sysctl.d/99-oracle.conf << EOF
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
EOF

# 应用设置
sysctl -p /etc/sysctl.d/99-oracle.conf

# 设置Docker守护程序启动参数,允许容器使用特定的内核功能
cat > /etc/docker/daemon.json << EOF
{
  "default-ulimits": {
    "nofile": {
      "name": "nofile",
      "hard": 65536,
      "soft": 1024
    },
    "memlock": {
      "name": "memlock",
      "hard": -1,
      "soft": -1
    }
  }
}
EOF

# 重启Docker服务以应用设置
systemctl restart docker
  1. 制作Dockerfile
FROM dockerproxy.net/library/oraclelinux:7-slim

# 安装必要的包
RUN yum -y install oracle-rdbms-server-11gR2-preinstall unzip

# 设置环境变量
ENV ORACLE_BASE=/u01/app/oracle \
    ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe \
    ORACLE_SID=ORCL \
    ORACLE_DATA=/u01/app/oracle/oradata \
    PATH=$PATH:/u01/app/oracle/product/11.2.0/xe/bin

# 创建必要的目录并设置正确的所有权
# 在创建用户后设置oracle用户密码
RUN set -e \
    && mkdir -p $ORACLE_HOME \
    && mkdir -p $ORACLE_DATA/ORCL \
    && mkdir -p /u01/app/oraInventory \
    && groupadd -g 54321 oinstall || true \
    && groupadd -g 54322 dba || true \
    && useradd -u 54321 -g oinstall -G dba oracle || true \
    && echo "oracle:oracle" | chpasswd \
    && chown -R oracle:dba /u01 \
    && chmod -R 775 /u01 \
    && echo "Directory and user setup completed successfully"

# 创建响应文件
RUN echo "ORACLE_HTTPS_PORT=8080" > /tmp/xe.rsp && \
    echo "ORACLE_HTTP_PORT=8090" >> /tmp/xe.rsp && \
    echo "ORACLE_PASSWORD=oracle" >> /tmp/xe.rsp && \
    echo "ORACLE_CONFIRM_PASSWORD=oracle" >> /tmp/xe.rsp && \
    echo "ORACLE_DBENABLE=y" >> /tmp/xe.rsp

# 假设您已经下载了Oracle 11g的安装文件并放在当前目录
COPY oracle-xe-11.2.0-1.0.x86_64.rpm.zip /tmp/

# 解压安装文件并安装
USER oracle
RUN unzip /tmp/oracle-xe-11.2.0-1.0.x86_64.rpm.zip -d /tmp

USER root
RUN rpm -ivh --nodeps --force /tmp/Disk1/oracle-xe-11.2.0-1.0.x86_64.rpm && \
    rm -rf /tmp/Disk1 /tmp/oracle-xe-11.2.0-1.0.x86_64.rpm.zip

# 配置Oracle
RUN /etc/init.d/oracle-xe configure responseFile=/tmp/xe.rsp || true && \
    # 确保配置文件存在
    mkdir -p $ORACLE_HOME/network/admin && \
    # 强制修改监听器配置
    sed -i 's/HOST=buildkitsandbox/HOST=0.0.0.0/g' $ORACLE_HOME/network/admin/listener.ora && \
    # 如果替换失败,直接创建正确的配置
    echo "LISTENER = \
      (DESCRIPTION_LIST = \
        (DESCRIPTION = \
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) \
          (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) \
        ) \
      ) \
    " > $ORACLE_HOME/network/admin/listener.ora || true

# 修改监听器配置,使用0.0.0.0代替默认主机名
RUN sed -i 's/HOST=buildkitsandbox/HOST=0.0.0.0/g' $ORACLE_HOME/network/admin/listener.ora || true

# 创建初始化参数文件
USER oracle
RUN echo "db_name=ORCL" > $ORACLE_HOME/dbs/initORCL.ora && \
    echo "processes=150" >> $ORACLE_HOME/dbs/initORCL.ora && \
    echo "db_block_size=8192" >> $ORACLE_HOME/dbs/initORCL.ora && \
    echo "sga_target=800M" >> $ORACLE_HOME/dbs/initORCL.ora && \
    echo "pga_aggregate_target=200M" >> $ORACLE_HOME/dbs/initORCL.ora && \
    echo "remote_login_passwordfile=EXCLUSIVE" >> $ORACLE_HOME/dbs/initORCL.ora && \
    echo "control_files=('/u01/app/oracle/oradata/ORCL/control01.ctl', '/u01/app/oracle/oradata/ORCL/control02.ctl')" >> $ORACLE_HOME/dbs/initORCL.ora

# 创建数据库创建脚本
RUN echo "CREATE DATABASE ORCL" > /tmp/create_db.sql && \
    echo "USER SYS IDENTIFIED BY oracle" >> /tmp/create_db.sql && \
    echo "USER SYSTEM IDENTIFIED BY oracle" >> /tmp/create_db.sql && \
    echo "LOGFILE GROUP 1 ('/u01/app/oracle/oradata/ORCL/redo01.log') SIZE 100M," >> /tmp/create_db.sql && \
    echo "        GROUP 2 ('/u01/app/oracle/oradata/ORCL/redo02.log') SIZE 100M," >> /tmp/create_db.sql && \
    echo "        GROUP 3 ('/u01/app/oracle/oradata/ORCL/redo03.log') SIZE 100M" >> /tmp/create_db.sql && \
    echo "MAXLOGFILES 5" >> /tmp/create_db.sql && \
    echo "MAXLOGMEMBERS 5" >> /tmp/create_db.sql && \
    echo "MAXLOGHISTORY 1" >> /tmp/create_db.sql && \
    echo "MAXDATAFILES 100" >> /tmp/create_db.sql && \
    echo "CHARACTER SET AL32UTF8" >> /tmp/create_db.sql && \
    echo "NATIONAL CHARACTER SET AL16UTF16" >> /tmp/create_db.sql && \
    echo "EXTENT MANAGEMENT LOCAL" >> /tmp/create_db.sql && \
    echo "DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf'" >> /tmp/create_db.sql && \
    echo "  SIZE 325M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED" >> /tmp/create_db.sql && \
    echo "SYSAUX DATAFILE '/u01/app/oracle/oradata/ORCL/sysaux01.dbf'" >> /tmp/create_db.sql && \
    echo "  SIZE 325M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED" >> /tmp/create_db.sql && \
    echo "DEFAULT TABLESPACE users" >> /tmp/create_db.sql && \
    echo "  DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf'" >> /tmp/create_db.sql && \
    echo "  SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED" >> /tmp/create_db.sql && \
    echo "DEFAULT TEMPORARY TABLESPACE temp" >> /tmp/create_db.sql && \
    echo "  TEMPFILE '/u01/app/oracle/oradata/ORCL/temp01.dbf'" >> /tmp/create_db.sql && \
    echo "  SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED" >> /tmp/create_db.sql && \
    echo "UNDO TABLESPACE undotbs1" >> /tmp/create_db.sql && \
    echo "  DATAFILE '/u01/app/oracle/oradata/ORCL/undotbs01.dbf'" >> /tmp/create_db.sql && \
    echo "  SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED;" >> /tmp/create_db.sql

# 创建启动脚本
RUN echo '#!/bin/bash' > /tmp/start_oracle.sh && \
    echo 'export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe' >> /tmp/start_oracle.sh && \
    echo 'export ORACLE_SID=ORCL' >> /tmp/start_oracle.sh && \
    echo 'export PATH=$PATH:$ORACLE_HOME/bin' >> /tmp/start_oracle.sh && \
    # 添加这行在启动监听器之前修复配置文件
    echo '# 修复监听器配置' >> /tmp/start_oracle.sh && \
    echo 'sed -i "s/HOST=buildkitsandbox/HOST=0.0.0.0/g" $ORACLE_HOME/network/admin/listener.ora' >> /tmp/start_oracle.sh && \
    echo '' >> /tmp/start_oracle.sh && \
    echo '# 启动监听器' >> /tmp/start_oracle.sh && \
    echo '$ORACLE_HOME/bin/lsnrctl start' >> /tmp/start_oracle.sh && \
    echo '' >> /tmp/start_oracle.sh && \
    echo '# 确认数据库是否已存在' >> /tmp/start_oracle.sh && \
    echo 'if [ ! -f /u01/app/oracle/oradata/ORCL/system01.dbf ] || [ ! -f /u01/app/oracle/oradata/ORCL/control01.ctl ]; then' >> /tmp/start_oracle.sh && \
    echo '  echo "数据库文件不存在,开始创建新数据库..."' >> /tmp/start_oracle.sh && \
    echo '  $ORACLE_HOME/bin/sqlplus / as sysdba << EOF' >> /tmp/start_oracle.sh && \
    echo '  STARTUP NOMOUNT PFILE=$ORACLE_HOME/dbs/initORCL.ora;' >> /tmp/start_oracle.sh && \
    echo '  @/tmp/create_db.sql' >> /tmp/start_oracle.sh && \
    echo '  @?/rdbms/admin/catalog.sql' >> /tmp/start_oracle.sh && \
    echo '  @?/rdbms/admin/catproc.sql' >> /tmp/start_oracle.sh && \
    echo '  @?/rdbms/admin/utlrp.sql' >> /tmp/start_oracle.sh && \
    echo '  ALTER SYSTEM REGISTER;' >> /tmp/start_oracle.sh && \
    echo '  EXIT;' >> /tmp/start_oracle.sh && \
    echo 'EOF' >> /tmp/start_oracle.sh && \
    echo 'else' >> /tmp/start_oracle.sh && \
    echo '  echo "数据库文件已存在,启动现有数据库..."' >> /tmp/start_oracle.sh && \
    echo '  $ORACLE_HOME/bin/sqlplus / as sysdba << EOF' >> /tmp/start_oracle.sh && \
    echo '  STARTUP PFILE=$ORACLE_HOME/dbs/initORCL.ora;' >> /tmp/start_oracle.sh && \
    echo '  ALTER SYSTEM REGISTER;' >> /tmp/start_oracle.sh && \
    echo '  EXIT;' >> /tmp/start_oracle.sh && \
    echo 'EOF' >> /tmp/start_oracle.sh && \
    echo 'fi' >> /tmp/start_oracle.sh && \
    echo '' >> /tmp/start_oracle.sh && \
    # 替换原来的tail命令为改进版本
    echo '# 保持容器运行' >> /tmp/start_oracle.sh && \
    echo 'echo "数据库启动完成,监听中..."' >> /tmp/start_oracle.sh && \
    echo '# 查找正确的警报日志文件' >> /tmp/start_oracle.sh && \
    echo 'ALERT_LOG=$(find $ORACLE_HOME/diag -name "alert_*.log" 2>/dev/null | head -1)' >> /tmp/start_oracle.sh && \
    echo 'if [ -f "$ALERT_LOG" ]; then' >> /tmp/start_oracle.sh && \
    echo '    # 如果找到警报日志,则跟踪它' >> /tmp/start_oracle.sh && \
    echo '    echo "找到警报日志: $ALERT_LOG"' >> /tmp/start_oracle.sh && \
    echo '    tail -f $ALERT_LOG' >> /tmp/start_oracle.sh && \
    echo 'else' >> /tmp/start_oracle.sh && \
    echo '    # 如果没有找到警报日志,使用简单的睡眠循环保持容器运行' >> /tmp/start_oracle.sh && \
    echo '    echo "警报日志文件未找到,使用睡眠循环保持容器运行..."' >> /tmp/start_oracle.sh && \
    echo '    while true; do' >> /tmp/start_oracle.sh && \
    echo '        sleep 60' >> /tmp/start_oracle.sh && \
    echo '    done' >> /tmp/start_oracle.sh && \
    echo 'fi' >> /tmp/start_oracle.sh

USER root
RUN cp /tmp/start_oracle.sh / && \
    chmod +x /start_oracle.sh

# 声明持久化卷
VOLUME ["$ORACLE_DATA"]

# 健康检查
HEALTHCHECK --interval=60s --timeout=30s --start-period=5m --retries=3 \
  CMD su - oracle -c "$ORACLE_HOME/bin/sqlplus -s system/oracle@localhost:1521/ORCL <<< \"select 1 from dual;\"" || exit 1

EXPOSE 1521 8080
USER oracle
CMD ["/start_oracle.sh"]

说明:

  • 系统oracle账户密码为:oracle
  • 创建默认数据库普通账户
    • 账户名system
    • 密码 oracle
  1. 生成镜像及发布容器流程:
# 新建镜像重新发布流程
# 停止正在运行的容器, 如果之前存在失败安装可运行此步骤
docker stop oracle11g

# 删除容器, 如果之前存在失败安装可运行此步骤
docker rm oracle11g

# 列出所有镜像,找到镜像ID, 如果之前存在失败安装可运行此步骤
docker images

# 删除镜像(使用镜像名称或ID), 如果之前存在失败安装可运行此步骤
docker rmi oracle11g-xe

# 在包含Dockerfile的目录中执行
docker build -t oracle11g-xe .

# 启动容器
docker run -d \
  --name oracle11g \
  --privileged \
  --shm-size=1g \
  -p 1521:1521 \
  -p 8080:8080 \
  -v oracle_data:/u01/app/oracle/oradata \
  oracle11g-xe

# 查看容器日志
docker logs -f oracle11g  

# 在容器内连接
docker exec -it oracle11g sqlplus system/oracle@localhost:1521/ORCL

# 从宿主机连接
sqlplus system/oracle@localhost:1521/ORCL

# 导出oracle镜像
docker save -o oracle11g.tar oracle11g-xe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel处理控件Spire.XLS系列教程:C# 在 Excel 中添加或删除单元格边框

单元格边框是指在单元格或单元格区域周围添加的线条。它们可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引读者注意重要的单元格或使工作表看起来更美观。本文将介绍如何使用 Spire.XLS for .NET 在 C# 中添加或删除 Excel 单元格边框。 安装 Spire.XLS for .NET E-…

Web开发-JS应用NodeJS原型链污染文件系统Express模块数据库通讯

知识点&#xff1a; 1、安全开发-NodeJS-开发环境&功能实现 2、安全开发-NodeJS-安全漏洞&案例分析 3、安全开发-NodeJS-特有漏洞 node.js就是专门运行javascript的一个应用程序&#xff0c;区别于以往用浏览器解析原生js代码&#xff0c;node.js本身就可以解析执行js代…

国产达梦(DM)数据库的安装(Linux系统)

目录 一、安装前的准备工作 1.1 导包 1.2 创建用户和组 1.3 修改文件打开最大数 1.4 目录规划 1.5 修改目录权限 二、安装DM8 2.1 挂载镜像 2.2 命令行安装 2.3 配置环境变量 2.4 启动图形化界面 三、配置实例 四、注册服务 五、启动 停止 查看状态 六、数据库客…

git的底层原理

git的底层原理 三段话总结git&#xff0c; 1. 工作原理&#xff1a;git管理是一个DAG有向无环图&#xff0c;HEAD指针指向branch或直接指向commit&#xff0c;branch指向commit&#xff0c;commit指向tree&#xff0c;tree指向别的tree或直接指向blob。 2. git所管理的一个目录…

MATLAB+Arduino利用板上的按键控制板上Led灯

几年不使用&#xff0c;之前的知识都忘掉了。需要逐步捡起来。 1 熟悉按键的使用 2熟悉灯的控制 1 电路 我们将通过 MATLAB 的 Arduino 支持包与 Arduino 板通信&#xff0c;读取按键状态并控制 LED 灯的亮灭。 按键&#xff1a;连接到 Arduino 的数字引脚&#xff08;例如…

Cocos Creator Shader入门实战(五):材质的了解、使用和动态构建

引擎&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 前面的几篇文章&#xff0c;讲述的主要是Cocos引擎对Shader使用的一些固定规则&#xff0c;这里汇总下&#xff1a; 一、Shader实现基础是OpenGL ES可编程渲染管线&#xff0c;开发者只需关注顶点着色器和…

vue设置自定义logo跟标题

准备 Logo 图片 将自定义的 Logo 图片&#xff08;如 logo.png&#xff09;放置在项目的 public文件夹下。 使用环境变量设置 Logo 和标题&#xff08;可选&#xff09; 创建或修改 .env 文件 在项目根目录下创建或修改 .env 文件&#xff0c;添加以下内容&#xff1a; VITE_A…

尝试在软考65天前开始成为软件设计师-计算机网络

OSI/RM 七层模型 层次名功能主要协议7应用层实现具体应用功能 FTP(文件传输)、HTTP、Telnet、 POP3(邮件)SMTP(邮件) ------- DHCP、TFTP(小文件)、 SNMP、 DNS(域名) 6表示层数据格式,加密,压缩.....5会话层建立,管理&终止对话4传输层端到端连接TCP,UDP3网络层分组传输&a…

VMware主机换到高配电脑,高版本系统的问题

原来主机是i3 ,windows7系统&#xff0c;vmware 14.0,虚机系统是ubuntu 14.04。目标新机是i7 14700KF,windows11系统。原以为安装虚拟机&#xff0c;将磁盘文件&#xff0c;虚拟机配置文件拷贝过去可以直接用。 新目标主机先安装了vmware 15&#xff0c;运行原理虚机&#xff0…

【Linux内核系列】:动静态库详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 有些鸟儿是注定是关不住的&#xff0c;因为它们的每一片羽翼都沾满了自由的光辉 ★★★ 本文前置知识&#xff1a; 编译与链接的过程…

windows环境下NER Python项目环境配置(内含真的从头安的perl配置)

注意 本文是基于完整项目的环境配置&#xff0c;即本身可运行项目你拿来用 其中有一些其他问题&#xff0c;知道的忽略即可 导入pycharm基本包怎么下就不说了&#xff08;这个都问&#xff1f;给你一拳o(&#xff40;ω*)o&#xff09; 看perl跳转第5条 1.predict报错多个设备…

IDEA批量替换项目下所有文件中的特定内容

文章目录 1. 问题引入2. 批量替换项目下所有文件中的特定内容2.1 右键项目的根目录&#xff0c;点击在文件中替换2.2 输入要替换的内容 3. 解决替换一整行文本后出现空行的问题4. 增加筛选条件提高匹配的精确度 更多 IDEA 的使用技巧可以查看 IDEA 专栏&#xff1a; IDEA 1. 问…

【蓝桥杯】4535勇闯魔堡(多源BFS + 二分)

思路 k有一个范围&#xff08;0到怪物攻击的最大值&#xff09;&#xff0c;求满足要求的k的最小值。很明显的二分套路。 关键是check函数怎么写&#xff0c;我们需要找到一条从第一行到最后一行的路径&#xff0c;每一次可以从上下左右四个方向前进&#xff0c;那么我么可以用…

HTML图像标签的详细介绍

1. 常用图像格式 格式特点适用场景JPEG有损压缩&#xff0c;文件小&#xff0c;不支持透明适合照片、复杂图像PNG无损压缩&#xff0c;支持透明&#xff08;Alpha通道&#xff09;适合图标、需要透明背景的图片GIF支持动画&#xff0c;最多256色简单动画、低色彩图标WebP谷歌开…

Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics

show zone member: Shows the name of the zone to which a device belongs to. This command can be used to find the victims of a culprit device or vice versa. 显示设备所属的区域名称。该命令可用于查找罪魁祸首设备的受害者,反之亦然。 show zone active: Shows the…

QT三 自定义控件

一 自定义控件 现在的需求是这样&#xff1a; 假设我们要在QWidget 上做定制&#xff0c;这个定制包括了关于 一些事件处理&#xff0c;意味着要重写QWidget的一些代码&#xff0c;这是不实际的&#xff0c;因此我们需要自己写一个MyWidget继承QWidget&#xff0c;然后再MyWi…

在 ASP .NET Core 9.0 中使用 Scalar 创建漂亮的 API 文档

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90407900 Scalar 是一款可帮助我们为 API 创建精美文档的工具。与感觉有些过时的默认 Swagger 文档不同&#xff0c;Scalar 为 API 文档提供了全新而现代的 UI。其简洁的设计让开发人员可以轻松找到测试…

用于 RGB-D 显著目标检测的点感知交互和 CNN 诱导的细化网络(问题)

摘要 问题一&#xff1a;但在对自模态和跨模态的全局长距离依赖关系进行建模方面仍显不足。什么意思&#xff1f; 自模态&#xff08;Intra-modal&#xff09;全局依赖&#xff1a;在同一模态内&#xff0c;长距离像素之间的信息交互对于理解全局背景很重要&#xff0c;但 CN…

python3 -m http.sever 8080加载不了解决办法

解决方法很多&#xff0c;本文设置各种处理方法&#xff0c;逻辑上需要根据你的自身情况选择 我会告诉你遇到这种问题怎么做&#xff0c;根据具体症状处理 如需转载&#xff0c;标记出处 背景&#xff1a; 1。如图 2.。域名访问不了 http://www.meiduo.site:8080/register.ht…

Oracle数据库性能优化全攻略:十大关键方向深度解析与实践指南

文章目录 一、SQL查询优化二、索引优化三、内存管理四、I/O优化五、分区表与分区索引六、并行处理七、统计信息管理八、锁与并发控制九、数据库参数调优十、应用设计优化结论 在当今数据驱动的时代&#xff0c;数据库的性能优化成为了确保企业应用高效运行的关键。Oracle作为业…