无法从容器连接到远程SQL Server

And*_*sen 7 sql-server networking docker

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

但只是收到以下错误:

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

但是,如果我尝试从主机上的SQL Server Management Studio连接到我的SQL服务器,一切正常.另请注意,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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在docker容器内我无法ping SQL服务器.所以对我来说,我听起来像一个网络问题,但我找不到解决方案.

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

UPDATE /解决了现在 将Windows的dokcer降级到18.03.0-CE后,一切都按预期工作.

Can*_*ose 2

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

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

$ sysctl net.ipv4.conf.all.forwarding=1
Run Code Online (Sandbox Code Playgroud)

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

$ sudo iptables -P FORWARD ACCEPT
Run Code Online (Sandbox Code Playgroud)

这是一个相当宽松的防火墙配置,因此您可能需要考虑对其进行更多的锁定。

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