一.安装 docker
参考:CentOS 7.7 安装新版本 docker(在线)
二. 构建准备工作
1. 下载 oracle dockerfiles
从 Oracle 官方 Github[1]下载 dockerfiles,如图

各版本目录下存放构建镜像所需要的脚本,包括 Dockerfile。buildDockerImage.sh 为集成 docker build 的自动化脚本。

上传对应版本的 dockerfiles 和 buildDockerImage.sh 脚本到 docker 服务器上,下载[2]数据库安装文件 linuxx64__database.zip 文件,不要解压放到对应版本目录的 dockerfiles 目录下。

2.修改 Dockerfile
在 56 行添加
RUN chmod 777 $INSTALL_DIR -R#此位置添加上面的语句RUN chmod ug+x $INSTALL_DIR/*.sh && \sync && \$INSTALL_DIR/$CHECK_SPACE_FILE && \$INSTALL_DIR/$SETUP_LINUX_FILE && \rm -rf $INSTALL_DIR
如不添加,创建完镜像后,oradata 权限有问题,无法启动容器。报错见最后
3.开始构建
# 给脚本执行权限[root@host01 oracle19c]# chmod +x buildDockerImage.sh# 查看帮助[root@host01 oracle19c]# ./buildDockerImage.shUsage: buildDockerImage.sh -v [version] [-e | -s | -x] [-i] [-o] [Docker build option]Builds a Docker Image for Oracle Database.Parameters:-v: version to buildChoose one of: 19.3.0-e: creates image based on 'Enterprise Edition'-s: creates image based on 'Standard Edition 2'-x: creates image based on 'Express Edition'-i: ignores the MD5 checksums-o: passes on Docker build option* select one edition only: -e, -s, or -xLICENSE UPL 1.0Copyright (c) 2014-2019 Oracle and/or its affiliates. All rights reserved.
[root@host01 oracle19c]# ./buildDockerImage.sh -v 19.3.0 -e
成功后有如下信息
Successfully built 1caec1c121dfSuccessfully tagged oracle/database:19.3.0-eeOracle Database Docker Image for 'ee' version 19.3.0 is ready to be extended:--> oracle/database:19.3.0-eeBuild completed in 747 seconds.
4.查看本地镜像
[root@host01 oracle19c]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEoracle/database 19.3.0-ee 1caec1c121df About a minute ago 6.65GBoraclelinux 7-slim 874477adb545 3 months ago 118MB
5.推送镜像到 Dockers Hub
(1) 登陆
[root@host01 oracle19c]# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: haoxyPassword:WARNING! Your password will be stored unencrypted in root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
(2) 修改标签名
[root@host01 oracle19c]# docker tag 1caec1c121df haoxy/oracle:19.3.0-ee[root@host01 oracle19c]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEoracle/database 19.3.0-ee 1caec1c121df 8 minutes ago 6.65GBhaoxy/oracle 19.3.0-ee 1caec1c121df 8 minutes ago 6.65GBoraclelinux 7-slim 874477adb545 3 months ago 118MB
重命名后,原镜像不会删除,上面虽然显示两个镜像名称,但是只占用一个镜像空间的大小。
(3) 推送
[root@host01 oracle19c]# docker push haoxy/oracleThe push refers to repository [docker.io/haoxy/oracle]7dcb96c29b40: Pushedadef7158b341: Pushing [=======> ] 884.3MB/6.194GB5da4f7b166ca: Pushed72cb79fc5cfc: Pushedc22990bcbeec: Pushed4fee40bcfecf: Mounted from library/oraclelinux
推送后登陆到 dockerhub 看不到上传的镜像,需要自己创建

创建 oracle

创建完成后返回查看

