无法从容器连接到远程SQL服务器

10

我试图从托管在计算机上的Docker容器连接到我的远程SQL服务器。

但是只收到以下错误:

在建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。 无法找到服务器或无法访问服务器。检查实例名称是否正确以及是否配置了允许远程连接的SQL Server。有关详细信息,请参见SQL Server Books Online。 Sqlcmd:错误:Microsoft SQL Server Native Client 10.0:登录超时。

但如果我尝试从主机机器上的SQL Server管理工具连接到我的SQL服务器,则一切正常。 还要注意,2周前在Docker容器内部也可以正常工作。

这是我的docker-compose文件和已安装SQL驱动程序的docker文件:

Compose:

version: '3'
services:
    nginx:
        image: nginx:1.10
        volumes:
            - ./:/var/www
            - .docker/nginx/vhost.conf:/etc/nginx/conf.d/default.conf
        ports:
            - ${DOCKER_IP}80:80
        links: 
            - php
        networks:
            - app-net

    php:
        build:
            context: ./
            dockerfile: .docker/php/DockerFile
        volumes:
            - ./:/var/www
        networks:
            -  app-net

networks:
     app-net:
        driver: bridge

Docker文件

FROM phpdockerio/php71-fpm:latest

# Install selected extensions and other stuff
RUN export DEBIAN_FRONTEND=noninteractive && \
    apt-get update && apt-get -y --no-install-recommends install \
    php7.1-mysql \
    php7.1-mbstring \
    php7.1-gd \
    php7.1-soap \
    php7.1-dev \ 
    apt-transport-https \ 
    git \
    ssh \
    curl \
    php-pear \
    && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

# Install Composer
RUN cd /usr/src
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer


# Install MSSQL extention
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update
RUN ACCEPT_EULA=Y apt-get -y install msodbcsql mssql-tools g++ unixodbc-dev make
RUN pear config-set php_ini `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"` system
RUN pecl install sqlsrv
RUN pecl install pdo_sqlsrv

RUN echo "extension=sqlsrv.so" >> /etc/php/7.1/fpm/php.ini
RUN echo "extension=pdo_sqlsrv.so" >> /etc/php/7.1/fpm/php.ini

# Fixed locals for MSSQL extention
RUN apt-get install -y locales
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen

WORKDIR /var/www

在Docker容器内,我无法ping通SQL服务器。因此对我来说这听起来像是一个网络问题,但我找不到解决方案。

请注意,SQL服务器托管在办公室的一台本地服务器上。

更新/暂时解决方案:降级Windows Docker到18.03.0-CE后,一切都按预期工作了。


这些文件中没有连接信息:服务器名称或地址、端口、实例名称、数据库等。也许您还没有配置MSSQL扩展。错误提示客户端无法找到服务器。 - edixon
你的主机上运行的操作系统和Docker版本是什么? - Clive Makamara
看起来你遇到了类似于这个的问题。 - Aditya Pawaskar
抱歉回复晚了,我度过了一个较长的假期。MSSQL扩展已正确配置,SQL服务器的信息也是正确的。我正在运行Windows 10作为主机机器。 - Anders Andersen
3个回答

2
Docker桥接网络默认情况下不会连接到Docker外部的世界,它们只允许容器之间进行通信。Docker Bridge Networks的文档提供了一些建议,可以通过在Docker主机上进行更改来允许桥接网络流量与外部世界进行通信:
首先,在内核中启用IP转发:
$ sysctl net.ipv4.conf.all.forwarding=1

然后更改主机防火墙以允许转发。
$ sudo iptables -P FORWARD ACCEPT

这是一个相当宽松的防火墙配置,因此您可能希望保持更加安全。另一种方法是将容器连接到两个不同的网络:当前的桥接网络用于容器之间的通信,第二个主机网络用于与MySQL通信。由于这绕过了Docker的所有NAT配置,因此您的服务的可扩展性可能会受到影响,尽管我认为出站连接可能没有问题。

您是在容器内部还是在主机上运行这些命令?我正在使用 Windows 10 作为主机机器,在其上尝试禁用防火墙。 - Anders Andersen
命令应在主机上运行。禁用防火墙应该具有类似于iptables命令的效果,但我不确定在Windows中去哪里设置IP转发。该过程类似于您为使主机机器充当路由器而进行的操作。也许这会指引您找到正确的Windows设置方向? - CantankerousBullMoose
十倍救星,我差点就要跳火车了 :-) - Valentin Petkov

0

对于我的情况:

我运行了以下命令:

查看所有容器:

docker ps -a

然后重新启动容器:

docker container restart yourIdContainer

如果出现错误:Error response from daemon: Cannot restart container ...

请重启Docker,然后再次重新启动容器。

通过MSSM连接到Sql Server,服务器名称:localhost,1433或IP地址

希望这有所帮助。


0

如果您正在使用Windows 10(家庭版),可能没有虚拟化功能,而是使用Docker Toolbox。他们已经通过使用静态IP解决了这个问题。请检查一下。

我的意思是,如果您正在使用Docker Toolbox,则本地主机将无法工作,请搜索虚拟化Docker Toolbox的IP地址。

我的情况下IP地址为:192.168.99.100


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接