在Docker中对Oracle进行容器化部署,看这一篇就够了!

5,857 阅读3分钟

写在前

由于本机mac空间不够(哈哈,促进我学习),所以想搭建一个云Oracle环境。

之前写过windows搭建的,但是之前11g(项目要求)一直安装不上,索性就把服务器换成linux,准备改用docker的方式来进行搭建。


总体步骤

  1. 阿里云申请 linux 服务器,这里我的是 CentOS 7.4 。
  2. 安装 docker
  3. 下载 Oracle 镜像并安装。
  4. 导入数据(通过DMP导入,需创建表空间,用户等)。

Docker简介

Docker简单来说,就是一个虚拟机,你要什么应用,就直接输入命令安装,不用就直接删掉,沙盒傻瓜式。官方logo就是鲸鱼上面载着货物,这里我主要是用来安装 Oraclemysqltomcat什么的。logo如下图:

image.png

废话不多说,就让我们开始吧。


一,安装docker

对于 linux 服务器来说,安装docker非常简单,不过需要 CentOS 内核版本高于 3.10,使用uname -r 来查看。如下图:

具体的安装步骤,可以参考这篇博文 blog.csdn.net/qq_36892341…,写得很清楚,就不再赘述,如有不懂,可以留言。


二,下载Oracle镜像并安装

使用docker search oracle 来搜索 oracle 的版本,我这里选用的是 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g ,这是阿里云的一个 oracle 11g 版本,需要其他版本的小伙伴可以自行选择。

使用如下命令来进行镜像的拉取

docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

拉取完后,可以使用 docker images 来查看已有镜像

可以看到,REPOSITORY 就是镜像名称,TAG 是版本号,IMAGE ID 是镜像的编号,后面的见名知意了。

启动 Oracle 服务,使用如下命令即可,-p 将容器的 8080 端口映射到主机的 8080 端口(-p 主机端口:容器端口)

docker run --name registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g -p 1521:1521

之后使用 docker ps 来看启动中的容器。

 这里可以看到,oracle 服务已经启动(即 ff94a17f84a7)


三,导入数据、用户及表空间创建

3.1,导入 dmp 数据文件

首先,需要从本机拷贝 dmp(从其他库导出的数据文件,包含数据 + 表结构等) 数据到 Oracle 容器中

格式:docker cp /本地文件地址 容器ID:/容器文件存储地址,如下:

docker cp /home/oracle/data_20181104.dmp ff94a17f84a7:/home/cloudera

【注:容器ID(这里我的是ff94a17f84a7)请换成自己的】 

3.2,创建表空间及用户

使用如下命令进入 docker 容器内

docker exec -it ff94a17f84a7 bash

使用数据库管理员方式进行登录

这里我使用 sqlplus,提示 command not found ,不用担心,使用 su - oracle 切换下用户到 oracle 用户 ,然后 sqlplus,之后 sys/sys as sysdba 进行登录,如下图,登录成功!

进行表空间的创建:

这里分为四小步:

1,创建临时表空间:

create temporary tablespace TEST_DBF_TEMP tempfile '/home/oracle/data/TEST_DBF_TEMP.dbf' size 50m autoextend on next 50m maxsize 2048m;

2,创建正式表空间:

create  tablespace TEST_DBF datafile '/home/oracle/data/TEST_DBF.dbf' size 50M autoextend on next 50m maxsize 2048m;

 3,创建用户并且指定表空间:

create user TEST identified by "123" default tablespace TEST_DBF temporary tablespace TEST_DBF_TEMP;

4,用户授权:

grant create session,connect,resource,dba to TEST;

3.3,导入 dmp 文件:

imp TEST/123 file = /data_20181210.dmp full=y;

静静等待导入完成即可。


PS:阿里云记得去云服务器控制台开放数据库对应的端口即可外网连接。

 配置规则 

 选择克隆一个,输入 docker psoracle 对应的主机端口即可:

配上成功图:

Bingo!


常见问题(不定时更新):

Oracle服务无法连接&挂掉重启

今天起来准备工作,Oracle无法连接了,可能原因:

  1. 连接时使用的sid不正确,进入容器,连接后使用 SELECT name FROM v$database; 查看SID。
  2. dokcer容器中 Oracle 挂了。
  3. 其他未知原因(如电脑没有连网,磁盘空间满了,用户名密码错误等)。

马上进服务器去docker ps 查询在线容器,但是发现Oracle还在。

于是,docker exec -it ff94a17f84a7 bash 进入到容器 。

lsnrctl start启动监听程序,如下图,提示已经启动了。

sqlplus  /nolog进入,conn / as sysdba管理员连接,然后startup ,如下图,提示启动成功,数据库打开。

Bingo!


重启容器后,端口变更,设置固定端口

  1. 查看需要修改的容器,记住 container id

docker ps -a


2. 停止容器

docker stop xxx

  1. 修改容器的端口映射配置文件

vim /var/lib/docker/containers/{container_id}/hostconfig.json

"PortBindings": {
     "80/tcp": [
             {
             "HostIp": "",
             "HostPort": "8080"//宿主机ip
             }
         ]
     },

4.重启docker服务

service docker restart


5.启动容器

docker start xxx


Error response from daemon: Cannot XX container

这个错误还真的是奇葩,我放个元旦回来,就什么都操作不了了?

解决方案

重启 docker 服务

systemctl restart docker

重启容器成功