Docker Oracle11g安装,运行和远程连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#拉取oracle11g镜像
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

#开启IPV4_Forwarding,不然docker run会报"docker WARNING: IPv4 forwarding is disabled"
# 在/usr/lib/sysctl.d/00-system.conf末尾追加net.ipv4.ip_forward=1
sudo vim /usr/lib/sysctl.d/00-system.conf

# 重启network和docker
sudo systemctl restart network
sudo systemctl restart docker

#运行oracle11g实例
docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
docker run -d --privileged --name oracle11g -p 1521:1521 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

docker run最后一个参数是IMAGE参数,通过docker images查看并选取。

查看创建的容器是否运行

1
docker ps

若没运行使用

1
docker start `docker ps -ql`

Oracle11g实例配置

运行容器后,利用bash与容器通信

1
docker exec -it oracle11g bash

可以看到是以oracle用户登录的bash

添加环境变量

1
[oracle@2e83efb795d2 ~]$ vi /home/oracle/.bashrc

末尾追加

1
2
3
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH

执行脚本

1
[oracle@2e83efb795d2 ~]$ source /home/oracle/.bashrc

进入sqlplus

1
2
sqlplus /nolog
conn /as sysdba

接下来修改管理员用户的密码

修改用户密码格式为:ALTER USER 用户名 IDENTIFIED BY 密码;

普通管理员为system,超级管理员为sys。

1
2
alter user system identified by 123456;
alter user sys identified by 123456;

创建用户,并给用户赋予权限[可选]

1
2
create user test identified by 123456;
grant connect,resource,dba to test;

修改密码后执行以下命令刷新数据表

1
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

退出sqlplus

1
exit

远程连接Oracle11g实例(Navicat)

远程连接Oracle11g实例(PLSQL)

容器端-修改oracle11g容器上的listener.ora

在与oracle11g实例沟通的bash中输入:

1
2
[oracle@2e506be866a3 /]$ lsnrctl status
[oracle@2e506be866a3 /]$ vi /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/listener.ora

改为

1
2
3
4
5
6
7
8
9
10
11
12
# listener.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)

ADR_BASE_LISTENER = /home/oracle/app/oracle

这样最好改成0.0.0.0,listener是用来监听本容器某端口是否有incoming连接,那么这里就应该将host配置为0.0.0.0。

修改好了就重启下listener:

1
2
3
4
5
# 连接空闲时listener重启
[oracle@2e506be866a3 /]$ lsnrctl reload
# 或者使用stop+start命令:强制切断listener所有连接并重启
[oracle@2e506be866a3 /]$ lsnrctl stop
[oracle@2e506be866a3 /]$ lsnrctl start

查看服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[oracle@2e506be866a3 /]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 22-FEB-2021 15:04:04

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 22-FEB-2021 14:23:50
Uptime 0 days 0 hr. 40 min. 14 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/listener.ora
Listener Log File /home/oracle/app/oracle/diag/tnslsnr/2e506be866a3/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=2e506be866a3)(PORT=1521)))
Services Summary...
Service "helowin" has 1 instance(s).
Instance "helowin", status READY, has 1 handler(s) for this service...
Service "helowinXDB" has 1 instance(s).
Instance "helowin", status READY, has 1 handler(s) for this service...
The command completed successfully

可以看到有两个服务"helowin"和"helowinXDB",都来自于"helowin"实例。

PLSQL配置

下载PLSQL 32位!使用管理员身份运行它。

配置如下图所示:

创建tnsnames.ora

下载并解压instantclient_11_2。

在解压后的instantclient_11_2目录下创建tnsnames.ora文件,然后复制容器中的/home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora文件内容

1
[oracle@2e506be866a3 /]$ cat /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora 

instantclient_11_2/tnsnames.ora内容文件如下:

1
2
3
4
5
6
7
8
9
10
11
# tnsnames.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

helowin =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.5)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = helowinXDB)
)
)

SERVICE_NAME = helowinXDB或SERVICE_NAME = helowin都可以。10.0.0.5是我Docker主机所在地址。

文件中"helowin ="标识符应该与docker容器lsnrctl status查询到的实例名称一致,SERVICE_NAME也是如此。

Database:主机/标识符。主机最好加上,不然有可能报找不到标识符的错误。

一旦你加上主机:Database这两种写法都可以连接到oracle11g容器:

1
2
10.0.0.5/helowin
10.0.0.5/helowinXDB

参考:

docker-images/OracleDatabase/SingleInstance at main · oracle/docker-images

Docker 拉取 oracle 11g镜像配置_荡漾-CSDN博客_docker oracle

docker WARNING: IPv4 forwarding is disabled 问题解决 - 御用闲人 - 博客园

ORACLE-BASE - Change Your Own Password in an Oracle Database

How To List Users in the Oracle Database

ORACLE-BASE - Oracle Network Configuration (listener.ora , tnsnames.ora , sqlnet.ora)

Oracle client ORA-12541: TNS:no listener - Stack Overflow