一:Docker与虚拟机比较
- 虚拟机会虚拟一整套操作系统,至少5G,而Docker只会虚拟出最小必要的内核,仅包含业务运行所需的runtime环境(ubuntu仅70M,甚至都不包含什么vi命令)。
- 虚拟机需要独立占用物理资源(如磁盘、CPU、内存等),虚拟机之间资源不可共享,而Docker之间可以共享物理资源。一台物理机上Docker可以部署100-1000个应用,而虚拟机一般能部署几十个应用。
- Docker安装环境非常简单,一条命令一分钟搞定;而虚拟机安装环境通常步骤都很多也比较繁琐还比较容器出错(例如在Linux上安装MySQL需要:1.卸载MariaDB,2.下载安装包,3.解压,4.创建data目录等, 5.初始化 6. 修改文件权限 7.配置服务 等等)。因此Docker能够保证环境安装的一致性,因为大家都是用的同一条命令安装的,不会出现程序在我的机器上可以跑,在别人的机器上不能跑的问题。
- Docker可以根据配置文件docker-compose.yml只需要一个命令同时安装一整套环境(如java/nginx/mysql/redis等),甚至同时在多台机器上安装。
- Docker扩容和缩容可以做到秒级别,非常快速简单,而虚拟机扩容是很麻烦的事。
- Docker中不同的应用运行的容器之间
环境隔离
。
二:Docker简介
Docker(GO语言实现的) https://www.docker.com 是对VM虚拟机进行大刀阔斧的精简,去掉没用的部分,只留下必须的部分,精简后的虚拟机更加轻量、资源占用非常少、启动非常快(几秒之内就能启动完成),在精简后的基础上又提供了一套命令,使得运维非常方便的搭建环境和部署程序,这就是Docker。Docker就是轻量级的虚拟机
。
2.1 Docker相关概念
-
Docker client: Docker命令行客户端,用于执行docker命令行(如 docker pull、docker build、docker run命令等)。
-
Docker daemon: Docker守护进程, Docker client 与 Docker daemon进行交互,Docker真正干活的人。
-
Docker Host: Docker宿主机,就是Docker安装所在的系统。
-
Docker image(镜像): 镜像就是一堆文件的压缩包,一般包括
应用本身jar包
+应用运行所需要的环境
、配置
、操作系统函数库
等打包成一个压缩包
文件.tar。环境整体打包:即将程序所运行所需要的一整套完完整整的环境打包起来(包括操作系统内核)。镜像可以通过Dockerfile、docker-compose.yml来生成, 镜像包含的属性:repository(仓库)、tag(标签/版本 latest表示最新的版本)、image id(镜像id)、created(镜像创建时间)、size(镜像大小), docker的镜像名的命名规则一般是:前缀/项目名称,前缀用于区分该镜像所属者,防止命名冲突,常见的前缀有library、docker.io。可以将自己制作的镜像推送到Docker Hub或者阿里云镜像仓库。 -
Docker container(容器) : Docker在运行镜像时会创建一个隔离环境叫做容器。从面向对象的角度来类比:把镜像比作类,容器就是类的实例化对象。每个容器就是一个简易版的Linux。
-
Docker hub/registry(仓库): 镜像所在的地方(类似于maven中央仓库的概念或者GitHub), 镜像仓库地址:https://hub.docker.com/
- Later(层):镜像是分层的,就像蛋糕和花卷一样,内部是蛋糕,蛋糕上面是奶油,奶油上面是水果。制作镜像时每个步骤(比如添加安装包、依赖、配置等)每次操作都会形成一个新的一层。如果某个层已经存在了就直接使用。例如在docker pull 拉镜像时会打印每个步骤,也就是每个层,有的层本地没有去网络上下载Download,有的层本地已经存在了就直接使用本地的。
2.2 Docker环境一致性
原来住房住的普通房子,现在需要搬家了,不得将屋内的所有东西装成多个箱子,然后通过货拉拉将这些箱子拉到新的房子,然后再从箱子里拿出每件东西,一点一点的布置房间,布置的过程中突然发现这个东西找不到了那个东西找不到了,丢了,不知道丢哪里去了,这就好像代码在我们本地环境运行的正常,在其它环境就报错了,根本原因不是代码原因而是代码所在的环境和自己的本地环境不是一模一样。假如我一开始就住在集装箱房子中,然后我叫货拉拉把我的集装箱房子直接搬到新的地方,也不用再收拾房子了,也不会丢东西了,整个过程节约了99%的时间。
同样环境也可以整体打包,直接把Linux最小内核+Nginx+JRE + jar包+MYSQL+Redis+MQ等一整套环境打包起来也就解决了环境的绝对完全一致问题,也就解决了程序在这个环境能运行在那个环境不能运行的问题。正如不同的电脑VMWare运行contos.iso文件虚拟出一致的Linux系统,不同的环境Docker运行镜像文件形成一致的应用程序。
VMWare + contos.iso = Docker + Image
2.3 联合文件系统(UnionFS)
Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。内部分层,外部聚合。
镜像是只读的,容器是可写的,容器位于顶层。
Union文件是Docker镜像的基础,镜像可以通过分层来进行继承
,基于基础镜像(父镜像),可以制作各种具体的应用镜像。分层的目的便于复用
,减少下载时间。
三:CentOS7安装Docker
https://docs.docker.com/engine/install/centos/
3.1 安装
$ yum -y install gcc
$ yum -y install gcc-c++
# 先卸载Docker
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装yum源
$ sudo yum install -y yum-utils
完毕!
# 配置yum源(可能会超时,如果超时使用下面阿里云的)
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
完毕!
$ docker -v
$ docker version
# 启动Docker 服务
$ systemctl start docker
$ systemctl status docker
$ systemctl stop docker
$ systemctl restart docker
# 开机启动
$ systemctl enable docker
# 查看镜像列表
$ docker images
# 配置Docker中国加速器(默认daemon.json是空的),建议使用aliyun
$ vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}
$ systemctl daemon-reload
$ systemctl restart docker
# 下载hello-world容器启动对应容器,检测安装是否成功,如果有打印信息就表示成功
$ docker run hello-world
3.2 配置阿里云镜像加速器
阿里云:产品/容器/容器镜像服务ACR/管理控制台(开通)/镜像工具/镜像加速器/CentOS。
四:Docker Hub
Docker Hub ( https://hub.docker.com/ ) 是Docker的官方仓库,可以搜索查看镜像的具体使用文档。