无法从容器连接到远程 SQL 服务器

2024-03-18

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

但刚刚收到以下错误:

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

但是,如果我尝试从主机上的 SQL Server Management Studio 连接到 SQL Server,则一切正常。 另请注意,两周前,一切都在 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 版 docker 降级到 18.03.0-CE 后,一切都按预期工作。


默认情况下,Docker Bridge 网络根本不连接到 Docker 之外的世界;它们只允许容器相互通信。的文档Docker 桥接网络 https://docs.docker.com/network/bridge/#enable-forwarding-from-docker-containers-to-the-outside-world确实提供了一些建议,通过在 Docker 主机上进行更改来允许 Bridge 网络流量与外界通信:

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

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

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

$ sudo iptables -P FORWARD ACCEPT

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法从容器连接到远程 SQL 服务器 的相关文章

随机推荐

  • 用AVPlayer玩AVMutableComposition?

    我正在尝试让两个视频按顺序播放 我尝试过 AVQueuePlayer 但两个剪辑之间有一个巨大的 打嗝 我需要他们不间断地玩耍 所以我尝试使用 AVMutableComposition 和 AVPlayer 但无法正确使用 这是我的代码 忽
  • 如何使用 Helm 获取子图表的名称?

    我有一个舵图需要stable redis作为子图表 父图表需要将redis服务公开为环境变量 Redis 图表包含一个名为的模板redis fullname 我如何在我的父图表中引用此内容 IE 我想在我的父部署中使用类似的东西 但它不起作
  • PHP fwrite() 文件导致内部服务器错误

    我想将大文件上传到我的服务器 我在上传之前拼接这些文件 1MB 块 如果上传一个块 该块将被附加到文件中 在我的本地服务器上 一切运行良好 但如果我在我的 Web 服务器 由 Strato 托管 上测试此脚本 每当服务器上的附加文件变得 6
  • 访问 React Router 历史堆栈

    我有一个应用程序 您可以通过各种方式 搜索 按类别向下钻取等 到达相册列表 从相册中 您可以单击打开单张照片 并使用左 右箭头以及各种编辑工具遍历它们 每个迭代 工具操作都会执行history push 以将路由添加到路由器历史记录中 我正
  • php 版本切换在 mac 上不起作用

    我安装了 High Sierra 它附带了 php 7 1 在该环境中 我最终能够升级到 php7 2 但无法记录它 所以我不完全知道我做了什么 现在 我正在尝试切换到 php 7 3 使用brew 我运行了以下命令 brew unlink
  • 在 Flyway 脚本中安全地重命名 MySQL 表名

    我将通过 Flyway SQL 脚本重命名 MySQL 8 0 表 RENAME TABLE aaa TO bbb 它应该在 env 上运行很多次 但这样的脚本不是幂等的 尝试第二次运行它时我发现了一个错误 SQL State 42S01
  • 在电子邮件中嵌入 HTML 表格

    是否可以将表格 以 html 编码 作为电子邮件正文发送 以便收件人能够查看表格 解析并显示 例如 我希望能够将其作为电子邮件正文发送 table tr td col1 td td col2 td tr table 以便收件人看到col1
  • 如何求子ul li a的宽度

    我有以下无序列表包裹在 div 中 如下所示 div ul li home ul li a anchor1 a li li a anchor2 a li li a anchor3 a li ul li li school li li col
  • 如何设置 appcompat-v7 工具栏的样式,如 Theme.AppCompat.Light.DarkActionBar?

    我正在尝试重新创建的外观Theme AppCompat Light DarkActionBar使用新的支持库工具栏 如果我选择Theme AppCompat Light我的工具栏会很轻 如果我选择Theme AppCompat天会黑的 从技
  • 无法使用 gpg-agent 作为 ssh 代理

    我一直在尝试让 gpg agent 作为 ssh 代理工作 但没有任何运气 我正在运行 Linux Mint Sarah 的 KDE 版本 首先 我在 etc X11 Xsession options 中禁用了内置 ssh 代理 Id Xs
  • java中的Lombok项目如何工作?在.net中使用属性是否可以实现?

    Project Lombok http projectlombok org 使得在类中实现样板代码变得很简单 NET 属性可以实现这一点吗 那里有 net 端口吗 现在有一个 NET 端口 查看龙目岛网 https github com C
  • Python - 由于目标机器主动拒绝而无法建立连接

    我是 Python 新手 我正在尝试执行这段导入 Socket 的代码 import socket def retBanner ip port try socket setdefaulttimeout 2 s socket socket s
  • 如何使用 php 设置 crontab?

    我需要从 php 脚本设置一个 crontab 我知道它可以通过设置 system echo echo Hello world gt gt cron crontab system crontab cron crontab cron cron
  • 如何使TinyMCE编辑器中的元素被视为不可编辑的单个项目?

    在我们的 CMS 中 我们的用户可以使用 TinyMCE 编辑表单的错误消息 问题是 其中一些消息可能需要动态数据 例如 Your chosen name X is invalid 为此 我们使用tokens 以上面为例 我们的用户将输入
  • 如何知道 MySQL 何时需要转义

    我正在使用 CodeIgniter 构建一个网站 这是我自己构建的第一个与数据库交互的站点 我在这个项目中使用 MySQL 在将数据保存到数据库之前 如何判断数据是否需要转义 我建议您习惯使用准备好的陈述 特别是当您刚接触数据库时 你越早开
  • 将 Codeigniter 站点从 http 更改为 https 站点 - 不起作用

    我有一个 codeigniter 网站 它在运行时运行良好http 然后我们的客户将网站移动到新服务器 该服务器具有https安全 这意味着现在网站网址是http mysite com 但现在我的网站无法正常工作 这是什么原因呢 那是我的
  • ReactDOM.render:React 从 16.4.2 升级到 16.5.2 后无法在已卸载的组件上找到节点

    我已将 ReactJS 项目更新到最新版本npm update从 Visual Studio 2017 运行 结果如下 material ui email protected cdn cgi l email protection email
  • 如何启用实验性 Docker CLI 功能

    我正在尝试使用docker manifest inspect
  • 显示 Laravel 中注册的路线

    在此截屏视频中 https tutsplus com lesson displaying registered routes https tutsplus com lesson displaying registered routes Je
  • 无法从容器连接到远程 SQL 服务器

    我正在尝试从计算机上托管的 docker 容器连接到远程 SQL 服务器 但刚刚收到以下错误 与 SQL Server 建立连接时发生与网络相关或特定于实例的错误 找不到服务器或无法访问服务器 检查实例名称是否正确以及 SQL Server