web-dev-qa-db-fra.com

Impossible de se connecter au serveur SQL distant à partir du conteneur

J'essaie de me connecter à mon serveur SQL distant à partir d'un conteneur Docker hébergé sur mon ordinateur. 

Mais nous ne faisons que recevoir l'erreur suivante: 

Une erreur liée au réseau ou spécifique à une attente s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur n'est pas trouvé ou n'est pas accessible. Vérifiez si le nom de l'instance est correct et si SQL Server est configuré pour autoriser les connexions à distance. Pour plus d'informations, consultez la documentation en ligne de SQL Server .. Sqlcmd: erreur: Microsoft SQL Server Native Client 10.0: expiration du délai de connexion.

Mais si j'essaie de me connecter à mon serveur SQL depuis le studio de gestion du serveur SQL sur la machine hôte, tout fonctionne correctement. Notez également qu’il ya 2 semaines, tout fonctionnait également à l’intérieur du conteneur de menu fixe. 

Voici mon fichier de composition de docker et le fichier de docker sur lequel le pilote SQL est installé: 

Composer: 

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

Fichier 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

À l'intérieur du conteneur de menu fixe, je ne peux pas interroger le serveur SQL Donc, pour moi, cela ressemble à un problème de réseau, mais je ne parviens pas à trouver de solution. 

Veuillez noter que le serveur SQL est hébergé localement sur un serveur du bureau. 

MISE À JOUR/Résolu pour le moment Après avoir déclassé le dokcer pour Windows à 18.03.0-CE, tout a fonctionné comme prévu.

6
Anders Andersen

Les réseaux Docker Bridge ne se connectent pas du tout au monde en dehors de Docker par défaut; ils permettent uniquement aux conteneurs de se parler. La documentation de Réseaux de ponts Docker offre quelques conseils pour permettre au trafic réseau du pont de communiquer avec le monde extérieur en apportant des modifications à l'hôte Docker:

Commencez par activer le transfert IP dans le noyau:

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

Puis changez le pare-feu de l'hôte pour autoriser le transfert

$ Sudo iptables -P FORWARD ACCEPT

Il s’agit d’une configuration de pare-feu assez permissive, vous pouvez donc envisager de la verrouiller un peu plus.

L'autre solution consisterait à connecter le conteneur à deux réseaux différents: votre réseau de pont actuel pour la communication entre les conteneurs et un second réseau hôte pour communiquer avec MySQL. Dans la mesure où cela contourne toute la configuration NAT de Docker, l’évolutivité de votre service peut être affectée, bien que je pense que les connexions sortantes pourraient être OK.

1

Si vous utilisez Windows 10 (HOME VERSION), si vous n’avez pas la virtualisation et que vous utilisez (Docker Toolbox), ils ont résolu le problème en utilisant une adresse IP statique. Vérifie ça. Je veux dire que localhost ne fonctionnera pas si vous utilisez la boîte à outils Docker, recherchez l'adresse IP où se trouve la boîte à outils Docker virtualisée.

Mon cas ip: 192.168.99.100

0
Mohammed Mizab

Pour mon cas: J'ai couru ces ci-dessous:

Pour voir tous les conteneurs: 

docker ps -a

Puis redémarrez le conteneur:

conteneur docker redémarrer yourIdContainer

En cas d'erreur: réponse d'erreur du démon: impossible de redémarrer le conteneur ...

Veuillez redémarrer Docker, puis redémarrer à nouveau le conteneur.

Se connecter au serveur SQL par MSSM, nom du serveur: localhost, 1433 ou IP

J'espère que c'est utile.

0