最近一直在开发Apworks框架案例代码,同时也在一起修复Apworks框架中的Bug和一些设计上的不足。遇到的一个普遍问题是,代码的调试过程需要依赖很多外部系统,比如MongoDB、PostgreSQL、RabbitMQ等。当然可以在本机逐一安装这些服务,然后对服务进行配置,使其满足自己开发调试的需要。这样做当然是没有问题的,只是比较麻烦。于是,我寻求docker的帮助,将服务全都运行在docker容器中,需要的时候一条简单的docker命令即可启动,不需要的时候,将docker容器停掉即可,非常方便,而且不会对主机环境造成干扰。当然,实践过程也不是那么顺利的,也踩了一些坑,现在就跟大家分享一下。

Docker for Windows 10

在Windows 10系统下的首选就是Docker for Windows 10。Docker对Windows 10的支持现在已经做得非常好了,无论在Windows Command下还是在Windows Powershell下都可以执行Docker命令,也可以像在Linux系统下一样,运行所有的Docker容器。对Docker架构了解的读者一定能够更好地了解Docker for Windows 10运作的基本原理,即在Hyper-V的支持下,将Docker容器运行在Linux的虚拟机里。因此,在Docker for Windows的工具中,可以设置这台虚拟机的CPU个数,以及内存的大小。

然而,一个比较麻烦的问题是,如果你需要使用-v参数来加载(mount)一个磁盘目录(volume)的时候,就会出现问题,至少我在MongoDB中使用-v参数来将MongoDB的数据文件映射到主机目录时,就会导致MongoDB无法正常启动。这个问题在Hyper-V出现之前,在Virtual Box时代就有,而且根据社区的讨论,似乎在Hyper-V的版本中也还是没有解决。详细信息可以参考这里:https://stackoverflow.com/questions/42756776/how-do-i-configure-mongo-to-run-in-docker-to-using-an-external-drive-on-windows

由于这样的原因,我没有在自己的开发环境中使用Docker for Windows 10,因为无法将MongoDB的数据库文件映射存储到主机(Host Machine)上,也就意味着每次启动容器执行我的一些冒烟测试(Smoke Test),我都需要重建数据,非常麻烦。我选择了在Hyper-V中搭建自己的Linux虚拟机来构建自己的开发和测试环境。

使用Hyper-V的Linux虚拟机来运行Docker容器

以前,只有服务器版本的Windows才支持Hyper-V,记得最早支持Hyper-V的Windows是Windows Server 2008。说起Hyper-V的历史,也是有一定渊源的。最早有一家公司,名叫Connectix,它有一款产品就是大家熟悉的Connectix Virtual PC,一款硬件虚拟化产品,后来Connectix把Virtual PC产品卖给了微软,成为了Microsoft Virtual PC,之后Connectix于2003年宣布解体,微软把Virtual PC精神发扬光大,成就了现在的Hyper-V。从Windows 10开始,Professional/Enterprise版本的Windows 10都能够支持Hyper-V了。大家可以直接在Windows 10中创建虚拟机,而不需要额外安装vmware player、Oracle VirtualBox等这些第三方的虚拟机服务。

启用Hyper-V的方法非常简单,在Windows 10中,点击开始菜单,或者按下键盘上的WIN键,然后输入关键字windows features,这时会出现“Turn windows features on or off”菜单项(我的系统是英文版,中文版稍作修改):

点击这个菜单项,然后会打开大家熟悉的控制面板界面,直接选中其中的Hyper-V就行了:

应用更改并重新启动后,Hyper-V就已经装好了。需要注意的是,如果你已经在控制面板中启用了Hyper-V,那么假如你再安装Oracle VirtualBox的话,这样Oracle VirtualBox仅可创建32位的虚拟机。当然原因我们也没必要深究了。

Hyper-V成功安装后,同样,在开始菜单中输入Hyper-V作为关键字,Hyper-V Manager菜单项就会显示出来,点击Hyper-V Manager的菜单项,即可打开Hyper-V的管理界面。在Hyper-V Manager中,可以非常方便地创建并管理虚拟机,虚拟机的操作系统可以是Windows的,也可以是Linux的,用户只需要下载所需操作系统的ISO镜像即可完成安装,非常方便。这部分内容本文就不多说了,可以参考微软官网Hyper-V的教程。

比较有趣的事情是,Hyper-V对虚拟机的内存分配可以是动态的。比如我在创建Ubuntu Linux虚拟机的时候,选择的是8GB的内存,但从上图可以看出,目前系统仅分配了2GB多一点的内存给我的虚拟机,因为当时它只需要使用这么多。这样也能兼顾到主机的性能。在我创建的这个Ubuntu Linux虚拟机中,我配置使用了静态IP地址,这是为了方便程序的开发测试。在我的测试数据中,我不需要因为虚拟机IP地址的改变而总是去修改数据库的连接字符串。配置静态IP的另一个好处就是,你可以很方便地使用Putty这样的SSH工具来远程连接到Hyper-V虚拟机,而不需要每次都打开Hyper-V Manager并登录到虚拟机控制台。Putty这套工具使用非常方便,并且绿色轻量,在此强烈推荐。

  

