近年来,VisualStudio已经添加了新的特性和经验,允许开发人员开发用于非Windows平台的C++应用程序,如Android、iOS和 最近的Linux . Linux开发带来的一个挑战是确保您的本机应用程序在广泛的Linux发行版中工作。我们在开发 Visual Studio代码C/C++扩展 我们需要在各种各样的Linux发行版上测试扩展。我们通常在Ubuntu、Debian、费多拉、ARCH、OpenSSuSE等不同版本上构建和测试C++代码。此外,标准C库和编译器有不同的版本,它们带来了自己的一系列问题。为了降低Linux开发的成本,我们在Azure上使用了Docker容器。
本博客提供了一个演练,介绍如何使用Azure VMS、DOCKER容器和VisualStudio来帮助您在MultDeXo Linux C++应用程序中编写以下章节:
- 先决条件
- Docker容器和图像
- 创建Azure Docker VM
- 运行Docker容器
- 为容器设置SSH
- 从VisualStudio开发Linux C++应用程序
- 使用dockerfiles自动构建图像
先决条件
在本演练的整个过程中,您将需要设置以下内容,因此让我们先进行设置。
- 活动的Azure帐户。如果你没有,你可以注册一个 免费Azure试用版。
- 安装Azure命令行界面 它将为您提供一组基于shell的开源命令,用于在Azure中创建和管理资源。使用 Windows MSI安装程序 它将在命令shell中设置正确的路径。
- Docker工具箱 这将允许您快速安装和设置 您的计算机的Docker环境。
- Visual Studio ,用C++和 Linux开发扩展 今天它作为一个独立的扩展在visualstudio扩展库中发布。
Docker容器和图像
Docker容器是操作系统的“剥离到基本”版本。Docker映像是可以在Docker容器中“运行”的软件的只读快照。Docker容器可以让您将比虚拟机更多的应用程序打包到单个物理服务器中。
虚拟机运行操作系统的完整副本和操作系统需要运行的所有硬件的虚拟副本。相反,容器只需要剥离到基本版本的操作系统,支持运行特定程序所需的库、程序和系统资源。
结合Docker容器为开发、测试和部署创建一致的开发环境所提供的额外好处。码头工人来了!
好吧,有了关于Docker的简短概述,我们现在就开始安装一个Azure Docker虚拟机。
步骤1:创建Azure Docker虚拟机
创建azurevm最简单的方法是使用跨平台 Azure命令行工具 . 一旦安装和 已连接到你的Azure订阅 ,您可以直接从命令提示符管理许多Azure资源。
使用“azure Login”命令登录您的订阅。您将经历下图所示的以下一系列步骤。
一旦您成功登录以找到合适的映像,请运行azure vm image list命令并提供其他详细信息,说明您希望在何处托管vm“位置”和vm映像的发布者。Azure上的所有Ubuntu图片都是由“Canonical”发布者发布的。
azure vm image list info: Executing command vm image list Location: westus Publisher: Canonical
这将为您打印一个Ubuntu图像列表。在本演练中,我将介绍流行的’C’anonical:UbuntuServer:14.04.5-LTS:14.04.201609190’图像。或者,您也可以从16.0系列中选择其他产品。
这个 Docker安装文档 提供有关如何安装Docker Toolbox的分步说明,该工具箱将依次安装Docker Machine、Engine、Compose、Kitematic和用于运行Docker CLI的shell。 在本教程中,您将在 窗口框 安装Visual Studio的位置。
一旦Docker安装并运行,我们可以进入下一步,即使用Docker机器Azure驱动程序安装我们的Azure Docker Ubuntu VM。您需要用您的订阅id和vm名称替换订阅id,例如hello azure docker cpp。
docker-machine create --driver azure --azure-subscription-id b5e010e5-3207-4660-b5fa-e6d311457635 --azure-image Canonical:UbuntuServer:14.04.5-LTS:14.04.201609190 hello-azure-docker-cpp
这将通过以下一系列命令来运行:设置VM并安装必要的Docker工具。如果你被卡住了,你可以按照这个指南 在这里 .
接下来,通过运行以下命令为我们创建的机器设置shell,其中machine name是您创建的机器的名称。
docker机器环境
第2步:运行Docker容器
开始使用Docker容器最简单的方法是使用现有的容器。为此,我们通过执行以下命令来使用预先存在的Debian容器。
docker run -p 5000:22 -t -i --restart=always debian /bin/bash
这将从Docker下载Debian的最新映像,并用它启动一个新容器。在执行此步骤时,您应该看到以下命令窗口。您可以用“ubuntu”、“fedora”或“opensuse”替换“debian”,以便为其他发行版创建容器。
如果此步骤成功,则在执行“Docker ps”命令时,应该会看到Docker正在运行,如下所示:
步骤3:为容器设置SSH
要使用VisualStudio在新创建的Linux容器上构建C++应用程序,需要启用SSH并安装必要的构建工具(GDB、G++等)。设置SSH 通常不推荐用于DOCKER容器,但它是VisualStudioC++开发Linux今天需要的经验。
通过使用 ‘码头工人附加
apt-get update apt-get install openssh-server apt-get install g++ gdb gdbserver mkdir /var/run/sshd chmod 0755 /var/run/sshd /usr/sbin/sshd
接下来,创建一个用户帐户,与我们刚刚创建的Docker容器的SSH连接一起使用。我们可以通过运行以下命令来实现这一点。用您想要的用户名替换
useradd -m -d /home/<user-name>/ -s /bin/bash -G sudo <user-name> passwd <user-name>
好了,我们快到了。我们需要做的最后一件事是确保我们使用的端口(5000)是由Docker资源组防火墙的入站安全规则允许的。最简单的方法是使用Azure门户,为我们在Azure上创建的VM启动网络安全防火墙,并遍历入站安全规则。对于本演练中创建的VM,资源如下所示:
作为入站安全规则的一部分,添加并允许使用为SSH连接选择的端口的其他自定义TCP安全规则,如下图所示。
现在,您应该能够使用您喜爱的SSH客户端应用程序SSH到您的Linux容器中。需要根据您的设置替换下面命令中的和。
ssh -p port-name <user-name>@<ip-address>
第4步:从VisualStudio开发Linux C++应用程序
要为VisualStudio设置Linux C++开发,可以阅读 演练, 我们保持最新。本演练介绍了安装、项目设置和其他使用技巧,但概括起来,您需要做两件事:
首先,在Linux容器上运行以下命令,下载构建和调试所需的依赖项。
sudo apt-get install g++ gdb gdbserver
第二,下载 Visual C++在Linux开发中的应用 或者从visualstudio中的扩展管理器获取它。请注意,Linux扩展仅支持Visual Studio 2015及更高版本。
设置VisualStudio之后,请继续在连接管理器中为所有容器设置连接属性。连接管理器可以从 工具->选项 如下图所示:
注意,通过使用Docker容器,您现在可以在Debian、不同版本的Ubuntu和Redhat上同时使用VisualStudio中的一个虚拟机开发应用程序。
好了,其他的设置,我们终于可以开始在我们的容器上构建和调试Linux C++代码。您可以从以下任意简单模板中选择 文件>新建项目-> C++ ->跨平台-> Linux 如下图所示开始:
对于本练习,请选择简单控制台应用程序模板。如果你想从更丰富的东西开始,你可以用这个简单的 井字棋 项目。
接下来,选择要编译和调试它的Linux发行版Docker容器。您可以通过选择您希望在 远程设置 章节:
现在可以开始调试(F5),它将远程复制源代码,构建应用程序,并最终允许您调试应用程序。
太好了!现在,您已经成功调试了在Azure VM内部运行的容器中运行的C++ Linux应用程序。
第五步: 使用Dockerfiles自动构建图像
到目前为止,您已经使用非常基本的Docker命令在前面的部分中创建了Docker容器。Docker的真正威力不仅在于使您能够以更廉价、更高效的方式在一台虚拟机上实例化不同版本的Linux发行版,而且Docker还提供了一种创建一致的开发环境的方法。这是因为Docker允许您使用Docker文件和一系列命令来设置虚拟机上的环境。
Docker文件在概念上类似于infrastructure automation(IA)工具中的配方和清单,如 厨师 和 木偶 . 你可以打开你最喜欢的文本编辑器,创建一个名为“Dockerfile”的文件,其中包含以下内容。
FROM debian RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:screencast' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"] RUN apt-get install -y openssh-server g++ gdb gdbserver
现在,您可以运行以下命令来使用此docker文件构建docker容器并使其运行!
"C:Program FilesDockerDocker esourcesindocker.exe" build -t debiandockercontainer . "C:Program FilesDockerDocker esourcesindocker.exe" run -d -P --name debiancontainer debiandockercontainer "C:Program FilesDockerDocker esourcesindocker.exe" port debiancontainer
运行“DOCKER PS”命令将列出新创建的容器,并且可以在VisualStudio中从Linux C++开发开始。
总结
一如既往,我们欢迎您的反馈,我们很乐意从您的经验中学习。这个博客主要关注Linux容器,在将来我还将讨论如何使用Docker容器来扩展您的Windows开发故事。
如果遇到任何问题,请按照以下步骤进行操作 如果您选择直接互动,请将您的问题或反馈通过电子邮件发送给我! 否则,我们很高兴看到您的评论,并通过评论与您互动。对于一般的visualstudio产品建议,您可以通过 用户语音 .