我的docker随笔33:在容器中连接oracle数据库

Posted 李迟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的docker随笔33:在容器中连接oracle数据库相关的知识,希望对你有一定的参考价值。

本文涉及一种在容器中连接 oracle 数据库的方法和步骤,最后给出测试结果。至于使用程序的方式连接,则是后续要实施的工作。

一、引言

之前在 Windows 实现了连接 oracle 数据库,本次尝试在 docker 容器中连接数据库,这样,正在用 Golang 开发软件就可在 Windows 和 Linux 上运行了,部署和使用都方便。

二、技术小结

  • 下载 oci 压缩包
  • 解压 oci 包,并设置连接参数
  • 进入容器连接数据库

三、实践过程

3.1 linux OCI下载

登录官方下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html , 需登录才能下载。包名称及校验码如下:

$ cksum *
109893216 63352239 instantclient-basic-linux.x64-12.1.0.2.0.zip
1824795072 1289004 instantclient-odbc-linux.x64-12.1.0.2.0.zip
1047596065 667174 instantclient-sdk-linux.x64-12.1.0.2.0.zip
2255047856 861284 instantclient-sqlplus-linux.x64-12.1.0.2.0.zip

3.2 oci安装

将 oci 压缩包拷贝到/home/latelee/tools/oracle/,解压:

unzip instantclient-basic-linux.x64-12.1.0.2.0.zip
unzip instantclient-odbc-linux.x64-12.1.0.2.0.zip
unzip instantclient-sdk-linux.x64-12.1.0.2.0.zip
unzip instantclient-sqlplus-linux.x64-12.1.0.2.0.zip

解压后得到目录目录为instantclient_12_1,在该目录创建文件tnsnames.ora,内容如下:

foo =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.18.18)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mydb)
    )
  )
  
oracle_test =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.18.18)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCLCDB)
    )
  )

注:根据实际情况修改 oracle_test(表示链接名)、HOST(主机)、PORT(端口)、SERVICE_NAME(数据库服务名)三字段值。

文中将 oci 存储到目录/home/latelee/tools/oracle/instantclient_12_1,是为了方便多个容器映射使用。当然也可以将 oci 的文件放到 docker 镜像中,但笔者认为不太好,故不采用。

3.2 在容器中验证

在主机中拷贝依赖库,本文中使用的sqlplus依赖于动态库libaio.so.1

sudo cp /lib64/libaio.so.1.0.1 /home/latelee/tools/oracle/instantclient_12_1
cd /home/latelee/tools/oracle/instantclient_12_1
sudo ln -s libaio.so.1 libaio.so.1.0.1 

注意,也可将动态库单独拷贝至一 lib 目录,再进行映射,本文图方便直接放到 oci 目录了。

使用 latelee/ubuntu 进行实验。进入容器:

docker run -it --rm -v /home/latelee/tools/oracle/instantclient_12_1:/work/instantclient_12_1 --name foo latelee/ubuntu bash

在容器中设置环境变量:

export ORACLE_HOME=/work/instantclient_12_1
export TNS_ADMIN=$ORACLE_HOME
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/instantclient_12_1

在容器中进入/work/instantclient_12_1目录,执行命令:

./sqlplus my_db/123456@oracle_test 

提示:

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

表示连接成功。

后续将使用 golang 实现程序方式的连接。

以上是关于我的docker随笔33:在容器中连接oracle数据库的主要内容,如果未能解决你的问题,请参考以下文章

我的docker随笔31:oracle数据库再次部署

我的docker随笔29:oracle数据库部署

使用 Docker 容器后无法连接 Oracle 数据库

我的docker随笔28:基于容器的升级方案实验

elastichead 未与 elasticsearch docker 容器连接

从同一个 docker compose 中的 docker 容器拒绝连接