官网的介绍是“Docker is the world’s leading software container platform.” 官方给Docker的定位是一个应用容器平台
所谓应用,即我们经常使用的Mysql Redis MongoDB ElasticSeacrh Tomcat Nginx 等…
Docker为这些应用准备各自的环境,你可以直接从DockerHub中Pull下来进行使用,这点类似Github
拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、spring等等。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序直接打包成镜像,直接运行在容器中即可
Docker的便利性
服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序
Docker的隔离性
公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率
有了Docker,集群部署将变得非常容易
比较上面两张图,我们发现
虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。
Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。
在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存
传统虚拟机与Docker容器的参数对比:
传统虚拟机Docker容器磁盘占用几个GB到几十个GB左右几十MB到几百MB左右CPU内存占用虚拟操作系统非常占用CPU和内存Docker引擎占用极低启动速度(从开机到运行项目)几分钟(从开启容器到运行项目)几秒安装管理需要专门的运维技术安装、管理方便应用部署每次部署都费时费力从第二次部署开始轻松简捷耦合性多个应用服务安装到一起,容易互相影响每个应用服务一个容器,达成隔离系统依赖无需求相同或相似的内核,目前推荐是Linux是否类似Git的感觉呢?
镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置tar:一个对镜像打包的文件,日后可以还原成镜像所谓镜像,是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
UnionFS(联合文件系统)
Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际是由一层一层的文件系统组成。
docker的镜像实际是由一层一层的文件系统组成
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel(内核),Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host(主机)的Kernal,自己只需要提供rootfs就行了。
由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
分层的好处:
资源共享
如果有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层
注意:
Docker要求你的CentOS至少是7以上的版本以下操作皆为官网步骤简化1.卸载原Docker(新系统可忽略)
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine2.安装docker依赖
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm23.设置docker的yum源
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo4.安装最新版docker
$ sudo yum install docker-ce docker-ce-cli containerd.io4.选 指定版本安装docker
$ yum list docker-ce --showduplicates | sort -r #列出docker所有版本 $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io #选择对应版本进行安装 #$ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io5.启动与关闭
$ sudo systemctl start docker $ sudo systemctl stop docker6.测试
$ sudo docker run hello-world若安装成功,显示如下
Docker的镜像源在国外,国内拉取镜像的速度很慢,使用阿里加速服务
阿里镜像加速服务