Docker深入浅出系列 | 容器初体验
Posted lonelyxmas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker深入浅出系列 | 容器初体验相关的知识,希望对你有一定的参考价值。
原文:Docker深入浅出系列 | 容器初体验
1|0Docker深入浅出系列 | 容器初体验
2|0教程目标
Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会根据本人理解去做阐述,具体官方概念可以查阅官方教程,本章目标如下:
- 了解什么是Docker
- 了解Docker解决了什么
- 了解什么是镜像和容器
- 了解容器与虚拟机的区别
- 了解Vagrant与Docker的区别
- 了解Docker引擎和架构
- 了解Docker的镜像分层
- 了解VirturalBox和Docker如何搭配使用
- 了解主体机器如何与客体机器上的容器进行通信
- 了解Vagrant、VirtualBox、Docker搭建与基本操作
3|0预备工作
因为我是Mac用户,所以这里VirturalBox和vagrant使用的是Mac版本,大家到官网各自下载对应的系统版本即可,强烈建议使用迅雷下载!
- VirtualBox-6.0.14-133895-OSX.dmg
- Vagrant_2.2.6_x86_64.dmg
- Centos7镜像
4|0容器与虚拟化技术
4|1什么是Docker
简单来说Docker是一款可以将应用程序与基础设施分离、代码及其所有依赖项打包,使应用程序能够从一个计算环境快速可靠地运行到另一个计算环境,达到快速交付、测试、部署的容器化技术。
4|2为什么要用Docker
我们可以反过来思考,不用Docker这些容器化技术会怎么样,会遇到什么问题和瓶颈。
事例
物理机时代
每个团队会需要申请一台物理机作为测试开发环境,进行一系列的环境搭建
通过上图可以看出直接使用物理机会存在一些问题
- 成本高 - 需要购买一台实体机器,没办法共享
- 部署慢 - 发布一个应用需要走漫长的流程
- 资源浪费 - 平时应用实际用不到那么多物理资源,除了搞活动时期,大部分时候处于闲置状态,还有一部分资源被操作系统运行程序占用
- 硬件限制 - 不同硬件厂商有兼容问题
- 不利于迁移扩展 - 如果想迁移到其他服务器上,需要重头打包配置应用依赖
虚拟化时代
在虚拟化技术出现之后,每个团队只需要申请一台虚拟机,多台虚拟机可以共享同一台物理机,大大降低了成本,一定程度上提升了资源利用率,当公司搞活动时系统需要扩展,只需要通过虚拟机镜像创建多个虚拟机即可,提升了系统扩展性和可用性
Hypervisor,又称虚拟机监视器(英语:virtual machine monitor,缩写为 VMM),是用来建立与执行虚拟机器的软件、固件或硬件。
被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。hypervisor提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。(引用自百度百科)
从上图不难发现,主机机器会为每个客体机器(虚拟机)提前分配好资源,与物理机时代一样,实际上应用本身可能并不需要那么多物理资源,有一部分资源被操作系统所占用,大部分时候处于闲置状态,仍然存在一些问题如下:
- 资源利用率低 - 操作系统占用了一部分资源
- 移植性差 - 虚拟机上的应用对操作系统有较大依赖
- 启动速度慢 - 每次运行一个虚拟机上的应用都需要先启动系统
- 部署麻烦 - 如果从开发环境切换到测试和生产环境,仍然需要重新搭建应用相关依赖
容器化时代
Docker容器类似沙箱,每个容器之间相互独立、资源隔离、互不干扰,Docker容器化技术出现后,基本解决了上面提到的问题,Docker有以下优势:
- 启动速度更快: 秒级启动。
- 快速的部署和交付: 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后, 运维人员可以直接使用这个容器来部署代码。
- 更高效的虚拟化: 它是内核级的虚拟化,因此可以实现更高的性能和效率。
- 高效的迁移: Docker可以运行在不同的平台,用户可以轻松的将一个应用从一个平台迁移到另一个平台。
- 节省开支: Docker容器除了运行其中应用外,基本不消耗额外的系统资源,一台设备可以运行上千个容器。
- 资源隔离:可以对Docker进行资源限制,每个容器可以享用自己的物理资源,互不干扰
从上图可以看到,我把物理资源变成可选了,这是因为默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。
Docker提供资源隔离机制,利用Linux内核的 namespace机制来做容器之间的隔离,通过内核的 cgroups 机制来做容器的资源限制(CPU、Memory、Disk等)。
但是直接在主体机器安装Docker,也会导致Docker容器直接依赖主体机器操作系统,没办法实现多租户隔离,后面章节会提到对应解决方案。
4|3什么是容器镜像和容器
镜像是一个可执行包,包含运行应用程序所需的所有内容——代码、运行时、库、环境变量和配置文件。容器是通过运行镜像启动容器,是镜像的运行时实例。镜像实际上就是一个容器的模板,通过这个模板可以创建很多相同的容器。
- Class文件 - 相当于Docker镜像,定义了类的一些所需要的信息
- 对象 - 相当于容器,通过Class文件创建出来的实例
- JVM - 相当于Docker引擎,可以让Docker容器屏蔽底层复杂逻辑,实现跨平台操作
4|4容器与虚拟机的区别
容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用比其他任何可执行程序更多的内存,使其轻量级。
虚拟机(VM) 运行一个成熟的“游客”操作系统,通过虚拟机监控程序对主机资源进行虚拟访问。通常,vm提供的资源比大多数应用程序所需的要多。
总的来说,容器不需要依赖操作系统,减少了很多系统资源开销,使得容器可以更关注应用的需求,而虚拟机可以为每个应用灵活提供不同的操作系统,避免了docker容器直接依赖主体机器操作系统,两者结合使用,可以让整个系统架构更加灵活,扩展性更强。
4|5Vagrant与Docker的区别
其实两款产品没有什么可比性,因为使用场景不同,这里列出来主要是避免一些童鞋误解。
Vagrant是一款管理虚拟机的工具,简化了虚拟机的搭建和管理工作,不需要再像以前一样,需要人工一个个去创建、启动、停止虚拟机,可以通过vagrant脚本同一时间轻松搭建和管理多个虚拟机节点。
docker是一款用于快速交付、测试、部署的工具,简化了应用环境的搭建和管理工作。两者适用范围不同。一个容器就是一个包含了应用执行所依赖的数据(包括lib,配置文件等等),Docker可以通过同一个镜像文件快速在不同的环境(开发、测试、生产)搭建多个相同的容器。
Vagrant是用于管理虚拟机,Docker用于管理应用环境。
4|6Docker引擎和架构
Docker引擎是一个客户端-服务器应用程序,主要组件如下:
- 服务器是一种长时间运行的程序,称为守护进程(dockerd)
命令)。 - 一个REST API,它指定了程序可以用来与守护进程对话的接口
指导它做什么。 - 命令行接口(CLI)客户端(docker命令)。
平时我们使用的docker指令都是通过docker客户端去与docker服务端进行通讯
Docker架构体系
Docker使用客户机-服务器架构。
Docker客户机与Docker守护进程进行对话,后者负责构建、运行和分发Docker容器。
Docker客户机和守护进程可以在同一系统上运行,也可以将Docker客户机连接到远程Docker守护进程。Docker客户机和守护进程通过UNIX套接字或网络接口使用REST API进行通信。
4|7Docker的镜像分层
Docker镜像是由一系列层构成的。每一层代表镜像Dockerfile中的一条指令。除了最后一层之外,每一层都是只读的。Docker镜像分层最大的好处是共享资源,其他相同环境的软件镜像都共同去享用同一个环境镜像,而不需要每个软件镜像要去创建一个底层环境。
上图以Tomcat镜像为例子,对于用户而言,用户面向的是一个叠加后的文件系统,我们对Tomcat容器做任何操作都会记录在容器层,底层镜像文件不会受影响。Docker容器底层共享主机内核,只保留少量运行Image必须的组件,在容器启动时不需要启动内核空间,所以启动时比虚机较快,开销少,易迁移。
4|8VirturalBox和Docker如何搭配使用
上面章节也提到过,如果我们把Docker直接安装在主体机器,会导致Docker直接依赖了我们主体机器的操作系统,如果不同的团队共用一台物理机时,没办法做到每个团队或每个环境都独享自己的操作系统和相应的权限。
目前一般的部署模式有以下几种:
- 物理机+Docker模式 - 适合高I/O要求的业务,如一些数据库服务、文件服务、缓存服务等
- 虚拟机 - 虚拟机的多租户的强隔离特性,保证租户在拥有虚机root权限的同时,其他租户和主机的安全
- 物理机+虚拟机+Docker混合模式 - 集合上面的优点,既可以提供安全隔离,也能实现灵活扩展和高可用
从上图可以看出,本教程采用的是混合模式,Docker容器可以在虚拟机内部运行,虚拟机并为它们提供经过验证的隔离,安全属性,移动性,动态虚拟网络等,可实现安全隔离和资源的高利用率。基本应该遵循:不同租户的业务运行采用虚拟机隔离,相似类型的业务部署在同一组容器上的思路。
当虚拟机太多的时候,我们也没办法手动一个个去管理,因此这里用到Vagrant工具去管理虚拟机。
4|9主体机器如何与客体机器上的容器进行通信
从上图可以看到,当我们使用Docker+虚拟机的混合模式时,实际上整体结构可以分为三大部分:主体机器、客体机器和容器。主体机器不能直接访问客体机器上的容器的IP地址访问容器,因为不再同一个网段,而要通过客体主机和对应的映射端口访问客体机器的容器。
以Tomcat容器作为一个例子,这里虚拟机网络模式默认是bridge
方式,在实战部分也有详细步骤,应用部署图如下:
我在客体机器Centos上启动一个Tomcat容器,容器端口为8080,映射端口为9090
通过命令查看得到,主体机器、客体机器、Tomcat容器IP地址(跟图片一致)如下:
- 主体机器 - 我机器自带的MacOS,IP地址为
192.168.100.4
- 客体机器 - 虚拟机上的Centos系统,IP地址为
192.168.100.9
- 容器 - Tomcat容器(linux内核),IP地址为
172.17.0.3
尝试主体机器(MacOS)访问客体机器(Centos)
可以看到,主体机器是可以直接与客体机器进行通信,因为在同一个网段
尝试客体机器(Centos)访问Tomcat容器
在虚拟机上可以直接与Tomcat容器进行通信
尝试主体机器(MacOS)通过客体机器(Centos)端口9090访问Tomcat容器
可以看到主体机器可以通过客体机器IP+端口方式访问容器,因此主体机器访问的并不是容器真实的端口,而是虚拟机上端口的映射。
5|0环境搭建与实战
5|1使用Vagrant管理虚拟机创建Centos7
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虚拟机
5|2在虚拟机安装Docker
安装Docker之前,需要进入刚才安装好的Centos7操作系统,因此需要先设置下SSH配置,这里使用的是账号密码登陆
通过SSH客户端访问Centos
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安装
在Centos上安装Docker
1.执行以下命令清理之前已安装的Docker文件,如果之前曾经安装过
因为这个系统是新安装,之前没有Docker相关文件,执行结果如下:
2.输入以下命令安装环境必要依赖
3.通过以下命令配置阿里云镜像加速器,否则下载镜像会比较慢,这里镜像加速器做了脱敏处理,大家可以自己去申请一个
怎么获取镜像加速器地址,可以查看我另一篇文章
使用Docker安装Oracle
4.设置Docker仓库,Docker默认仓库hub.docker.com
5.安装Docker
6.启动Docker服务
7.通过Docker仓库自带镜像,测试Docker是否已经安装成功
Docker会自动下载镜像,如果在本地查找不到
通过Docker安装Tomcat
1.从远方仓库拉去Tomcat镜像,这里不带版本号默认拉取最新版本
2.启动Tomcat容器,指定容器命名为evan-tomcat,并且配置容器端口9090映射到内置mysql 3306端口
通过Docker安装Mysql
1.从远方仓库拉去Tomcat镜像,这里不带版本号默认拉取最新版本
2.启动MySQL容器,并改名为evan-mysql,配置容器端口 3301映射到3306端口,并设置密码为evan123
检查容器是否启动
1.通过以下Docker指令可以查看上面我们安装和启动的容器是否正常运行:
2.我们可以通过上面的容器ID去进入到容器内部,这里以Tomcat为例子:
这样我们本章所有环境SETUP已经顺利完成,后面的章节将会更深入介绍容器的原理、集群部署、管理以及结合真实微服务的应用。
6|0Q&A
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降级,或者直接使用本文推荐的版本
7|0附录
7|1Vagrant常用命令
- vagrant up
启动虚拟机 - vagrant ssh
进入虚拟机 - )vagrant status
查看centos7的状态 - vagrant halt
停止/关闭centos7 - vagrant destroy
删除centos7 - vagrant status
查看当前vagrant创建的虚拟机 - Vagrantfile中也可以写脚本命令,使得centos7更加丰富
但是要注意,修改了Vagrantfile,要想使正常运行的centos7生效,必须使用vagrant reload
7|2Docker常用命令
- docker pull
拉取镜像到本地 - docker run
根据某个镜像创建容器 - -d 让容器在后台运行,其实就是一个进程
- --name 给容器指定一个名字
- -p 将容器的端口映射到宿主机的端口
- docker exec -it
进入到某个容器中并交互式运行
__EOF__
出 处:https://www.cnblogs.com/evan-liang
关于博主:热爱生活,爱读书/旅游,乐于专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
以上是关于Docker深入浅出系列 | 容器初体验的主要内容,如果未能解决你的问题,请参考以下文章