在Hyper-V的Docker主机上使用Visual Studio Docker工具

本文讲的是在Hyper-V的Docker主机上使用Visual Studio Docker工具【编者的话】本文主要介绍了在Windows下使用Hyper-V和Visual Studio来进行容器化的实践,及遇到的问题和相应解决方法。

在过去的几周,我一直在研究使用Visual Studio的Docker工具来将ASP.NET核心应用容器化。这使得你可以在Docker容器内本地开发和调试应用。为了实现这个目标,你需要一个本地的Docker主机。虽然你可以向IT部门申请提供一个,但是发现在我笔记本上本地运行虚拟机更加方便快捷,这样无论我在哪都可以随时用它。为了创建一个本地Docker主机,你需要使用Docker工具箱。使用VirtualBox创建一个本地虚拟机作为你的Docker主机。然而,我已经安装Hyper-V作为虚拟化管理程序。Hyper-V在Windows 10上工作非常完美,所以我想保留这个程序。但不幸的是,VirtualBox和Hypser-V并不兼容(简短说就是如果Hyper-V开启了,VirtualBox就无法安装)。

解决方案:在Hyper-V上创建一个本地Docker主机。不幸的是这个过程有一些繁琐,所以我认为应该在这介绍一下。

注意:你当然可以使用Azure运行Docker主机。但是,为了编辑和刷新能够起作用,需要在你的Docker主机和你本地开发机器共享驱动。由于通用的防火墙和网络限制,这功能在Azure虚拟机上经常很难获得。本地Docker主机则可以很优雅的获得该功能。

准备

在使用Visual Studio的Docker工具前,需要进行一些安装:

设置网络

下一步是创建一个本地Docker主机。首先,我们先设置Hyper-V的配置项。

我们需要创建一个虚拟网卡给Docker主机连接,并保证有网络接入权限。在Hyper-V管理工具中打开虚拟网卡管理,创建一个新的虚拟网卡。修改名称,并保证它位于局域网中。

我们在这里使用局域网,来保证即使重启或者连接开发机器到一个不同网络后IP地址也保持一致。使用局域网的副作用是它没有连接到你的外部网络,所以像从公共仓库上下载Docker镜像,或者从公共源上恢复NuGet包将不起作用。为了解决这个问题,我们使用网络连接共享来共享我们的internet连接给新建的内部网络。

打开“查看网络连接”窗口(Windows 10中只需搜索“network”就会显示):

从那里打开有网络连接的适配器属性页(以我为例,它是一个桥接的适配器),在共享页打卡网络连接共享。选择你的内部网络作为主网络连接。

创建Docker主机虚拟机

下一步是创建虚拟机,它将是你的Docker主机。Docker工具箱提供稍微优雅的命令行工具来管理Docker主机:docker-machine. 你可以使用这个创建、启动、停止或者删除Docker主机。

打开PowerShell命令行提示,输入如下命令创建Docker主机:

$ docker-machine create --driver hyperv --hyperv-virtual-switch "<your virtual switch>" <your vm name>

这将会花费一点时间,但是当他完成后,你会在Hyper-V管理工具中看到你的新建虚拟机在运行。

最后需要做的是设置环境,来使用新建的虚拟机作为运行的机器。可以在PowerShell提示行中输入如下命令:

$ docker-machine env <your vm name> | Invoke-Expression

然后输入“docker-machine ps”来验证你的新虚拟机确实在运行。

共享硬盘使 “编辑和刷新”工作

为了使编辑和刷新起作用,Visual Studio的Docker工具箱希望开发机器上代码的路径与Docker主机共享为同一个路径。如果你使用的是VirtualBox,Docker工具箱自动处理了这些。但是,使用Hyper-V你得自己处理这些问题。

在我遇到的情况中,我将所有代码保存在我Windows机器的 “D:\Git”。我们需要共享这个目录给Docker虚拟主机,但是由于这是一个Linux虚拟机,代码路径看着会有些不同: “/d/Git”。我们使用普通的Windows网络共享来得到这个功能。

