最近一直在开发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. 201521123077 《Java程序设计》第1周学习总结

    1. 本章学习总结 java语言的历史 dos下运行 java文件 Math ,String ,Scanner,Interger等常用类的使用 jdk,jre,jvm等概念的了解 classpath, ...

  2. 201521123038 《Java程序设计》 第十周学习总结

    201521123038 <Java程序设计> 第十周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题 ...

  3. 201521123025《java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 1.1建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 1.2在自己建立的数据库上执行常见SQL语句 ...

  4. 201521123074 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

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

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

  6. hadoop-2.6.0源码编译

    运行hadoop环境时,常常会出现这种提示 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your plat ...

  7. [3] 微信公众号开发 - 结合UEditor实现图文消息群发功能

    0.写在前面的话 如何实现微信平台后台管理中的,图文消息发送功能? 大概的过程如下: 通过类似表单的形式,将文章各部分内容提交到后台,封装成一个实体类,并持久化到数据库中 需要推送的时候,将不同的文章 ...

  8. JDBC在javaweb中的应用之分页数据查询

    分页查询 分页查询是java web开发中经常使用到的技术.在数据库中数据量非常大的情况下,不适合将所有的数据全部显示到一个页面中,同时为了节约程序以及数据库的资源,就需要对数据进行分页查询操作. 通 ...

  9. MyBatis学习(四)XML配置文件之SQL映射的XML文件

    SQL映射文件常用的元素: 1.select 查询语句是MyBatis最常用的语句之一. 执行简单查询的select元素是非常简单的: <select id="selectUser&q ...

  10. mysql水平分表和垂直分表的优缺点

    表分割有两种方式: 1.水平分割:根据一列或多列数据的值把数据行放到两个独立的表中. 水平分割通常在下面的情况下使用. •表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数 ...