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

445 阅读1分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

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

一、引言

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

二、技术小结

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

三、实践过程

3.1 linux OCI下载

OCI的官方下载地址为:www.oracle.com/database/te… , 注意,需要注册登录才能下载。本文使用的压缩包名称及校验码如下所示:

$ 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(数据库所在服务器IP)、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 实现程序方式的连接。