推送到阿里云 Dockers Hub
docker login --username=hao_xy registry.cn-beijing.aliyuncs.com
[root@host01 ~]# docker tag 29678b999bb3 registry.cn-beijing.aliyuncs.com/haoxy/oracle19c:19.3.0-ee[root@host01 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEregistry.cn-beijing.aliyuncs.com/haoxy/oracle19c 19.3.0-ee 29678b999bb3 25 hours ago 6.65GBhaoxy/oracle 19.3.0-ee 29678b999bb3 25 hours ago 6.65GBoracle/database 19.3.0-ee 29678b999bb3 25 hours ago 6.65GBoraclelinux 7-slim 874477adb545 3 months ago 118MB
三、启动容器
docker run --name <container name> \-p <host port>:1521 -p <host port>:5500 \-e ORACLE_SID=<your SID> \-e ORACLE_PDB=<your PDB name> \-e ORACLE_PWD=<your database passwords> \-e ORACLE_CHARACTERSET=<your character set> \-v [<host mount point>:]/opt/oracle/oradata \oracle/database:19.3.0-eeParameters:--name: The name of the container (default: auto generated)-p: The port mapping of the host port to the container port.Two ports are exposed: 1521 (Oracle Listener), 5500 (OEM Express)-e ORACLE_SID: The Oracle Database SID that should be used (default: ORCLCDB)-e ORACLE_PDB: The Oracle Database PDB name that should be used (default: ORCLPDB1)-e ORACLE_PWD: The Oracle Database SYS, SYSTEM and PDB_ADMIN password (default: auto generated)-e ORACLE_CHARACTERSET:The character set to use when creating the database (default: AL32UTF8)-v opt/oracle/oradataThe data volume to use for the database.Has to be writable by the Unix "oracle" (uid: 54321) user inside the container!If omitted the database will not be persisted over container recreation.-v opt/oracle/scripts/startup | docker-entrypoint-initdb.d/startupOptional: A volume with custom scripts to be run after database startup.For further details see the "Running scripts after setup and on startup" section below.-v /opt/oracle/scripts/setup | /docker-entrypoint-initdb.d/setupOptional: A volume with custom scripts to be run after database setup.For further details see the "Running scripts after setup and on startup" section below.
在本地(宿主机上)创建数据库挂载目录,实现数据文件持久化
mkdir -p /oracle/oracle19c/data
启动
docker run -d -it --name ora19c -p 1521:1521 -p 5500:5500 -e ORACLE_SID=orcl -e ORACLE_PWD=oracle -v /oracle/oracle19c/data:/opt/oracle/oradata haoxy/oracle:19.3.0-ee
-v 容器的数据放在本地的/oracle/oracle19c/data 下面,不会因为容器的删除而删除数据。相当于在容器的/opt/oracle/oradata 挂载了本地的/oracle/oracle19c/data 目录。
四、重用持久化数据文件
1.停止现在的容器
[root@host01 oracle19c]# docker stop ora19cora19c
2.删除容器
[root@host01 oracle19c]# docker rm ora19cora19c[root@host01 oracle19c]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3. 重新创建容器
使用原来的 SID,进行创建容器,新建的容器会直接重用持久化的数据文件启动数据库。
[root@host01 oracle19c]# docker run -d -it --name ora19c -p 1521:1521 -p 5500:5500 -e ORACLE_SID=orcl -e ORACLE_PWD=oracle -v /oracle/oracle19c/data:/opt/oracle/oradata haoxy/oracle:19.3.0-ee
查看 log,创建的容器会使用原来的数据文件,直接启动数据库。
五、外部访问 Docker 内的 oracle
使用 本地的 IP 地址,映射的端口号,容器内 Oracle SID 进行连接。

附一、不修改 Dockerfile 启动镜像报错:
如果不修改 Dockerfile 启动容器的时候报

进入容器查看 oradata 权限为
drwxr-xr-x. 2 root root 6 Nov 13 04:04 oradata
root 进入容器,修改/opt/oracle/oradata 的权限
docker exec -u 0 -it --privileged ora19c /bin/bashbash-4.2# cd /opt/oracle/bash-4.2# ls -ldrwxr-xr-x. 2 root root 6 Nov 13 04:04 oradatabash-4.2# chown oracle:dba oradata/bash-4.2# ls -ldrwxr-xr-x. 2 oracle dba 6 Nov 13 04:04 oradata
重启容器进程,开始创建。
docker stop ora19cdocker start ora19c
附二、Docker Hub 加速器
Docker Hub 提供众多镜像,你可以从中自由下载数十万计的免费应用镜像, 这些镜像作为 docker 生态圈的基石,是我们使用和学习 docker 不可或缺的资源。为了解决国内用户使用 Docker Hub 时遇到的稳定性及速度问题 DaoCloud 推出永久免费的新一代镜像站服务。配置 Daocloud 免费的 Docker Hub 加速器[3]
附三、欢迎使用构建的镜像
1. 拉取镜像
docker pull haoxy/oracle:19.3.0-ee
2. 启动镜像
创建本地挂载点
#在本地(宿主机上)创建数据库挂载目录:mkdir -p /oracle/oracle19c/data
启动容器
docker run -d -it --name ora19c \-p 1521:1521 \-p 5500:5500 \-e ORACLE_SID=orcl \-e ORACLE_PWD=oracle \-v /oracle/oracle19c/data:/opt/oracle/oradata haoxy/oracle:12.2.0.1\-ee
-d 在后台运行
-it 提供一个交互界面
-v 容器的数据放在本地的/oracle/oracle19c/data下面,不会因为容器的删除而删除数据。相当于在容器的/opt/oracle/oradata挂载了本地的/oracle/oracle19c/data目录。
实时查看日志
docker logs -f ora19c
出现下面提示,表示启动成功
#########################DATABASE IS READY TO USE!#########################
3. root用户登陆镜像
docker exec -u 0 -it --privileged ora19c /bin/bash
进入后可以修改root密码
参考资料
从Oracle官方Github: https://github.com/oracle/docker-images/tree/master/OracleDatabase
[2]Oracle软件下载地址: https://www.oracle.com/database/technologies/oracle-database-software-downloads.html
[3]配置Daocloud 免费的Docker Hub加速器: https://www.daocloud.io/mirror#accelerator-doc




