用于Windows开发环境设置的Docker

时间:2017-05-19 03:55:47

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

我正在试图找出如何设置开发环境以在本地开发多个apis。

我的开发环境如下:

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

用于Windows稳定版本的Docker,安装并开发netcore webapis,它在本地运行,并且我想连接到主机上的SQL Server实例。

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

我尝试过建立一个透明的网络,但这可能不会起作用,因为我并不想在网络上使用这些网络。我希望它们只能由主机访问,或者通过主机IP通过docker run -p命令进行某些端口映射。

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

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

所以我要问的问题是,我如何设置一个具有互联网访问权限的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网络默认不创建

然后我在admin 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 - 错误定位服务器/实例指定两者都是。

Ping 192.168.1.1会返回结果,但ping 10.10.4.19会返回Request超时。

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

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绑定中,但这似乎不起作用。

SQL Server TCP IP Settings

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

我已将虚拟NAT网卡设置为使用静态IP 192.168.1.1但仍无法连接到SQL Server实例192.168.1.1,1433 \ SQL2016

network setup

1 个答案:

答案 0 :(得分:1)

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

希望这有助于其他人获得本地开发和单服务器docker部署的设置。

enter image description here

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