文章目录
前言
本文将叙述在 ubuntu18.04 中安装 docker,然后下载 oracle11g 镜像安装 oracle 数据库。 一切安装结束之后,想要通过 Navicat 远程连接 docker 中的 oracle 数据库,但是遇到了 ORA-12541:TNS:no listener 等问题,花了好些时间才得以解决,由此想记录一下。一、远程连接 oracle 数据库报错 ORA-12541:TNS:no listener
这个错误,可能是网络不通引起的,我遇到的问题是在 NAT 模式下外界无法访问虚拟机。
要解决这个问题,就需要对虚拟机的几种联网模式有一个基本的了解,在懂的原理的基础上去做相应的修改就会变得很轻松。
二、学习桥接模式、NAT 模式
拿 VirtualBox 中安装的虚拟机为例,来解释一下什么是桥接模式、什么是NAT模式。
参考博客:https://blog.youkuaiyun.com/festone000/article/details/70852377
https://www.linuxidc.com/Linux/2017-03/141864.htm
首先,桥接模式。(它是通过主机网卡,架设了一座桥,直接连入互联网中,虚拟机由此能分配到一个网络中的独立 IP,所有网络功能与网络中的真实机器一样。可以把网桥模式下的虚拟机看做是一台独立的电脑,其访问属性与主机一样)
也可以等价为:
接着,NAT 模式。(虚拟机访问网络的所有数据都是主机提供的,虚拟机并不真实存在于网络中,主机与网络中的任何机器都不能访问该虚拟机。而虚拟机可以访问主机能访问到的所有网络。)
但是,我们有个需求是通过主机访问虚拟机中的数据库,那怎么办呢?
NAT 模式可以通过绑定静态转发供外部访问。
进入 VirtualBox 的如下界面,选择网络地址转换(NAT),再单击端口转发
主机 IP 填写默认的 127.0.0.1 就可以了,子系统 IP 需要填写自己虚拟机的 IP (可以在虚拟机中通过 ipconfig 命令查看)
整体的思路是:将虚拟机的某个端口映射到主机的某个端口,以供外界访问。
看到这相信远程连接虚拟机下的 oracle 数据库的大体思路已经有了,接下来就是具体的一些简单命令部署 docker 中的 oracle 数据库镜像的问题了。
三、在 docker 中安装 oracle11g
1. sudo apt-get update
2. sudo apt install docker.io
3. systemctl start docker 启动 docker
4. systemctl enable docker 设置开机启动 docker
5. docker images 列出已下载的镜像
6. docker rmi hello-world 删除指定镜像
7. docker search oracle 搜索 oracle 镜像
8. docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 下载 oracle 镜像
9. docker run -d -p 1521:1521 --name oracle11g registry.aliyuncs.com/helowin/oracle_11g
docker run 命令 -d 后台启动,-p 设置映射端口
10. docker start oracle11g 启动 oracle 镜像
11. docker ps 查看当前 docker 状态(查看各个镜像)
12. sudo docker exec -it oracle11g bash 进入 oracle 镜像内,修改信息。
13. source /home/oracle/.bash_profile 加载环境变量,该文件内有相关的配置。
14. sqlplus / as sysdba
#该命令需要在 oracle 账户下使用,在 root 账户下会报错。
#oracle 数据库相关操作
#创建用户 sql > create user sxj identified by sxj;
#用户授权 sql > grant resource, connect, dba to sxj;
#提交 sql > commit;
#exit退出以sxj用户登陆即可。
#如果system用户的密码忘记了,则可以用此命令登陆后
#执行 alter user system identified by manager; 来修改密码
15. lsnrctl stop/start 重启监听
16. 以上就是启动 oracle 的详细教程。下面是一些注意事项:
oracle 的 root 用户密码是 helowin
进入 oracle 镜像后想进入root用户,可输入:su root
四、oracle 常见问题
按照上面的方法启动了 oracle 数据库后,当我再次重启虚拟机的时候执行 docker ps 发现 oracle 已经断开了(暂时不排除我的 oracle 启动是有一个有效时长的,那么我现在再启动一下,看看究竟如何)重启后发现确实 oracle 已经断开了,这可以解决吗?(感觉这个想法有点过于无脑,因为当我的虚拟机关机的时候,所有的进程都会杀死,所以重启后当然除了环境变量中加载的之外,其他的肯定都没有启动。)
那如何解决呢?
首先进入镜像,去找到oratab,使用命令 find -name oratab
将查找到的路径下的文件全部修改成:orcl:/home/rogear/tools/oracle11g/product/11.2.0/dbhome_1:N中的N改为Y,这样只要启动docker中的oracle镜像就直接可以远程连接啦,不需要之前的加载环境变量了。
这还不能满足虚拟机启动时就启动docker对应的镜像。
于是通过命令修改 oracle11g 镜像的相关配置:docker update --restart=always <容器名字>
ok完美解决。