首先,在Windows机器上共享该文件夹。打开文件夹属性对话框,选择共享页共享文件夹:

现在我们需要从Docker主机中连接这个共享的文件夹。首先通过SSH连接到Docker主机。通过输入如下命令很容易实现:

$ docker-machine ssh <your vm name>

然后,创建你共享目录相对应的Linxu目录,使用mount挂载上。

$ sudo mkdir –p <your path>
$ sudo mount –t cifs //192.168.137.1/Git /d/Git -o user=keesv,pass=<your password>,domain=<your domain>

上面命令当然需要替换为正确的IP(你Windows开发机器)、路径、用户名和密码。如果你使用的不是域账户,你可以去掉“,domain=<your domain>”部分。现在可以通过“ls /d/Git”检查下共享文件夹的内容是否可用:

你会注意到共享的驱动器在重启Docker虚拟主机后不再是连接状态。为了避免每次重新连接,我们可以使这个连接持久化。为了实现这个功能(还是在SSH连接下),创建可以在每次启动被调用的脚本

$ sudo touch /mnt/sda1/var/lib/boot2docker/bootlocal.sh

然后打开文件编辑(我这里使用vi, 由于它是默认自带的):

$ sudo vi /mnt/sda1/var/lib/boot2docker/bootlocal.sh

在vi中开始编辑,按“i"。然后输入如下(在相应地方替换为你自己的配置):

mkdir –p /d/Git
mount –t cifs //192.168.137.1/Git /d/Git -o user=keesv,pass=<your password>,domain=<your domain>

Ctrl + c退出vi,然后“:wq”回车保存。

重启虚拟机,SSH连接上,检查共享目录是否可用:

运行一个ASP.NET核心应用

为了看到所有组合到一起的样子,我们创建一个非常基本的ASP.NET核心应用,并在我们新建的Docker主机的容器中运行。

首先,创建应用。保证它是在你刚刚共享给Docker主机的目录中创建的。

然后使用Visual Studio Docker工具箱给工程添加Docker支持:

我们需要在我们运行的容器上指定Docker主机。这需要一个被docker-machine知道的主机。打开“Docker.props”文件,修改Docker 机器名字:

在修改后需要重启Visual Studio,所以立刻重启。当重新打开工程后,设置debug目标为Docker,按F5:

这将会在Docker主机中构建Docker镜像,然后运行基于镜像运行一个容器。一会儿后,网页就会弹出来:

注意Visual Studio调试是在容器内连接到你的应用上的,所以你可以设置断点,查看变量值和其他所有的方便Visual Studio优雅调试的便利功能。

容器化快乐!

原文链接:Using Docker tools for Visual Studio with a Hyper-V based Docker host(翻译:姜俊厚)

原文发布时间为:2016-07-02

本文作者:姜俊厚

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:在Hyper-V的Docker主机上使用Visual Studio Docker工具

时间: 2024-10-28 21:01:30

在Hyper-V的Docker主机上使用Visual Studio Docker工具的相关文章

转:Windows 8上强制Visual Studio以管理员身份运行

原文:转:Windows 8上强制Visual Studio以管理员身份运行 Windows 8的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上,我们不能关闭UAC,那样的话Metro程序就一个都启动不了了. 作为微软技术的码农,我们通常要让Visual Studio在管理员权限下跑.虽然我们可以每次都在右键菜单里选择"以管理员身份运行",但多此一举的动作

如何在Linux上使用Visual Studio Code

为了向大家介绍 "Linux 上的 ASP.NET Core",我需要一个 Linux VM,通过远程桌面连上去运行 Visual Studio Code.数小时后,我被一堆问题搞得头昏脑胀,最后终于能搭建了一个可用于演示的 VM.这篇文章向读者们简述了我在 Linux VM 中运行 Visual Studio Code 的经验. 这篇文章主要关注怎样为 Visual Studio Code 设置虚拟化的 Linux 环境.经过一些曲折,我终于在 Kubuntu 上运行起来了.为什么是

