标签:rally 硬件 enc opacity glob 停止 ali mem 额外
原文:Docker深入浅出系列 | 容器初体验
Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会根据本人理解去做阐述,具体官方概念可以查阅官方教程,本章目标如下:
因为我是Mac用户,所以这里VirturalBox和vagrant使用的是Mac版本,大家到官网各自下载对应的系统版本即可,强烈建议使用迅雷下载!
简单来说Docker是一款可以将应用程序与基础设施分离、代码及其所有依赖项打包,使应用程序能够从一个计算环境快速可靠地运行到另一个计算环境,达到快速交付、测试、部署的容器化技术。
我们可以反过来思考,不用Docker这些容器化技术会怎么样,会遇到什么问题和瓶颈。
物理机时代
每个团队会需要申请一台物理机作为测试开发环境,进行一系列的环境搭建
通过上图可以看出直接使用物理机会存在一些问题
虚拟化时代
在虚拟化技术出现之后,每个团队只需要申请一台虚拟机,多台虚拟机可以共享同一台物理机,大大降低了成本,一定程度上提升了资源利用率,当公司搞活动时系统需要扩展,只需要通过虚拟机镜像创建多个虚拟机即可,提升了系统扩展性和可用性
Hypervisor,又称虚拟机监视器(英语:virtual machine monitor,缩写为 VMM),是用来建立与执行虚拟机器的软件、固件或硬件。
被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。hypervisor提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。(引用自百度百科)
从上图不难发现,主机机器会为每个客体机器(虚拟机)提前分配好资源,与物理机时代一样,实际上应用本身可能并不需要那么多物理资源,有一部分资源被操作系统所占用,大部分时候处于闲置状态,仍然存在一些问题如下:
容器化时代
Docker容器类似沙箱,每个容器之间相互独立、资源隔离、互不干扰,Docker容器化技术出现后,基本解决了上面提到的问题,Docker有以下优势:
从上图可以看到,我把物理资源变成可选了,这是因为默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。
Docker提供资源隔离机制,利用Linux内核的 namespace机制来做容器之间的隔离,通过内核的 cgroups 机制来做容器的资源限制(CPU、Memory、Disk等)。
但是直接在主体机器安装Docker,也会导致Docker容器直接依赖主体机器操作系统,没办法实现多租户隔离,后面章节会提到对应解决方案。
镜像是一个可执行包,包含运行应用程序所需的所有内容——代码、运行时、库、环境变量和配置文件。容器是通过运行镜像启动容器,是镜像的运行时实例。镜像实际上就是一个容器的模板,通过这个模板可以创建很多相同的容器。
容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用比其他任何可执行程序更多的内存,使其轻量级。
虚拟机(VM) 运行一个成熟的“游客”操作系统,通过虚拟机监控程序对主机资源进行虚拟访问。通常,vm提供的资源比大多数应用程序所需的要多。
总的来说,容器不需要依赖操作系统,减少了很多系统资源开销,使得容器可以更关注应用的需求,而虚拟机可以为每个应用灵活提供不同的操作系统,避免了docker容器直接依赖主体机器操作系统,两者结合使用,可以让整个系统架构更加灵活,扩展性更强。
其实两款产品没有什么可比性,因为使用场景不同,这里列出来主要是避免一些童鞋误解。
Vagrant是一款管理虚拟机的工具,简化了虚拟机的搭建和管理工作,不需要再像以前一样,需要人工一个个去创建、启动、停止虚拟机,可以通过vagrant脚本同一时间轻松搭建和管理多个虚拟机节点。
docker是一款用于快速交付、测试、部署的工具,简化了应用环境的搭建和管理工作。两者适用范围不同。一个容器就是一个包含了应用执行所依赖的数据(包括lib,配置文件等等),Docker可以通过同一个镜像文件快速在不同的环境(开发、测试、生产)搭建多个相同的容器。
Vagrant是用于管理虚拟机,Docker用于管理应用环境。
Docker引擎是一个客户端-服务器应用程序,主要组件如下:
平时我们使用的docker指令都是通过docker客户端去与docker服务端进行通讯
Docker架构体系
Docker使用客户机-服务器架构。
Docker客户机与Docker守护进程进行对话,后者负责构建、运行和分发Docker容器。
Docker客户机和守护进程可以在同一系统上运行,也可以将Docker客户机连接到远程Docker守护进程。Docker客户机和守护进程通过UNIX套接字或网络接口使用REST API进行通信。
Docker镜像是由一系列层构成的。每一层代表镜像Dockerfile中的一条指令。除了最后一层之外,每一层都是只读的。Docker镜像分层最大的好处是共享资源,其他相同环境的软件镜像都共同去享用同一个环境镜像,而不需要每个软件镜像要去创建一个底层环境。
上图以Tomcat镜像为例子,对于用户而言,用户面向的是一个叠加后的文件系统,我们对Tomcat容器做任何操作都会记录在容器层,底层镜像文件不会受影响。Docker容器底层共享主机内核,只保留少量运行Image必须的组件,在容器启动时不需要启动内核空间,所以启动时比虚机较快,开销少,易迁移。
上面章节也提到过,如果我们把Docker直接安装在主体机器,会导致Docker直接依赖了我们主体机器的操作系统,如果不同的团队共用一台物理机时,没办法做到每个团队或每个环境都独享自己的操作系统和相应的权限。
目前一般的部署模式有以下几种:
从上图可以看出,本教程采用的是混合模式,Docker容器可以在虚拟机内部运行,虚拟机并为它们提供经过验证的隔离,安全属性,移动性,动态虚拟网络等,可实现安全隔离和资源的高利用率。基本应该遵循:不同租户的业务运行采用虚拟机隔离,相似类型的业务部署在同一组容器上的思路。
当虚拟机太多的时候,我们也没办法手动一个个去管理,因此这里用到Vagrant工具去管理虚拟机。
从上图可以看到,当我们使用Docker+虚拟机的混合模式时,实际上整体结构可以分为三大部分:主体机器、客体机器和容器。主体机器不能直接访问客体机器上的容器的IP地址访问容器,因为不再同一个网段,而要通过客体主机和对应的映射端口访问客体机器的容器。
以Tomcat容器作为一个例子,这里虚拟机网络模式默认是bridge
方式,在实战部分也有详细步骤,应用部署图如下:
我在客体机器Centos上启动一个Tomcat容器,容器端口为8080,映射端口为9090
通过命令查看得到,主体机器、客体机器、Tomcat容器IP地址(跟图片一致)如下:
192.168.100.4
192.168.100.9
172.17.0.3
尝试主体机器(MacOS)访问客体机器(Centos)
可以看到,主体机器是可以直接与客体机器进行通信,因为在同一个网段
尝试客体机器(Centos)访问Tomcat容器
在虚拟机上可以直接与Tomcat容器进行通信
尝试主体机器(MacOS)通过客体机器(Centos)端口9090访问Tomcat容器
可以看到主体机器可以通过客体机器IP+端口方式访问容器,因此主体机器访问的并不是容器真实的端口,而是虚拟机上端口的映射。
1.创建一个centos7文件夹
2.在当前文件夹初始化Vagrantfile
输出结果如下:
3.进入Vagrantfile,更改配置如下:
5.将下载的镜像文件保存到你系统的一个目录下,我本机的存放目录是:
6.将centos7镜像文件添加到vagrant管理的镜像中,并将镜像命名为centos7
添加成功输出结果如下:
7.查看已添加的虚拟机镜像,可通过vagrant box list
可以看到,已经成功添加centos7
8.根据Vagrantfile文件启动创建虚拟机,去到刚才初始化Vagrantfile的文件夹,执行vagrant up
创建虚拟机,vagrant会自动根据我们在Vagrant配置好的参数来创建虚拟机,注意我们上面添加的虚拟机名字centos7
要与配置文件中的config.vm.box = "centos7"
一致。(执行过程中,Virtualbox应用不需要打开)
执行完毕,可以打开Visualbox查看是否已经多了一个centos7虚拟机
安装Docker之前,需要进入刚才安装好的Centos7操作系统,因此需要先设置下SSH配置,这里使用的是账号密码登陆
1.使用vagrant ssh
命令进入虚拟机
2.执行sudo -i
命令切换到root用户,然后进入通过vi /etc/ssh/sshd_config
命令修改SSH安全认证配置
3.修改SSH安全认证如下
4.修改完成,退出sshd_config后,更换SSH登陆密码,我这里使用的密码是evan123
5.重启SSH服务,使配置生效
6.测试SSH连接
查看当前Centos系统ip,通过ip add
命令进行查看
可以看到,当前外网ip是192.168.100.9
退出虚拟机,回到主体机器,测试是否可以连接上虚拟机上的Centos系统
此时已经成功连接上,下一步开始Docker安装
1.执行以下命令清理之前已安装的Docker文件,如果之前曾经安装过
因为这个系统是新安装,之前没有Docker相关文件,执行结果如下:
2.输入以下命令安装环境必要依赖
3.通过以下命令配置阿里云镜像加速器,否则下载镜像会比较慢,这里镜像加速器做了脱敏处理,大家可以自己去申请一个
怎么获取镜像加速器地址,可以查看我另一篇文章
使用Docker安装Oracle
4.设置Docker仓库,Docker默认仓库hub.docker.com
5.安装Docker
6.启动Docker服务
7.通过Docker仓库自带镜像,测试Docker是否已经安装成功
Docker会自动下载镜像,如果在本地查找不到
1.从远方仓库拉去Tomcat镜像,这里不带版本号默认拉取最新版本
2.启动Tomcat容器,指定容器命名为evan-tomcat,并且配置容器端口9090映射到内置mysql 3306端口
1.从远方仓库拉去Tomcat镜像,这里不带版本号默认拉取最新版本
2.启动MySQL容器,并改名为evan-mysql,配置容器端口 3301映射到3306端口,并设置密码为evan123
1.通过以下Docker指令可以查看上面我们安装和启动的容器是否正常运行:
2.我们可以通过上面的容器ID去进入到容器内部,这里以Tomcat为例子:
这样我们本章所有环境SETUP已经顺利完成,后面的章节将会更深入介绍容器的原理、集群部署、管理以及结合真实微服务的应用。
1.在Mac中安装Visualbox时失败,提示“the installation failed”
原因是MacOS阻止了VirtualBox安装kernel extension。在system preferences中选择security&privacy在general中点击下方的allow即可解决。
2.vagrant up
命令启动失败,提示No Usable default provider could be found for your system
这是由于Vagrant与Virtualbox版本不一致,Vagrant的版本比Virtualbox的旧,可以将Virtualbox降级,或者直接使用本文推荐的版本
__EOF__
标签:rally 硬件 enc opacity glob 停止 ali mem 额外
原文地址:https://www.cnblogs.com/lonelyxmas/p/12273177.html