制作Oracle11g Docker 镜像

  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 /tmpUSER 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.shUSER 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 1EXPOSE 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.mzph.cn/bicheng/74191.shtml

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

相关文章

从GTC2025首次量子日看英伟达量子AI融合算力网络前景与趋势

GTC2025 Quantum Day 最新内容全部汇总: 技术名称描述合作伙伴/开发者应用场景/目标量子模拟器优化方案NVIDIA与IonQ、D-Wave合作,针对量子模拟器进行性能优化,提升量子计算任务效率。IonQ、D-Wave量子算法开发、复杂系统模拟混合量子-经典计算架构结合量子计算与经典GPU加速…

UE4学习笔记 FPS游戏制作12 添加第二把枪,制作枪的父类,动态生成物体,切换武器

我们添加一个发射器类型的枪 我们目前有了一个Rifle的枪械蓝图&#xff0c;我们在添加Launcher时&#xff0c;需要为他们添加一个父类&#xff0c;将公共方法放到父类里&#xff0c;方法体由子类实现 添加父类 方法1 新建一个Gun的蓝图&#xff0c;Gun继承Actor&#xff0c;…

【原创首发】开源基于AT32 SIP/VOIP电话

前言 本次为了反馈各位粉丝的关注&#xff0c;特此分享 AT32_VOIP 工程&#xff0c;此功能其实跟我之前发过的《STM32F429的VOIP功能》是一样的&#xff0c;只是用了AT32F437。 其实那个工程是一个比较Demo中的Demo&#xff0c;很多功能和硬件依赖性太大了。后面项目中发现AT…

通俗易懂搞懂@RequestParam 和 @RequestBody

&#x1f4cc; 博主简介: &#x1f4bb; 努力学习的 23 级科班生一枚 &#x1f680;&#x1f3e0; 博主主页 &#xff1a; &#x1f4ce; 灰阳阳&#x1f4da; 往期回顾 &#xff1a;Session和Cookie我不允许你不懂&#x1f4ac; 每日一言&#xff1a; 「流水不争先&#xff0c…

dubbo版本与分组

Dubbo服务中&#xff0c;接口并不能唯一确定一个服务&#xff0c;只有 接口分组版本号 的三元组才能唯一确定一个服务。 当同一个接口针对不同的业务场景、不同的使用需求或者不同的功能模块等场景&#xff0c;可使用服务分组来区分不同的实现方式。同时&#xff0c;这些不同实…

RAG现有技术方案

RAG现有技术方案 一、现有技术方案的核心问题 检索质量不足 挑战:传统RAG系统依赖单轮检索,难以应对智能电网的海量异构数据(如传感器读数、控制参数),导致检索结果相关性低、覆盖不全。案例:BM25稀疏检索在处理长文本或专业术语时,易遗漏语义关联;BGE等稠密检索模型对…

redis MISCONF Redis is configured to save RDB snapshots报错解决

直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis

个人学习编程(3-22) leetcode刷题

连续子数组&#xff1a;&#xff08;难&#xff09; 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…

希尔排序

希尔排序是一种改进的插入排序算法&#xff0c;它通过将原始数据分成多个子序列来改善插入排序的性能&#xff0c;每个子序列的元素间隔为 d&#xff08;增量&#xff09;。随着算法的进行&#xff0c;d 逐渐减小&#xff0c;最终减为 1&#xff0c;此时整个序列就被排序好了。…

JavaScript基础-DOM事件流

在Web开发过程中&#xff0c;理解和掌握DOM事件流是实现高效交互的关键。DOM事件流描述了当一个事件发生时&#xff0c;它在文档树中的传播路径。了解事件流的概念有助于我们更精确地控制事件处理逻辑&#xff0c;避免不必要的行为&#xff0c;并提升用户体验。本文将深入探讨D…

C语言基础知识07---预编译模块化

目录 预编译指令 1.1 编译流程 1.2 文件包含 1.3 条件编译 1.4 宏定义 1.5 无参宏 1.6 typedef和无参宏的区别 1.7 有参宏 1.8 函数与有参宏的区别 1.9 取消宏定义 #undef 1.10 符合使用 模块化操作 1.1 H文件&#xff1a;固定模版 1.2 C文件&#xff1a;源文件-…

自由学习记录(46)

CG语法的数据类型 // uint : 无符号整数&#xff08;32位&#xff09; // int : 有符号整数&#xff08;32位&#xff09; // float : 单精度浮点数&#xff08;32位&#xff09;&#xff0c;通常带后缀 f&#xff08;如 1.0f&#xff09; // half : 半精度浮…

Agent:大模型中的智能“函数”

在传统的编程范式中&#xff0c;函数是执行特定任务的基本单元。它们接收输入参数&#xff0c;执行预定义的操作&#xff0c;并返回结果。这种模式在确定性和结构化任务中非常有效&#xff0c;但在处理复杂、开放性和非结构化的任务时&#xff0c;函数的局限性就显现出来了。随…

【数据结构】kmp算法介绍+模板代码

目录 1.kmp算法介绍 2.应用场景 3.KMP与暴力算法比较 4.模板代码 KMP算法是一种高效的字符串匹配算法&#xff0c;用于在文本串中快速查找模式串的所有出现位置。其核心思想是通过预处理模式串&#xff0c;避免在匹配失败时进行不必要的回溯&#xff0c;从而将时间复杂度优…

(自用)yolo算法学习

1.难受中&#xff0c;看了教程过后无从下手啊 2.pycharm专业版成功就好 3.安装包时出先问题 (base) PS G:\pycharm\projects\yolo\yolov5> pip install opencv-python>4.1.1 Requirement already satisfied: opencv-python>4.1.1 in g:\anaconda\app\lib\site-packa…

实用工具-Another Redis Desktop Manager介绍

GitHub&#xff1a;https://github.com/qishibo/AnotherRedisDesktopManager/releases Gitee&#xff1a;AnotherRedisDesktopManager 发行版 - Gitee.com Another Redis Desktop Manager 是一款免费的 Redis 可视化管理工具&#xff0c;具有以下特点和功能&#xff1a; 特…

【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Networking】系列。 前言 最近公司的安全部门在审计云环境安全性时经常提到service endpoint&#xff08;SE&#xff09;和priavate endpoint&#xff08;PE&#xff09;的术语&#xff0c;为此做了一些研究储备。 云…

【汽车开发工具选型指南】Jama Connect® for Automotive解决方案解析

本文来源jamasoftware.com&#xff0c;由Jama Software授权合作伙伴-龙智翻译整理。 Jama Connect for Automotive是什么&#xff1f; Jama Connect for Automotive 旨在为开发团队提供一个统一平台&#xff0c;用于构建安全关键型和网络安全关键型产品。提供满足行业标准和法…

同旺科技USB to SPI 适配器 ---- 指令循环发送功能

所需设备&#xff1a; 内附链接 1、同旺科技USB to SPI 适配器 1、周期性的指令一次输入&#xff0c;即可以使用 “单次发送” 功能&#xff0c;也可以使用 “循环发送” 功能&#xff0c;大大减轻发送指令的编辑效率&#xff1b; 2、 “单次发送” 功能&#xff0c;“发送数据…

分布式中间件:基于 Redis 实现分布式锁

分布式中间件&#xff1a;基于 Redis 实现分布式锁 一、背景引入 在当今的互联网应用中&#xff0c;分布式系统变得越来越常见。在分布式环境下&#xff0c;多个服务实例可能会同时对共享资源进行读写操作&#xff0c;这就很容易引发数据不一致等问题。比如电商系统中的库存扣…