JDBC Sink Connector连接Docker中SQL Server 2019失败求助
解决Kafka Connect JDBC Sink无法连接Docker部署的SQL Server问题
核心问题分析
你遇到的连接失败,本质是Kafka Connect容器(或WSL内的Kafka Connect进程)无法解析sql1这个主机名,或者网络不通导致无法访问SQL Server的1433端口。
分步排查与解决
1. 确认SQL Server的网络可达性
- 如果Kafka Connect是在Docker容器中运行:
- 检查SQL Server容器的网络模式:如果Kafka Connect和SQL Server不在同一个Docker网络,要么把它们加入同一网络,要么用宿主机IP访问。
- 替换连接串中的
sql1为WSL的主机IP(别用localhost,容器内的localhost指向自身)。WSL里执行hostname -I就能拿到这个IP。 - 要是两者在同一Docker网络,直接用SQL Server容器的名称当主机名就行(前提是你启动SQL Server时指定了
--name sql1,且Kafka Connect容器也在这个网络里)。
- 如果Kafka Connect是在WSL Ubuntu宿主机中运行:
- 先测试WSL内能不能通SQL Server:执行
telnet <你的SQL Server容器映射的宿主机IP> 1433或者nc -zv <IP> 1433,不通的话检查Docker端口映射是不是正确(启动SQL Server时有没有加-p 1433:1433参数)。 - 别用
sql1当主机名,除非WSL的/etc/hosts里已经把sql1映射到了正确的IP。
- 先测试WSL内能不能通SQL Server:执行
2. 检查SQL Server的连接配置
- 确认SQL Server容器开了TCP/IP连接:Docker部署的SQL Server默认是开的,也可以进容器验证:
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P <你的密码> # 执行下面的命令检查TCP状态 SELECT name, protocol_desc, state_desc FROM sys.dm_exec_connections WHERE session_id = @@SPID; - 确保连接串里的用户名(默认是SA)、密码、数据库名没拼写错误。
3. 调整Kafka Connect的JDBC Sink配置
修改Sink连接器的connection.url参数:
- 若Kafka Connect在Docker中,且和SQL Server同网络:
connection.url=jdbc:sqlserver://sql1:1433;databaseName=<你的数据库名>;encrypt=true;trustServerCertificate=true - 若Kafka Connect在WSL宿主机:
connection.url=jdbc:sqlserver://<WSL主机IP>:1433;databaseName=<你的数据库名>;encrypt=true;trustServerCertificate=true
注意:必须加encrypt=true;trustServerCertificate=true,因为SQL Server默认要求加密连接,不加可能会出现额外的连接错误。
4. 验证网络连通性
- Docker容器间连通性测试:在Kafka Connect容器里执行
ping sql1或telnet sql1 1433,ping不通的话说明网络隔离,得把两个容器加入同一Docker网络:# 创建网络 docker network create kafka-sql-network # 重启SQL Server容器加入网络 docker run -d --name sql1 --network kafka-sql-network -p 1433:1433 -e "SA_PASSWORD=<你的密码>" -e "ACCEPT_EULA=Y" mcr.microsoft.com/mssql/server:2019-latest # 重启Kafka Connect容器加入同一网络 docker run -d --name kafka-connect --network kafka-sql-network ... <其他Kafka Connect启动参数> - WSL到SQL Server的连通性:在WSL终端执行
nc -zv localhost 1433,返回成功说明端口映射有效;失败的话检查Docker端口是不是被占用,或者SQL Server容器有没有正常运行。
总结
最常见的原因是主机名解析失败或网络隔离,优先检查Kafka Connect和SQL Server的网络环境,替换成正确的主机IP或容器名称,同时确保连接串的加密参数配置正确。
内容的提问来源于stack exchange,提问作者Deba2115126
相关产品推荐
相关产品推荐