根据不同的Linux环境,静态IP地址的配置方式也会不同,这里也不多解释了,网上相关的文章还是很多的。

另一个比较头疼的问题就是,在国内通过Docker Hub下载Docker镜像是非常慢的,慢到你无法忍受,其中原因大家都心知肚明。一个解决方案是在Docker CE的配置文件中设定本地的Docker Registry镜像链接,比如可以使用阿里云提供的链接地址。此时,需要登录阿里云并创建一个个人账号,然后按照https://yq.aliyun.com/articles/29941一文中的介绍,登录容器Hub服务的控制台,然后点击“Docker Hub镜像站点”,拷贝专属加速器地址然后配置到/etc/docker/daemon.json文件中即可。具体方法可以按照上面的链接做。

在配置好镜像地址并重启之后,使用docker pull、docker run等命令就会非常快了,大家不妨一试。对于Docker for Windows,你需要打开设置界面,然后在Daemon页中的Registry mirrors部分,填入镜像链接地址即可。

或许你会问,安装和配置Docker用于搭建自己的开发和测试环境并不容易,我为何不自己在本机装我所需的数据库、消息队列、缓存等服务,而去弄个Docker来运行这些基础服务呢?我想,驱使我这么做的原因大概是如下几点吧:

  1. 如果我的应用程序所依赖的基础服务比较多的话,在开发机器上逐一安装这些服务是比较耗时的,而且我很难针对不同版本的服务进行测试。使用Docker可以很方便地在基础服务版本之间进行切换,比如可以使用Docker镜像的tag来指定我所需要的MongoDB的版本
  2. 使用Docker,使得基础服务环境搭建可以被复制。例如我可以使用一个批处理脚本(或者Shell脚本)将运行Docker容器的命令写入,那么无论我在哪台机器上,只要能够运行这个批处理脚本,都可以一键搭建基础服务环境,无需更多操作。由docker-compose支持的部署方式使得基础服务的部署变得更加简单,也就是当我的应用程序准备上线时,我只需要将我的docker-compose YAML文件上传到Docker Orchestrator上,由其负责管理和运行相关的容器即可
  3. 在Hyper-V托管的虚拟机中运行Docker容器,可以更好地利用和分配主机资源,在不需要的时候可以将主机性能损耗降到最低。目前硬件价格都不算昂贵,运行一个4GB内存的虚拟机并不是那么吃力。此外,Hyper-V的关机选项允许在主机关闭的时候,让虚拟机处于休眠待机状态,而在主机运行时又按需唤醒虚拟机,因此,每次开机,基础服务都是正常运行状态,你只需要直接运行你的应用程序即可

下面我简单介绍一下docker-compose工具。

Docker-compose简介

Docker-compose听起来像是一个由YAML语法定义的文本文件,通过docker-compose命令行解释执行。在docker-compose.yml文件中,你可以编辑你需要运行的Docker容器(称之为服务),以及这些服务之间的依赖关系。Docker-compose可以很好地帮你维护这些服务的生命周期。在Docker for Windows中,docker-compose是被默认安装的,你可以通过--version参数来查看安装的版本:

而对于运行于Hyper-V托管的Linux中,docker-compose需要单独安装。安装方法请参考:https://docs.docker.com/compose/install/。推荐使用1.13.0以上的版本,新版本对Compose file 3.0的支持会比较好。

举个例子,在我自己开发的Apworks框架中,我使用如下docker-compose.yml来定义我的基础服务运行容器:

version: "3"
services:
mongo:
image: mongo
ports:
- "27017:27017"
container_name: apworks_mongodb postgres:
image: orchardup/postgresql
ports:
- "5432:5432"
environment:
- POSTGRESQL_USER=test
- POSTGRESQL_PASS=oe9jaacZLbR9pN
- POSTGRESQL_DB=test
container_name: apworks_psql rabbit:
image: rabbitmq
ports:
- 5672:5672
- 4369:4369
- 5671:5671
- 25672:25672
container_name: apworks_rabbitmq

这个docker-compose.yml文件中指定启动三个容器:MongoDB、PostgreSQL以及RabbitMQ,分别定义成了三个服务(service)。这个compose文件还是比较简单的,没有牵涉到容器之间的依赖关系。我只需要在这个文件所在目录中,执行下面这条命令,即可同时启动这三个服务:

sudo docker-compose up

非常方便。启动结果如下:

还可以在docker-compose命令中加入-d参数,使得所有服务在后台运行。有关Compose文件的格式定义,请参考:https://docs.docker.com/compose/compose-file/。在工作中我们也使用了docker-compose帮助用户搭建他们自己的微服务环境,我们分发给用户的仅仅是一个docker-compose.yml文本文件,一旦运行,所有的基础服务容器都会运行起来,用以为前台的数据分析系统提供服务保障。

总结

