【问题标题】:Docker for windows development environment setupDocker for windows 开发环境设置
【发布时间】:2017-05-20 05:39:04
【问题描述】:

我正在尝试弄清楚如何设置开发环境以在本地开发多个 api。

我的开发环境如下:

主机:10.10.4.19 SQL Server 2016 Express 安装在监听 10.10.4.19,1433 的主机上,我可以从主机和网络上的其他 PC 本地连接到该主机。

Docker for windows 稳定版,安装和开发 netcore webapis,它被容器化并在本地运行,我想连接到主机上的 SQL Server 实例。

理想情况下,每个容器在某些 NAT 网络中都有一个静态 IP,但是我无法使用 docker for windows 让静态 IP 用于默认 NAT 网络设置。

我已经尝试建立一个透明的网络,但这可能行不通,因为我真的不希望这些在网络上。我希望它们只能被主机访问,或者通过 docker run -p 命令通过主机 IP 的某些端口映射来访问。

我的容器正在运行和工作(静态 IP 地址除外),但是我无法访问主机。我可以在容器中找到的网关 IP 地址 ping 主机(我假设是),但我似乎无法访问主机上运行的任何服务。

在容器中,我可以 ping 网络中的其他 PC(IE 10.10.4.22)并可以访问 Internet,但由于某种原因,我无法 ping 位于 10.10.4.19 的主机。我收到请求超时。

所以我要问的问题是,我如何设置一个具有 Internet 访问权限的 NAT 网络,其中容器可以与主机和其他容器通信,并且主机也可以与所有容器通信。理想情况下,我可以为每个服务设置静态 IP,我可以在主机上设置 nginx 或其他一些反向代理,以帮助代理对每个容器的请求。

我尝试使用 docker network create -d NAT mynat 创建一个单独的 NAT,但它告诉我该对象已经存在。

我尝试通过虚拟网卡上定义的 10.10.4.19 ip 地址和 172.20.xxx.1 地址访问主机的 SQL 实例,但是它们都不会连接到 SQL 实例或我运行的任何网站/api主人。然而,容器可以访问网络上其他 PC 的网站/api。只是不是主机。

所以我想我是在问是否也可以从容器内部访问主机的服务?

我找到的很多文档都是基于linux的,我不确定它是否可以相同使用

任何人都可以提供的方向将不胜感激。

编辑:

在使用 docker 网络玩了一夜之后,我能够用我自己的替换默认的 docker NAT 网络,这样我就可以指定静态 IP 地址。

为此,我将"bridge: "none" 添加到位于 C:\ProgramData\Docker\config 的 daemon.json 文件中。这使得默认情况下不会创建默认 NAT 网络

然后我在管理员 powershell 中运行以下命令来创建我自己的 NAT 网络

PS C:\WINDOWS\system32> stop-service com.docker.service
PS C:\WINDOWS\system32> stop-service hns
PS C:\WINDOWS\system32> del 'C:\ProgramData\Microsoft\Windows\HNS\HNS.data'
PS C:\WINDOWS\system32> Get-ContainerNetwork | Remove-ContainerNetwork
PS C:\WINDOWS\system32> Get-NetNat | Remove-NetNat
PS C:\WINDOWS\system32> start-service hns
PS C:\WINDOWS\system32> start-service com.docker.service
PS C:\WINDOWS\system32> docker network create -d nat --subnet=192.168.1.0/24 --gateway=192.168.1.1 mynat
d0d31ecf39ec6cada948c3158b176e9a67d7e0ba6458208d9c91b240587c0763

然后我可以使用以下命令启动我的容器

docker run -itd --net=mynat --ip=192.168.1.25 --rm <containername>

但是:我仍然无法访问主机上的 SQL Server Express 实例。我以为我可以在 192.168.1.1,1433\SQL2016 或 10.10.4.19\SQL2016 访问它,但是我收到错误:提供程序:SQL 网络接口,错误:26 - 错误定位服务器/指定实例 em> 两者都有。

ping 192.168.1.1 确实会返回结果,但是 ping 10.10.4.19 会返回 Request timed out。

我在虚拟 NIC 适配器上设置了 192.168.1.1 的静态 IP,但这似乎没有任何帮助。希望有人知道如何从容器内访问主机。谢谢!

EDIT2:

我现在可以访问在主机上运行的 api。老实说,我不确定发生了什么变化。但我现在可以在容器内的主机上运行http://192.168.1.1/api 的服务。

注意:尽管转到容器上的静态 IP 设置,端口绑定似乎不起作用。您只能在 dockerfile 中的 EXPOSE 端口上点击服务,并使用 -p 5600:9606 运行 docker 命令不会在 5600 上公开它仍然仅在 9606 上公开。调用 192.168.1.25:9606 有效,但 localhost:5600 不会

但是,我仍然无法连接到 192.168.1.1 IP 上的 SQL Server Express 实例。我尝试将 192.168.1.1 ip 添加到 SQL Server 绑定,但这似乎不起作用。

我可以从 10.10.4.19,1433\SQL2016 的主机进行连接,但无法在 192.168.1.1,1433\SQL2016 进行连接,所以我假设这是当前的问题。 Windows 防火墙已禁用。

我也将虚拟 NAT 网卡设置为使用静态 ip 192.168.1.1 但仍然无法连接到位于 192.168.1.1,1433\SQL2016 的 SQL Server 实例

【问题讨论】:

  • 我有机会得到否决票背后的原因或提供帮助的评论
  • 这是一个很好的问题(和答案,都被赞成),但您可以让您的原始问题更加明显,并在答案中重新定位您的两个编辑(然后您可以接受)

标签: c# networking docker asp.net-core sql-server-express


【解决方案1】:

我要做的最后一件事是在 sql server express 2016 的主机服务器上同时启用 ipv4 和 ipv6(因为 ipv6 用于我猜的一些身份验证检查)。并添加了防火墙规则。

希望这将帮助其他人设置本地开发和单服务器 docker 部署。

我仍然不能做的一件事是主机:容器端口映射

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多