Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Docker容器:无法按名称连接到SQL Server_Sql Server_Linux_Docker_Sqlcmd - Fatal编程技术网

Sql server Docker容器:无法按名称连接到SQL Server

Sql server Docker容器:无法按名称连接到SQL Server,sql-server,linux,docker,sqlcmd,Sql Server,Linux,Docker,Sqlcmd,我在同一个网络上创建了两个容器,其中一个作为正在运行的Sql Server实例。在另一个容器(使用SQL工具)中,我可以使用IP地址连接到SQL,但是如果我切换到机器名,它就会失败 我已经尝试了ping机器,dns正在解决正确的IP,我也尝试了dnslookup,它也在工作。有人知道如何解决这个问题吗 完整测试场景: 创建新网络 docker network create --driver=bridge specsnet 运行SQL容器 docker run -e 'ACCEPT_EULA=

我在同一个网络上创建了两个容器,其中一个作为正在运行的Sql Server实例。在另一个容器(使用SQL工具)中,我可以使用IP地址连接到SQL,但是如果我切换到机器名,它就会失败

我已经尝试了ping机器,dns正在解决正确的IP,我也尝试了dnslookup,它也在工作。有人知道如何解决这个问题吗

完整测试场景:

  • 创建新网络

    docker network create --driver=bridge specsnet
    
  • 运行SQL容器

    docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Password!123456' -p 1401:1433 -d --name=TestDBServer --net=specsnet --rm microsoft/mssql-server-linux:latest
    
  • 使用SQL工具运行新容器(以测试连接)

  • 已加载一些用于疑难解答的工具(到SQL工具容器中)

  • 测试与IP的连接(成功-IP为172.18.0.2)

  • 使用名称测试连接(失败)


  • sqlcmd
    TestDBServer
    部分引用了一个所谓的。由于您当前设置Docker网络的方式,无法访问这些服务器别名。如果你想为你建立网络,它应该会起作用


    另一种方法是将有问题的容器链接在一起。

    正如Bjoern建议的那样,我创建了一个docker compose文件,在做了一些测试之后,我意识到问题没有得到解决

    然后我开始操作文件,调整属性,发现问题出在SQL容器名称上(容器名称有大写字母)。我将SQL容器名设置为“testdbserver”,一切正常

  • Docker编写文件

  • 在Bash模式下启动SQL工具容器

  • 执行SQL测试连接(现在可以工作了


  • 我在使用网关和微服务时遇到了同样的问题:

    • 创建网络:
    docker网络创建mynet

    • 添加容器:
    这样,当使用容器名称时,我无法在两个容器之间进行通信。例如,连接到网关容器并对服务执行卷曲时:

    curl -i http://my_service_8080:8080/management/info
    
    HTTP/1.1 400
    Transfer-Encoding: chunked
    Date: Tue, 23 Feb 2021 12:51:47 GMT
    Connection: close
    
    在网上做了大量的研究之后,我终于有了一个想法,提供了一个别名:

    docker network connect --alias gateway mynet my-gateway
    docker network connect --alias myservice mynet my_service_8080
    
    现在,我可以使用别名作为主机名成功地在容器之间通信:

    curl -i http://myservice:8080/management/info
    
    HTTP/1.1 200
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 1; mode=block
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    X-Frame-Options: DENY
    Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Tue, 23 Feb 2021 12:54:36 GMT
    
    {"name":"myservice-app","description":"my service","version":"20210202"}
    
    编辑: 在进一步挖掘之后,我发现如果名称(或别名)包含下划线字符,则使用容器名称的通信将不起作用。因此,如果遇到问题,请检查容器名称

    sqlcmd -S tcp:TestDBServer,1433 -U sa -P 'Password!123456'
    
    version: '2'
    services:
      testdbserver:
        image: microsoft/mssql-server-linux:latest
        ports:
          ["1401:1433"]
        environment:
          SA_PASSWORD: Password!123456
          ACCEPT_EULA: Y
        networks:
          - specsnet
    
      sqltools:
        image: mcr.microsoft.com/mssql-tools:latest
        depends_on:
          - testdbserver
        networks:
          - specsnet
    
    networks:
      specsnet:
        driver: bridge
        ipam:
         config:
           - subnet: 10.5.0.0/16
             gateway: 10.5.0.1
    
    docker-compose run sqltools bash
    
    sqlcmd -S tcp:testdbserver,1433 -U sa -P 'Password!123456'
    
    docker network connect mynet my-gateway
    docker network connect mynet my_service_8080
    
    curl -i http://my_service_8080:8080/management/info
    
    HTTP/1.1 400
    Transfer-Encoding: chunked
    Date: Tue, 23 Feb 2021 12:51:47 GMT
    Connection: close
    
    docker network connect --alias gateway mynet my-gateway
    docker network connect --alias myservice mynet my_service_8080
    
    curl -i http://myservice:8080/management/info
    
    HTTP/1.1 200
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 1; mode=block
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    X-Frame-Options: DENY
    Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Tue, 23 Feb 2021 12:54:36 GMT
    
    {"name":"myservice-app","description":"my service","version":"20210202"}