本文介绍了我在Windows 10系统下使用Docker来帮助开发和测试的一些经验和感受。Docker是一个非常好的东西,对于系统的部署和运维有很大的帮助,并且它是云友好的,有着全球各大云服务供应商的支持,能够很方便地部署并运行在云环境中。今后我还会介绍一下Azure下Docker容器的支持和使用,欢迎大家各抒己见,分享自己的使用经验。

Windows 10下Docker使用经验谈的更多相关文章

  1. 在windows 10下使用docker

    准备工作 Windows 10下的Docker是依赖于Hyper-v的,首先我们需要启用它:控制面板 -> 程序 -> 启用或关闭Windows功能 -> 选中Hyper-V 安装D ...

  2. 解决Windows 10下Wireshark运行问题

    解决Windows 10下Wireshark运行问题在Windows 10下,安装Wireshark时候,提示WinPcap不被系统系统支持.这是由于最新版的WinPcap 4.1.3只支持到Wind ...

  3. Windows 10下Markdown不能显示预览

    Windows 10下Markdown不能显示预览 结局办法 下载awesomium的SDK,安装后重启Markdown即可 实测最新版本的SDK不行,建议安装1.6.6 下载地址:http://ww ...

  4. Windows 10 下 PostgreSQL 生成 UUID(Guid)

    最近在Windows 10 下安装了 PostgreSQL(postgresql-9.6.3-1-windows.exe),在学习过程中,发现PostgreSQL 支持UUID(Guid)类型,但是却 ...

  5. Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇)

    原文:Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇) windows禁用/启用hyper-V,解决hyper-V与模拟器同时启用时造成冲突 我是这样解决的,以管理员身份运行命令提 ...

  6. Windows 10下mysql 64位 安装(mysql-5.7.11-winx64安装)

    Windows下mysql 64位 安装(mysql-5.7.11-winx64安装) 系统Windows10 安装包mysql-5.7.11-winx64.zip 安装过程中遇到的问题,请留意4.0 ...

  7. Windows 10下Xilinx ISE需要注意的事项。

    一是安装.可以在Windows 10下安装Xilinx ISE 14.7. 详见:https://www.eevblog.com/forum/xilinx/guide-getting-xilinx-i ...

  8. 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)

    目录 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用) 背景 下载地址 仓库地址 安装部署 msys2 安装 配置环境变量 ...

  9. 【Flutter 1-2】在 Windows 10下安装Flutter+Dart+Android Studio 配置Flutter开发环境

    在 Windows 10下安装Flutter+Dart+Android Studio 配置Flutter开发环境 文章首发地址 配置环境变量 由于部分网站被墙的原因,我们需要先配置Flutter国内镜 ...

随机推荐

  1. 201521123001《Java程序设计》第1周学习总结

    1. 本周学习总结 java和我们以前学的C语言的区别大致有: C语言可以直接操作内存,java不能直接操作: C语言的代码不能跨平台,java的代码可以跨平台: C语言有指针,java没有指针: C ...

  2. 201521123037 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 1.1 建立数据库,将自己的姓名.学号作为一条记录插入.(截图, ...

  3. Markdown 练习

    一个例子: 例子开始 1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一 ...

  4. HTTP请求的header头解析

    Request Headers: 下图是我访问一个URL:http://www.hzau.edu.cn的一个header,根据具体实例来分析一下各部分的功能及其作用. Accept 作用: 浏览器端可 ...

  5. MyBatis框架(一)

    MyBatis介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  6. Selenium+Python自动化测试实战(2)元素定位

    1.Selenium2 的原理 第一篇分享简单介绍了基于Python开发的Selenium2的环境配置,这篇主要讲一下基本用法.首先讲一下Selenium2的基本原理.基本上知道了这个东西是怎么回事, ...

  7. 记一次【模拟点击】,WinForm小软件开发过程

    前言 年初四月份的时候,有朋友找到我,说想开发一个模拟点击的软件.最终软件做完后,发现效果不理想.唯一开发的我是认为最好是放弃了,做运营的他,坚持说这个没问题,说是改变合作方式.最终也是不了了之了. ...

  8. MapReduce极简教程

    一个有趣的例子 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃?   MapReduce方法则是: 给在座的所有玩家中分配这摞牌 让每个玩家数自己手中的牌有几张是黑桃,然后 ...

  9. 性能压测诡异的Requests/second 响应刺尖问题

    最近一段时间都在忙着转java项目最后的冲刺,前期的coding翻代码.debug.fixbug都逐渐收尾,进入上线前的性能压测. 虽然不是大促前的性能压测要求,但是为了安全起见,需要摸个底心里有个数 ...

  10. Apache Spark 2.2.0 中文文档 - 集群模式概述 | ApacheCN

    集群模式概述 该文档给出了 Spark 如何在集群上运行.使之更容易来理解所涉及到的组件的简短概述.通过阅读 应用提交指南 来学习关于在集群上启动应用. 组件 Spark 应用在集群上作为独立的进程组 ...