徐峰 吕鹤青
摘要:该文通过在windows环境下搭建Docker环境,并设计了直观的实验,体会容器技术的神奇功能,是容器技术入门的一种新尝试。
关键词:容器;docker;nginx
中图分类号:TP3 文献标识码:A
文章编号:1009-3044(2019)29-0238-02
新一代信息技术,特别是物联网、云计算、大数据、人工智能是当前最具活力的新兴产业,其中物联网实现了万物互联的物理基础,提供了海量的实时数据,云计算虚拟化各种资源,为大数据的处理和基于大数据的人工智能提供计算、存储、网络等各种资源,随着数据量和访问需求的不断爆发式增长,需求与技术在互相成就的同时都在飞速发展变化。
作为基础支撑的云计算近年来各种新技术层出不穷,其中最耀眼的明星当属容器技术,2013年推出的Docker及2014年google推出的Kubernetes让容器技术得到了业界的广泛认可,天猫双十一的天量交易后台就是容器技术在支撑,目前容器技术已经成为云计算领域最炙手可热的技术热点。
系统掌握容器技术不是一件容易的事情,需要深入学习Knux、有服务器搭建经验和网络知识基础、需要学习python、Golang语言,需要有写脚本的功底和用命令行解决大多数问题的习惯等等,仅linux的CLI界面就挡住了大多数人的热情,因为Docker是基于Linux内置的Namespace和CGroup等系统内隔离机制而抽象出来的一种轻虚拟化技术,所以一直以来网络上的教程都是基于linux的,无形中抬高了容器技术的门槛,搭建一个可看到效果的环境对大多数人来说都是很困难的,笔者从事高职计算机教学,在计算机类非云计算专业学生教学过程中,按照常规方法,真正能够自己搭建出容器环境的同学寥寥无几。2016年8月,微软在winlO的年度更新中正式推出了dockerforwindows,让不习惯linux环境的人有了更多的选择,但相关教程极为匮乏,为给初学者设计一个能够直观感受到容器技术魅力的实训环境,激发学习容器技术的兴趣,本文在windows环境下快速搭建docker环境,通过简单几步实现容器技术,并通过几个小实验,体会容器技术的强大魅力,打开容器技术的大门。
1容器能做什么
相比于物理机,虚拟机实现了在1台主机上可以同时跑多个操作系统,如在一台内存8G的Windows上安装vmware,在vmware里可以创建3台内存为2G的linux虚拟机,但再多创建就比较困难了,而且每个虚拟机都是一个完整的操作系统,占用空间很大,因为每个虚拟机内的操作系统都是互相独立的,容器技术正是为了解决这个问题出现的,他能够极其轻量的打包必要的Bin/Lib,可以根据镜像秒级部署出类似真正操作系统的容器、易于移植和能够弹性伸缩,最主要的是容器共用底层操作系统资源,可以轻松在8G内存的主机上部署出上百个容器,在持续集成和微服务等领域具有极强的应用价值。
2安装Docker for windows
用户计算机要已经开启了BIOS设置中的硬件虚拟化支持,使用的操作系统选用WINDOWSl0的64位版,验证系统的.netframework版本为V4.0.30319,查看位置为C:\Windows\Mi-crosoft.NEqXFramework64,在控制面板中打开“启用或关闭win-dows功能”,确认Hyper-V功能已经启用,在https://hub.docker.con上注册一个用户,搜索docker desktop forwindows,大小约835M,下载到本地安装即可,安装过程需要重新启动,完成后在右下角会有docker图标出现,鼠标移动到图标会显示DockerDesktop is tuning就表示正常启动,然后在命令行下输入dockerversion可看到docker版本號,表示安装完成。
3从Docker Hub上下载镜像
DockerHub是一个由Docker公司运行和管理的基于云的存储库。它是一个在线存储库,Docker镜像可以由其他用户发布和使用,截至本文写作时docker hub上有2,566,623个公开的镜像,其中很多都是非常高质量的镜像,这样我们就可以站在巨人的肩膀上直接使用这些优质镜像,从Docker Hub上下载镜像到本地也很简单,例如Nginx是一个高性能的HTTP和反向代理web服务器,我想下载一个包含nginx网站功能的镜像,在windows命令行模式下输入:docker pull nginx即可把DockerHub上的该镜像下载到本地,下载完成后输人docker images即可看到已经下载下来的该镜像,其中有一个tag字段显示latest,其作用是指本镜像是最新的版本,也可以下载指定版本如v1、v2.7等,在下载时的格式为docker pullnginx:v1,不指定或默认时就是latest。
4生成一个容器
已经有了这个镜像,下面我如果想运行这个镜像,也就是要生成一个容器,此过程类似于面向对象编程中类和对象的关系,类就是这个镜像,对象或者实例就是容器,生成容器的过程就是实例化的过程,生成的容器就类似于一个独立的虚拟机,可以正常提供服务,生成容器的命令为:docker rtln_namewebserv-d-p 80:80ngnix,docker FllB表示运行一个容器,一namewebserv是给这个容器起一个名字,-d表示后台运行,-p80:80表示把本机的80端口与容器里面操作系统的80端口进行映射,这样访问本机的80端口就相当于访问容器里面操作系统的80端口,最后面的nginx就是刚才我们下载到本地的nginx镜像名字,正常后面还要加“:版本号”,默认是latest,这里取默认的,后续如果运行的是其他版本的镜像,生成容器时需要加上“:版本号”进行区分。这样我们就生成了一个容器,打开浏览器,在地址栏输入127.0.0.1就可以看到nginx的页面。
5生成100个容器
前面已经生成了一个容器,但到此为止我们没有看到容器的优势,下面我们就验证一下使用容器的魅力,首先打开按Ctrl+Ah+Del打开任务管理器,切换到性能,查看当前系统CPU和内存的占用情况。
在命令行模式下输入:for/1%x in(1,1,99)d0docker run-name web%x-d-p 80%x:80nginx,其中for/I构建了一个循环结构,%xin(1,1,99)是控制循环从l开始,每次增加l,直到99,其中%x为循环中1-99当前的值,d0docker run-nameweb%x-d-p 80%x:80nginx为前面生成容器的命令,为了给这100个容器分别起不同的名字,100个容器的网站分配本机不同的端口号,所以用web%x和80%x:80来自动命名,这样我们就生成了100个容器(本循环生成99个,加上前面那个共100个),这100个容器相当于生成了100个安装有linux操作系统和nginx网站的100台虚拟机在同时运行,在命令行模式下输入dockerps可以看到生成的这100个容器的具体状态。如果要验证nginx服务器的效果,打开浏览器输入127.0.0.1:80(1-99),可以看到都能打开对应网站页面,说明我们生成的容器都可以正常运行,此时查看任务管理器,可以看到CPU和内存基本没有变化,我们测试100个容器远远没有达到系统的极限能力,这在传统的单机或虚拟机等方式来实现同等功能是不可想象的,这就是容器技术的魅力。
6批量删除容器
强制删除一个正在运行的容器的命令是docker rm_f容器ID,如删除ID为51f9f4a63f2c容器的命令是:docker rm-f51f9f4a63f2c,但当前有100个容器,如果一个个删除效率很低,在linux下可以很容易通过docker rm-f$(dockerps-aq)实现,docker ps-aq命令可以取出所有容器的id号,但windows命令行模式下不支持这种语法,此时我们可以用windows自带的Windows PowerShell来实现类似于Linux脚本功能的命令,在Windows PowerShell提示符下输入docker rm-f(doeker ps—aq),即可批量删除当前运行的所有容器。通过输入docker ps可验证所有容器均已删除。
7利用dockerfide生成新镜像
在容器的世界里,新建一个镜像并不需要一切从零开始,完全可以在一个成熟的基础镜像上,通过叠加一点点自己的内容来生成一个属于自己的新镜像,这个功能在持续集成领域具有非常重要的作用,也就是容器通过分层的思想,把原本复杂冗长的基础环境搭建,变得简洁高效。
生成一个新镜像可以用docker commit命令直接生成,但大多是用dockeffile的方法,dockerfile是一个文件,简单说就是类似于一个批处理文件,一般规定基础镜像是什么,然后在镜像中需要增加什么内容,比如我希望在nginx基础镜像下,把网站首页改为"This is my new site!”這几个字,就可以首先创建一个新目录如mvsit,进入这个目录后创建一个文件名为dockerfile的文件,内容为:
FROM nginx
RUN echo"This is my new site!>/usr/share/nginx/html/in-dex.html
其中FROM nginx为指定基础镜像为nginx,/usr/share/nginx/html/index.html为nginx容器中网站的首页文件,所以第一条命令是指定基础镜像,第二条命令是更改镜像中什么内容,当然还可以增加更多的更改内容,完成后使用dockerbuild-t nginx:v1.即可新建一个镜像f注意命令最后有一个点,代表当前目录,不能缺),nginx:v1中的v1是指新生成的版本号,使用docker images即可查看到存储库中增加了一个新镜像nginx,TAG为v1,这就是我们通过dockefffle自己新建的镜像,下面就可以用新建的镜像利用前面实验的方法生成新容器了,生成容器的命令是docker run-na/Be webservl-d-p 8080:80nginx:v1,相信理解了前面的方法也能够理解本命令的语法格式了。
以上我们从熟悉的windows环境完成了容器环境搭建,下载镜像并运行和删除容器、自己新建镜像等常规操作,尽管实现了基本功能,但我们也看到容器技术的深入学习必须要有linux基础做支撑,脚本语言的能力、服务器搭建的基础、网络基础甚至是外语的基础都是不可或缺的,docker是很新的技术,很多帮助文件和资料需要阅读英文原版的,在经历一段痛苦的摸索过程后才能领会容器技术的更多魅力。