it-swarm.com.de

Verbindung zum Remote-SQL-Server kann nicht aus Container hergestellt werden

Ich versuche, von einem Docker-Container, der auf meinem Computer gehostet wird, eine Verbindung zu meinem Remote-SQL-Server herzustellen. 

Bekommen Sie nur den folgenden Fehler: 

Beim Herstellen einer Verbindung zu SQL Server ist ein netzwerkbezogener oder inhaltsspezifischer Fehler aufgetreten. Server wurde nicht gefunden oder nicht erreichbar. Überprüfen Sie, ob der Instanzname korrekt ist und wenn SQL Server für Remoteverbindungen konfiguriert ist. Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation. Sqlcmd: Fehler: Microsoft SQL Server Native Client 10.0: Anmeldezeitlimit ist abgelaufen.

Wenn ich jedoch versuche, vom SQL Server Management Studio auf dem Host-Computer eine Verbindung zu meinem SQL-Server herzustellen, funktioniert alles einwandfrei. Beachten Sie auch, dass vor 2 Wochen auch alles im Docker-Container funktionierte. 

Hier ist meine Docker-Compose-Datei und die Docker-Datei, in der der SQL-Treiber installiert ist: 

Komponieren: 

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-Datei

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

Innerhalb des Docker-Containers kann kein Ping an den SQL-Server gesendet werden. Für mich klingt das nach einem Netzwerkproblem, aber ich kann keine Lösung finden. 

Bitte beachten Sie, dass der SQL-Server lokal auf einem Server im Büro gehostet wird. 

UPDATE/Im Moment gelöst Nachdem der Dokker für Windows auf 18.03.0-CE herabgestuft wurde, funktionierte alles wie erwartet.

6
Anders Andersen

Docker Bridge-Netzwerke stellen standardmäßig keine Verbindung zur Welt außerhalb von Docker her. Sie erlauben nur Containern, miteinander zu sprechen. Die Dokumentation für Docker Bridge-Netzwerke enthält einige Hinweise, um zuzulassen, dass Bridge-Netzwerkverkehr mit der Außenwelt kommuniziert, indem Änderungen am Docker-Host vorgenommen werden:

Aktivieren Sie zunächst die IP-Weiterleitung im Kernel:

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

Ändern Sie dann die Host-Firewall, um die Weiterleitung zuzulassen

$ Sudo iptables -P FORWARD ACCEPT

Dies ist eine ziemlich zulässige Firewall-Konfiguration. Sie sollten sich also ein wenig mehr verriegeln.

Die andere Möglichkeit wäre, den Container an zwei verschiedene Netzwerke anzuschließen: Ihr aktuelles Bridge-Netzwerk für die Kommunikation zwischen Containern und ein zweites Host-Netzwerk, um mit MySQL zu kommunizieren. Da dies die gesamte NAT- Konfiguration von Docker umgeht, kann dies die Skalierbarkeit Ihres Dienstes beeinträchtigen, obwohl ausgehende Verbindungen meines Erachtens in Ordnung sind.

Wenn Sie Windows 10 (HOME VERSION) verwenden, verfügen Sie möglicherweise nicht über die Virtualisierung und verwenden (Docker-Toolbox). Sie haben das Problem mithilfe einer statischen IP-Adresse gelöst. Prüfen Sie. Ich meine, localhost funktioniert nicht, wenn Sie die Docker-Toolbox verwenden. Suchen Sie die IP-Adresse, an der sich die Docker-Toolbox befindet.

Meine Fall-IP: 192.168.99.100

0
Mohammed Mizab

Für meinen Fall: Habe ich folgende ausgeführt:

So sehen Sie alle Container: 

docker ps -a

Starten Sie dann den Container neu:

docker-Container Starten Sie yourIdContainer neu

Wenn ein Fehler vorliegt: Fehlerantwort vom Daemon: Container kann nicht neu gestartet werden ...

Bitte starten Sie Docker neu und starten Sie den Container erneut.

Stellen Sie über MSSM eine Verbindung zum SQL Server her, Servername: localhost, 1433 oder IP

Hoffe das ist hilfreich.