【问题标题】:Unable to connect to remote SQL server from container无法从容器连接到远程 SQL 服务器
【发布时间】:2018-05-14 06:02:55
【问题描述】:

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

但只是收到以下错误:

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

但是,如果我尝试从主机上的 SQL Server Management Studio 连接到我的 SQL Server,则一切正常。 另请注意,2 周前,一切都在 docker 容器内正常工作。

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

撰写:

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 的 dokcer 降级到 18.03.0-CE 后,一切都按预期工作。

【问题讨论】:

  • 这些文件中没有连接信息:服务器名称或地址、端口、实例名称、数据库等。可能你没有配置MSSQL扩展。该错误表示客户端无法找到服务器。
  • 您的主机上运行的 os 和 docker 版本是什么?
  • 您似乎面临类似this的问题
  • 抱歉回复晚了,我已经放长假了。 MSSQL 扩展配置正确,SQL 服务器信息正确。我正在运行 Windows 10 作为主机。

标签: sql-server docker networking


【解决方案1】:

默认情况下,Docker Bridge 网络根本不连接到 Docker 之外的世界;它们只允许容器相互通信。 Docker Bridge Networks 的文档确实提供了一些建议,以通过在 Docker 主机上进行更改来允许 Bridge 网络流量与外界通信:

首先在内核中启用IP转发:

$ sysctl net.ipv4.conf.all.forwarding=1

然后更改主机防火墙以允许转发

$ sudo iptables -P FORWARD ACCEPT

这是一个相当宽松的防火墙配置,因此您可能希望将其锁定得更严格。

另一种方法是将容器连接到两个不同的网络:当前用于容器之间通信的桥接网络,以及用于与 MySQL 通信的第二个主机网络。由于这绕过了 Docker 的所有 NAT 配置,因此您的服务的可扩展性可能会受到影响,尽管我认为传出连接可能没问题。

【讨论】:

  • 您是在容器内还是在主机上运行这些命令?我使用的是 Windows 10,作为我尝试禁用防火墙的主机。
  • 命令应该在主机上运行。禁用防火墙应该与 iptables 命令具有类似的效果,但我不确定在 Windows 中的何处设置 IP 转发。该过程类似于将主机设置为路由器的过程。也许这会为您指明寻找 Windows 设置的正确方向?
  • 10x 救生员,我差点跳到火车后面 :-)
【解决方案2】:

就我而言: 我在下面运行了这些:

查看所有容器:

docker ps -a

然后重启容器:

docker 容器重启 yourIdContainer

如果出现错误:来自守护进程的错误响应:无法重新启动容器...

请重启 Docker,然后再重启容器。

通过MSSM连接Sql Server,服务器名称:localhost,1433 or IP

希望这有帮助。

【讨论】:

    【解决方案3】:

    如果您使用的是 Windows 10 (HOME VERSION),您可能没有虚拟化并且您正在使用 (docker toolbox),他们已经使用静态 ip 解决了问题。检查。 我的意思是,如果你使用 docker 工具箱,localhost 将不起作用,搜索虚拟化 docker 工具箱所在的 ip。

    我的案例ip:192.168.99.100

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多