- 基于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
- 制作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
- 生成鏡像及發布容器流程:
# 新建鏡像重新發布流程
# 停止正在運行的容器, 如果之前存在失敗安裝可運行此步驟
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