如何通过Docker容器使用Sqoop将SQL Server数据导入HDFS?解决容器间连接失败问题
首先咱得戳破核心问题:你在Cloudera容器里用localhost:1433访问SQL Server容器是错的——每个Docker容器都有独立的网络栈,localhost在Cloudera容器里指向它自己,根本不是你的SQL Server容器。好在两个容器已经加入了同一个自定义网络nc-de-network,这时候直接用SQL Server容器的名称或hostname就能通信,不用绕弯子。
步骤1:修正Sqoop连接命令
把连接字符串里的localhost换成SQL Server容器的名称data-engr-sql-svr(或者你设置的hostname,两者在同一Docker网络里是等效的)。另外注意一个细节:你启动SQL Server时用的SA密码是mypassword,但Sqoop命令里写的是pwd,这俩得保持一致!
修正后的命令如下:
sudo -u hdfs sqoop list-databases \ --connect "jdbc:sqlserver://data-engr-sql-svr:1433;databaseName=AdventureWorks2019" \ --username sa \ --password mypassword
注:这里去掉了instanceName参数,因为你启动的是SQL Server默认实例,不需要额外指定;如果确实是命名实例,再加回去就行。
步骤2:验证容器间网络连通性
如果还是报错,先在Cloudera容器里测试网络通不通:
- 进入Cloudera容器:
docker exec -it cnt7-xxx-cdh63 bash
- 用telnet测试1433端口(没装telnet的话先跑
yum install telnet -y):
telnet data-engr-sql-svr 1433
如果能成功连接,说明网络没问题,问题出在Sqoop配置或认证;如果连不上,检查两个容器是否真在同一个网络:
docker inspect data-engr-sql-svr | grep Networks docker inspect cnt7-xxx-cdh63 | grep Networks
确保两者的nc-de-network都存在。
步骤3:确认SQL Server的TCP/IP配置
因为你本地笔记本能正常连SQL Server容器,说明宿主机端口映射没问题,但容器内的SQL Server是否开了TCP/IP?官方镜像默认是开启的,保险起见可以验证:
docker exec -it data-engr-sql-svr bash /opt/mssql/bin/mssql-conf show network.tcp.enabled
返回1就是开启状态,不用管;返回0的话跑/opt/mssql/bin/mssql-conf set network.tcp.enabled 1再重启容器。
额外提醒
- 先确认两个容器都在运行:
docker ps看data-engr-sql-svr和cnt7-xxx-cdh63的状态都是Up - 如果SQL Server容器重启过,IP可能变,但用容器名访问不受影响(Docker内置DNS会自动解析)
内容的提问来源于stack exchange,提问作者jarvis

