
目录1、需求背景说明2、具体操作步骤说明2-1、下载基础镜像编辑2-2、通过下载的镜像启动容器2-3、报错问题的处理2-3-1、解决步骤12-3-2、解决步骤22-4、重新启动容器2-5、进入容器并新建业务用户2-6、开启系统防火墙通过DBeaver连接数据库并新建数据表3、参考文献1、需求背景说明最近开发环境需要安装1个Oracle数据库便于开发调试但是使用传统方式安装Oracle呢感觉步骤相对繁琐耗时也比较长因此考虑使用Docker方式进行部署比较简便一些。特此做一下安装和使用的过程记录。2、具体操作步骤说明2-1、下载基础镜像docker pull gvenzl/oracle-xe:112-2、通过下载的镜像启动容器启动命令如下docker run -d \ --name oracle11g \ --shm-size1g \ -p 1521:1521 \ -p 8081:8080 \ -e ORACLE_PASSWORDOracle123456 \ -v /data/oracle11g:/u01/app/oracle/oradata \ gvenzl/oracle-xe:11这里需要提前在宿主机上提前将目录/data/oracle11g做新建然而仅使用root用户新建后续还会遇到一个报错问题。2-3、报错问题的处理具体启动后通过查看日志的命令docker logs -f oracle11g可以看到如下的报错问题ERROR: Cannot create folder : errno13 : Permission denied : /u01/app/oracle/oradata/XE ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/control.dbf ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/redo01.log ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/redo02.log ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/sysaux.dbf ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/system.dbf ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/temp.dbf ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/undotbs1.dbf ERROR: Cannot open output file : errno2 : No such file or directory : /u01/app/oracle/oradata/XE/users.dbf初步看下来报错内容说的是创建数据库文件例如control.dbf、system.dbf、sysaux.dbf等但当前 Docker 容器内运行 Oracle 的用户没有该目录的写入权限。2-3-1、解决步骤1chmod -R 777 /data/oracle11g这一步是为了快速验证是否为权限问题。777只建议临时排查使用不建议长期保留。2-3-2、解决步骤2执行下面的命令查询镜像中 Oracle 用户的实际权限docker run --rm \ --entrypoint bash \ gvenzl/oracle-xe:11 \ -c id oracle建议将目录所有者修改为Oracle用户chown -R 1000:1000 /data/oracle11g chmod -R 750 /data/oracle11g2-4、重新启动容器如果启动有报错的容器需要先删除。docker rm -f oracle11g再次使用之前的启动命令后通过以下命令查看容器的启动情况docker ps docker logs -f oracle11g这次可以看到容器被成功启动了。2-5、进入容器并新建业务用户docker exec -it oracle11g bash # 登录系统 sqlplus / as sysdba # 创建业务用户 CREATE USER STOCK IDENTIFIED BY STOCKabc123; GRANT CONNECT, RESOURCE TO STOCK; ALTER USER STOCK QUOTA UNLIMITED ON USERS;2-6、开启系统防火墙通过DBeaver连接数据库并新建数据表需要先开启系统的1521端口的防火墙[rootlocalhost data]# firewall-cmd --permanent --zonepublic --add-port1521/tcp success [rootlocalhost data]# firewall-cmd --zonepublic --list-ports 3306/tcp 9092/tcp 8099/tcp 8000/tcp 8080/tcp 3307/tcp 80/tcp 6379/tcp 2181/tcp [rootlocalhost data]# firewall-cmd --reload success新建数据表与示例数据插入的SQL语句CREATE TABLE STOCK_INFO ( ID NUMBER(10) NOT NULL, STOCK_CODE VARCHAR2(20) NOT NULL, STOCK_NAME VARCHAR2(100) NOT NULL, PRICE NUMBER(10,2), CHANGE_RATE NUMBER(8,2), MARKET VARCHAR2(20), CREATE_TIME DATE DEFAULT SYSDATE, CONSTRAINT PK_STOCK_INFO PRIMARY KEY (ID) ); COMMENT ON TABLE STOCK_INFO IS 股票信息测试表; COMMENT ON COLUMN STOCK_INFO.ID IS 主键ID; COMMENT ON COLUMN STOCK_INFO.STOCK_CODE IS 股票代码; COMMENT ON COLUMN STOCK_INFO.STOCK_NAME IS 股票名称; COMMENT ON COLUMN STOCK_INFO.PRICE IS 当前价格; COMMENT ON COLUMN STOCK_INFO.CHANGE_RATE IS 涨跌幅(%); COMMENT ON COLUMN STOCK_INFO.MARKET IS 所属市场; COMMENT ON COLUMN STOCK_INFO.CREATE_TIME IS 创建时间; SELECT * FROM STOCK_INFO; INSERT INTO STOCK_INFO VALUES (1, 600519, 贵州茅台, 1520.50, 2.35, SH, SYSDATE); INSERT INTO STOCK_INFO VALUES (2, 000858, 五粮液, 135.80, -1.25, SZ, SYSDATE); INSERT INTO STOCK_INFO VALUES (3, 601318, 中国平安, 48.60, 0.85, SH, SYSDATE); INSERT INTO STOCK_INFO VALUES (4, 000001, 平安银行, 11.25, -0.65, SZ, SYSDATE); INSERT INTO STOCK_INFO VALUES (5, 600036, 招商银行, 38.90, 1.56, SH, SYSDATE); COMMIT;最后可以看到如下的效果图3、参考文献firewalld firewall-cmd 常用命令 - klvchen - 博客园