Windows 8上强制Visual Studio以管理员身份运行

Windows 8的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上,我们不能关闭UAC,那样的话Metro程序就一个都启动不了了. 作为微软技术的码农,我们通常要让Visual Studio在管理员权限下跑.虽然我们可以每次都在右键菜单里选择"以管理员身份运行",但多此一举的动作总是很蛋疼.经过一番开荒,我终于找到了如何强制以管理员身份启动VS的办法. 网

在 Windows 上使用 Visual Studio 编译 CURL

导语: 教你科学地编译 Windows 版本的 libcurl (使用Windows SSPI或者OpenSSL) 准备工具 CMake (3.4.0) Zlib (1.2.8) libcurl (7.45.0) OpenSSL (1.0.2d) Visual Studio 2015 目标 得到可以使用的 libcurl 静态库 步骤 编译Zlib 打开CMake,把 Zlib 目录下的 CMakeList.txt 拖进去,生成解决方案,这一步不能用 contrib\vstudio 下的 sln

如何在Atomic主机上远程使用 Docker

来自Atomic项目的Atomic主机是一个轻量级的容器基于的操作系统,它可以运行 Linux 容器.它已被优化为用作云环境的容器运行时系统.例如,它可以托管 Docker 守护进程和容器.有时,你可能需要在该主机上运行 docker 命令,并从其他地方管理服务器.本文介绍如何远程访问 Fedora Atomic 主机(你可以在这里下载到它)上的 Docker 守护进程.整个过程由 Ansible 自动完成 - 在涉及到自动化的一切上,这真是一个伟大的工具! 安全备忘录 由于我们通过网络连接,所

在 Atomic 主机上远程使用 Docker

来自 Atomic 项目 的 Atomic 主机是一个轻量级的容器基于的操作系统,它可以运行 Linux 容器.它已被优化为用作云环境的容器运行时系统.例如,它可以托管 Docker 守护进程和容器.有时,你可能需要在该主机上运行 docker 命令,并从其他地方管理服务器.本文介绍如何远程访问 Fedora Atomic 主机(你可以在这里下载到它)上的 Docker 守护进程.整个过程由 Ansible 自动完成 - 在涉及到自动化的一切上,这真是一个伟大的工具! 安全备忘录 由于我们通过网

利用OpenVSwitch在多台主机上部署Docker的教程_docker

[编者的话]当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛.在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂.嗯,是的,本文用到了 OpenVSwitch. 运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器.这台主机可以是Linux服务器,也可以是Mac(借助类似boot2docker的项目). 在多台主机上运行却是

在Docker Swarm上部署Apache Storm:第2部分

[编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 点此查看<在Docker Swarm上部署Apache Storm:第1部分> 创建Swarm集群 如果一切顺利,那么你现在已经有了三台Ubuntu服务器,每个上面都运行了一个Docker守护进程.可以通过私有网络中的zk1.cloud和manager.swarm访问Ubuntu 1,或者

有人说Docker Hub上三成的镜像包含漏洞?扯吗不是?

本文讲的是有人说Docker Hub上三成的镜像包含漏洞?扯吗不是,[编者的话]到底Docker Hub上是否三成的镜像存在漏洞?通过漏洞计算发现确实有高比例漏洞,对于管方镜像遵循Docker的安全指南,如若是自创建镜像,可找源仓库或自行处理.但我们发现,这些漏洞中大部分是老镜像.面对漏洞镜像,我们可以采取本地措施,还可用Web安全审查进行检查,如果想让Docker更加安全,建议用dockerbench来评估.文中额外阐述了容器究竟有什么用. 这个数字太神奇了!并不是因为这个比例过高或者过低,而