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

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

一、引言

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

二、技术小结

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

三、实践过程

3.1 linux OCI下载

OCI的官方下载地址为:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html , 注意,需要注册登录才能下载。本文使用的压缩包名称及校验码如下所示:

1
2
3
4
5
$ 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/,分别解压之:

1
2
3
4
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,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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,因此拷贝之:

1
2
3
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 镜像进行实验。进入容器,命令如下:

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

在容器中设置环境变量:

1
2
3
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目录,执行命令:

1
./sqlplus my_db/123456@oracle_test 

提示:

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

表示连接成功。

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