一.安装 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.sh
Usage: buildDockerImage.sh -v [version] [-e | -s | -x] [-i] [-o] [Docker build option]
Builds a Docker Image for Oracle Database.
Parameters:
-v: version to build
Choose 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 -x
LICENSE UPL 1.0
Copyright (c) 2014-2019 Oracle and/or its affiliates. All rights reserved.
复制
[root@host01 oracle19c]# ./buildDockerImage.sh -v 19.3.0 -e
复制
成功后有如下信息
Successfully built 1caec1c121df
Successfully tagged oracle/database:19.3.0-ee
Oracle Database Docker Image for 'ee' version 19.3.0 is ready to be extended:
--> oracle/database:19.3.0-ee
Build completed in 747 seconds.
复制
4.查看本地镜像
[root@host01 oracle19c]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
oracle/database 19.3.0-ee 1caec1c121df About a minute ago 6.65GB
oraclelinux 7-slim 874477adb545 3 months ago 118MB
复制
5.推送镜像到 Dockers Hub
(1) 登陆
[root@host01 oracle19c]# docker login
Login 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: haoxy
Password:
WARNING! Your password will be stored unencrypted in root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
复制
(2) 修改标签名
[root@host01 oracle19c]# docker tag 1caec1c121df haoxy/oracle:19.3.0-ee
[root@host01 oracle19c]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
oracle/database 19.3.0-ee 1caec1c121df 8 minutes ago 6.65GB
haoxy/oracle 19.3.0-ee 1caec1c121df 8 minutes ago 6.65GB
oraclelinux 7-slim 874477adb545 3 months ago 118MB
复制
重命名后,原镜像不会删除,上面虽然显示两个镜像名称,但是只占用一个镜像空间的大小。
(3) 推送
[root@host01 oracle19c]# docker push haoxy/oracle
The push refers to repository [docker.io/haoxy/oracle]
7dcb96c29b40: Pushed
adef7158b341: Pushing [=======> ] 884.3MB/6.194GB
5da4f7b166ca: Pushed
72cb79fc5cfc: Pushed
c22990bcbeec: Pushed
4fee40bcfecf: 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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-beijing.aliyuncs.com/haoxy/oracle19c 19.3.0-ee 29678b999bb3 25 hours ago 6.65GB
haoxy/oracle 19.3.0-ee 29678b999bb3 25 hours ago 6.65GB
oracle/database 19.3.0-ee 29678b999bb3 25 hours ago 6.65GB
oraclelinux 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-ee
Parameters:
--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/oradata
The 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/startup
Optional: 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/setup
Optional: 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 ora19c
ora19c
复制
2.删除容器
[root@host01 oracle19c]# docker rm ora19c
ora19c
[root@host01 oracle19c]# docker ps -a
CONTAINER 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/bash
bash-4.2# cd /opt/oracle/
bash-4.2# ls -l
drwxr-xr-x. 2 root root 6 Nov 13 04:04 oradata
bash-4.2# chown oracle:dba oradata/
bash-4.2# ls -l
drwxr-xr-x. 2 oracle dba 6 Nov 13 04:04 oradata
复制
重启容器进程,开始创建。
docker stop ora19c
docker 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