Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trouble connecting to SQL Server with sqlcmd from inside Docker

Working with debian linux inside a docker contaier. I have sqlcmd working properly and the neseccary drivers are installed and locatable. I know the server exists:

root@0feafecac36f:/home/shiny# nmap -p 31010 -sT xxx.xxx.xxx.xxx

Starting Nmap 7.60 ( https://nmap.org ) at 2018-01-25 20:46 UTC
Nmap scan report for nile-h.tmthk.org (xxx.xxx.xxx.xxx)
Host is up (0.019s latency).

PORT      STATE    SERVICE
31010/tcp filtered unknown

Nmap done: 1 IP address (1 host up) scanned in 0.59 seconds

But, for the life of me, I cannot figure out how to connect using sqlcmd, and I am not sure what tricks I have at my disposal to help. This command results in an error:

sqlcmd -S nile-h.tmthk.org,31010 -U "*********" -P "********"
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
    Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP Provider: Error code 0x2749.
    Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not
    accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..

I have confirmed that the user name and password are correct. So, what could be going on here? Any ideas? I've tried many iterations of the sqlcmd to try to get it right but so far nothing is working.

EDIT: Telnet

root@0feafecac36f:/home/shiny# telnet xxx.xxx.xxx.xxx 31010
Trying xxx.xxx.xxx.xxx...
telnet: Unable to connect to remote host: Connection refused

EDIT: tcptraceroute

root@0feafecac36f:/home/shiny# tcptraceroute xxx.xxx.xxx.xxx 31010
Selected device eth0, address 172.17.0.2, port 33859 for outgoing packets
Tracing the path to xxx.xxx.xxx.xxx on TCP port 31010, 30 hops max
 1  172.17.0.1  0.241 ms  0.179 ms  0.156 ms
 2  nile-h.tmthk.org (xxx.xxx.xxx.xxx) [closed]  1012.571 ms  1003.511 ms  1003.485 ms

EDIT: ip route get

root@0feafecac36f:/home/shiny# ip route get xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx via 172.17.0.1 dev eth0 src 172.17.0.2
    cache

EDIT: Dockerfile

FROM r-base:3.4.0
RUN apt-get update && apt-get install -y \
apt-utils \
curl \ 
libcurl4-openssl-dev \
libssl-dev \
r-cran-rjava \
gnupg2 \
r-cran-rodbc \
unixodbc \
unixodbc-dev \
apt-transport-https \
debconf-utils \
gcc  \
libct4 \
libsybdb5 \
tdsodbc \
sqsh \
mlocate \ 
sudo \
gfortran
ENV PATH="/opt/mssql-tools/bin:${PATH}"
RUN useradd -u 5555 -m -d /home/shiny -c "shiny user" shiny
ADD . /home/shiny/
RUN chown -R shiny:shiny /home/shiny 
RUN chmod 755 /home/shiny/install_sql.sh
WORKDIR /home/shiny
RUN Rscript installRpackages.R
RUN chmod 755 /home/shiny/install_sql.sh && /home/shiny/install_sql.sh
RUN    R -e "install.packages('devtools')"
RUN    R -e "devtools::install_github('rstudio/DT')"
RUN    R -e "devtools::install_github('timelyportfolio/parcoords')"
RUN    R -e "devtools::install_github('ropensci/plotly') ;  library(plotly)"
RUN    R -e "devtools::install_github('rstudio/crosstalk',force=TRUE) ;  library(crosstalk)"
RUN    R -e "install.packages(c('plotly'), dependencies = TRUE, repos='https://cran.rstudio.com/')"
RUN wget "http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb"
RUN sudo apt install ./libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb
USER shiny 
EXPOSE 7777
CMD Rscript start.R 

And finally, the install_sql.sh called by the Dockerfile:

curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.10/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt-get update
ACCEPT_EULA=Y apt-get install msodbcsql
# optional: for bcp and sqlcmd
ACCEPT_EULA=Y apt-get install mssql-tools
# optional: for unixODBC development headers
apt-get install unixodbc-dev
like image 417
Stu Avatar asked Jan 25 '18 20:01

Stu


People also ask

How do I connect to the SQL Server docker container?

Here are the steps you can follow to set up and deploy a SQL Server Docker Container seamlessly: SQL Server Docker Setup: Install Docker on your System. SQL Server Docker Setup: Execute and Run Docker. SQL Server Docker Setup: Pull & Run the Docker Image for SQL Server.

How do I connect to Sqlcmd?

Open a Command Prompt window, and type sqlcmd -SmyServer\instanceName. Replace myServer\instanceName with the name of the computer and the instance of SQL Server that you want to connect to. Press ENTER. The sqlcmd prompt (1>) indicates that you are connected to the specified instance of SQL Server.

Can T Remote connect to SQL Server?

Right-click on your server name and click 'Properties'. Go to the Security page for Server Authentication, and select 'SQL Server and Windows Authentication' mode. Then, go to the Connections page and ensure that "Allow remote connections to this server" is checked, and click OK.


2 Answers

Judging by the nmap output you have shared I believe this to be a firewall issue or the server SQL Server itself blocks access. According to man nmap:

The state is either open, filtered, closed, or unfiltered [... ] Filtered. means that a firewall, filter, or other network obstacle is blocking the port so that Nmap cannot tell whether it is open or closed.

Reading the sqlcmd output (A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible) also points in this direction according to this Microsoft post which also offers some possible solutions.

IF the SQL Server is managed by yourself, you may check its logs to see why it refuses your connection and also add a firewall rule to allow access from your container. IF that's not the case, you may need to talk with the admin of that server and ask him to add your IP in the firewall list/accepted connections list in the server's configuration file.

If firewall is not your issue, please try applying the below settings to your SQL Server and re-test the connection.

Set "Listen to All" to No in the SQL Server Configuration Manager > SQL Server Network Configuration > Protocols for [instance name]. And under IP Address change 127.0.0.1 to the [ip] used to connect. Don't forget to restart the SQL Server!

Other tip: check your firewall (or temporaly disable it for testing). Also allow remote connections in SQL Server properties > Connections. See above posts.

Life safer was this command: nc -zv <ip> 1433
It should say Connection to 1433 port [tcp/ms-sql-s] succeeded!

The original source is here.

like image 156
AnythingIsFine Avatar answered Oct 06 '22 23:10

AnythingIsFine


Reading from your question, I'm assuming you want to connect to your local SQL Server from inside Docker.

SQL Server can be connected to over TCP/IP:

  1. Open SQL Server Configuration Manager and make sure TCP/IP is enabled;

  2. Make sure SQL Server is listening on all IP addresses.

like image 1
Tiago Martins Peres Avatar answered Oct 07 '22 01:10

Tiago Martins Peres