Docker 用于 windows 开发环境设置

Docker for windows development environment setup

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

我的开发环境如下:

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

Docker 对于 windows 稳定版本,安装和开发 netcore webapis 容器化和 运行 本地我想连接到 SQL 主机上的服务器实例。

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

我已经尝试设置一个 t运行sparent 网络,但是这可能行不通,因为我真的不想在网络上使用它们。我希望它们只能由主机访问,或者通过主机 IP 通过 docker 运行 -p 命令通过某些端口映射访问。

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

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

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

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

我已经尝试通过 10.10.4.19 ip 地址和虚拟 NIC 上定义的 172.20.xxx.1 地址访问主机的 SQL 实例,但是其中 none 会连接到 SQL 实例或我在主机上有 运行ning 的任何 website/api。然而,容器可以访问网络上其他 PC 的 websites/apis。只是不是主持人。

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

我找到的很多文档都是基于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 访问它,但是我收到错误消息:provider: SQL 网络接口,错误:26 - 错误定位 Server/Instance 为两者指定

ping 192.168.1.1 确实 return 结果,但是 ping 10.10.4.19 returns 请求超时。

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

编辑2:

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

注意:尽管转到容器上的静态 IP 设置,但端口绑定似乎不起作用。您只能在 docker 文件中的 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 服务器绑定,但这似乎不起作用。

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

我已经将虚拟 NAT NIC 设置为使用静态 IP 192.168.1.1,但仍然无法连接到位于 192.168.1.1 的 SQL 服务器实例,1433\SQL2016

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

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

我仍然不能做的一件事是 host:container 端口映射