Невозможно подключиться к удаленному серверу SQL из контейнера - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь подключиться к моему удаленному серверу SQL из контейнера докера, размещенного на моем компьютере.

Но только что получили следующую ошибку:

Произошла ошибка, связанная с сетью или в определенной позиции, при установлении соединения с SQL Server. Сервер не найден или недоступен. Проверьте правильность имени экземпляра и убедитесь, что SQL Server настроен для разрешения удаленных подключений. Дополнительные сведения см. В электронной документации по SQL Server. Sqlcmd: ошибка: собственный клиент Microsoft SQL Server 10.0: истекло время ожидания входа.

Но если я пытаюсь подключиться к своему SQL-серверу из студии управления SQL-сервером на хост-компьютере, все работает правильно. Также обратите внимание, что 2 недели назад все также работало внутри док-контейнера.

Вот мой составной файл Docker и файл Docker, в котором установлен драйвер SQL:

Составить:

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

Внутри док-контейнера я не могу пропинговать SQL-сервер. Так что для меня это звучит как проблема сети, но я не могу найти решение.

Обратите внимание, что сервер SQL размещается локально на сервере в офисе.

ОБНОВЛЕНИЕ / Решено на данный момент После понижения доксера для windows до 18.03.0-CE все заработало как положено.

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Для моего случая: я запустил следующие:

Чтобы увидеть все контейнеры:

docker ps -a

Затем перезапустите контейнер:

Перезапустите контейнер Docker yourIdContainer

Если есть ошибка: Ответ от демона: Невозможно перезапустить контейнер ...

Пожалуйста, перезапустите Docker, затем перезапустите контейнер снова.

Подключение к Sql Server по MSSM, имя сервера: localhost, 1433 или IP

Надеюсь, что это полезно.

0 голосов
/ 14 сентября 2018

Если вы используете Windows 10 (HOME VERSION), возможно, у вас нет виртуализации и вы используете (панель инструментов Docker), они решили проблему с помощью статического ip. Проверь это. Я имею в виду, что localhost не будет работать, если вы используете панель инструментов docker, поищите в ip, где находится виртуализированная панель инструментов docker.

Мой кейс ip: 192.168.99.100

0 голосов
/ 25 мая 2018

Сети Docker Bridge по умолчанию вообще не подключаются к миру за пределами Docker;они позволяют контейнерам общаться друг с другом.Документация для Docker Bridge Networks дает некоторые рекомендации по разрешению сетевого трафика Bridge общаться с внешним миром путем внесения изменений на хосте Docker:

Сначала включите переадресацию IP в ядре:

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

Затем измените брандмауэр хоста, чтобы разрешить переадресацию

$ sudo iptables -P FORWARD ACCEPT

Это довольно разрешающая конфигурация брандмауэра, поэтому вы можете захотеть сохранить ее немного более заблокированной.

Другой способ - подключить контейнер к двум разным сетям: вашей текущей мостовой сети для связи между контейнером и второй сети хоста для связи с MySQL.Так как это обходит всю конфигурацию NAT докера, это может повлиять на масштабируемость вашего сервиса, хотя я думаю, что исходящие соединения могут быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...