Windows10下Docker使⽤经验谈
最近⼀直在开发的,同时也在⼀起修复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的版本中也还是没有解决。详细信息可以参考这⾥:。
由于这样的原因,我没有在⾃⼰的开发环境中使⽤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镜像链接,⽐如可以使⽤阿⾥云提供的链接地址。此时,需要登录阿⾥云并创建⼀个个⼈账号,然后按照⼀⽂中的介绍,登录的控制台,然后点击“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命令⾏解释执⾏。在l⽂件中,你可以编辑你需要运⾏的Docker容器(称之为服务),以及这些服务之间的依赖关系。Docker-compose可以很好地帮你维护这些服务的⽣命周期。在Docker for Windows中,docker-compose是被默认安装的,你可以通过--version参数来查看安装的版本:
⽽对于运⾏于Hyper-V托管的Linux中,docker-compose需要单独安装。安装⽅法请参考:。推荐使⽤1.13.0以上的版本,新版本对Compose file 3.0的⽀持会⽐较好。
举个例⼦,在我⾃⼰开发的中,我使⽤如下l来定义我的基础服务运⾏容器:
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
这个l⽂件中指定启动三个容器:MongoDB、PostgreSQL以及RabbitMQ,分别定义成了三个服务(service)。这个compose⽂件还是⽐较简单的,没有牵涉到容器之间的依赖关系。我只需要在这个⽂件所在⽬录中,执⾏下⾯这条命令,即可同时启动这三个服务:
sudo docker-compose up
⾮常⽅便。启动结果如下:
还可以在docker-compose命令中加⼊-d参数,使得所有服务在后台运⾏。有关Compose⽂件的格式定义,请参考:。在⼯作中我们也使⽤了docker-compose帮助⽤户搭建他们⾃⼰的微服务环境,我们分发给⽤户的仅仅是⼀个l⽂本⽂件,⼀旦运⾏,所有的基础服务容器都会运⾏起来,⽤以为前台的数据分析系统提供服务保障。
总结windows server2008安装教程
本⽂介绍了我在Windows 10系统下使⽤Docker来帮助开发和测试的⼀些经验和感受。Docker是⼀个⾮常好的东西,对于系统的部署和运维有很⼤的帮助,并且它是云友好的,有着全球各⼤云服务供应商的⽀持,能够很⽅便地部署并运⾏在云环境中。今后我还会介绍⼀下Azure 下Docker容器的⽀持和使⽤,欢迎⼤家各抒⼰见,分享⾃⼰的使⽤经验。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论