Windows 10下Docker使用经验谈

最近一直在开发Apworks框架案例代码,同时也在一块儿修复Apworks框架中的Bug和一些设计上的不足。遇到的一个广泛问题是,代码的调试过程须要依赖不少外部系统,好比MongoDB、PostgreSQL、RabbitMQ等。固然能够在本机逐一安装这些服务,而后对服务进行配置,使其知足本身开发调试的须要。这样作固然是没有问题的,只是比较麻烦。因而,我寻求docker的帮助,将服务全都运行在docker容器中,须要的时候一条简单的docker命令便可启动,不须要的时候,将docker容器停掉便可,很是方便,并且不会对主机环境形成干扰。固然,实践过程也不是那么顺利的,也踩了一些坑,如今就跟你们分享一下。html

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个数,以及内存的大小。git

image

然而,一个比较麻烦的问题是,若是你须要使用-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-windowsgithub

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

使用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等这些第三方的虚拟机服务。mongodb

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

image

点击这个菜单项,而后会打开你们熟悉的控制面板界面,直接选中其中的Hyper-V就好了:shell

image

应用更改并从新启动后,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的教程。json

image

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

image   image

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

另外一个比较头疼的问题就是,在国内经过Docker Hub下载Docker镜像是很是慢的,慢到你没法忍受,其中缘由你们都心知肚明。一个解决方案是在Docker CE的配置文件中设定本地的Docker Registry镜像连接,好比可使用阿里云提供的连接地址。此时,须要登陆阿里云并建立一个我的帐号,而后按照https://yq.aliyun.com/articles/29941一文中的介绍,登陆容器Hub服务的控制台,而后点击“Docker Hub镜像站点”,拷贝专属加速器地址而后配置到/etc/docker/daemon.json文件中便可。具体方法能够按照上面的连接作。

image

在配置好镜像地址并重启以后,使用docker pull、docker run等命令就会很是快了,你们不妨一试。对于Docker for Windows,你须要打开设置界面,而后在Daemon页中的Registry mirrors部分,填入镜像连接地址便可。

image

或许你会问,安装和配置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参数来查看安装的版本:

image

而对于运行于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

很是方便。启动结果以下:

image

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

总结

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

相关文章
相关标签/搜索