在了解docek之前先了解一下虚拟化的概念
一、虚拟化技术发展概述
在虚拟化技术出现之前,如果搭建一台服务器是这样的:
- 1、购买一台硬件服务器;
- 2、在硬件服务器上安装配置操作系统;
- 3、在操作系统之上配置应用运行环境(JDK、Tomcat、MySQL等);
- 4、部署并运行应用;(war包)
这种方式的缺点: - 1、部署应用非常慢;
- 2、应用迁移麻烦,要将应用迁移到一台新机器,又需要重来一遍;
所以,随着技术发展,改进了这一问题,出现了虚拟化技术;
二、虚拟化技术是什么?
虚拟化(英语: Virtualization)是一种计算机资源管理技术,它将计算机的各种硬件资源,比如磁盘、网络、CPU、内存等硬件资源,予以抽象和转换从而呈现出一套新的硬件资源环境,在这一套新的硬件环境下可以安装我们的操作系统,部署我们的应用运行环境等,它打破了计算机硬件资源不可切割的问题,使我们可以更加充分更加合理地利用计算机硬件资源;
虚拟化一般分为:
硬件级虚拟化(hardware-level-virtualization)
硬件级虚拟化 是运行在硬件之上的虚拟化技术,它的核心技术是Hypervisor 发音 [,haip?'vaiz?],Hypervisor是一种运行在基础物理服务器硬件之上的软件层,可以虚拟化硬件资源,例如cpu、硬盘、内存、网络资源等,然后我们可以通过在虚拟化出来的资源之上安装操作系统,这也就是所谓的虚拟机,像VMWare, VirtualBox等都是使用该技术;
通过Hypervisor层,我们可以创建不同的虚拟机,并且每个虚拟机都是隔离独立的,这样一来,我们就可以在一台硬件服务器和操作系统之上虚拟化出多个虚拟服务器,用来部署我们的应用;
虚拟化技术的优点:
一台物理服务器可以虚拟化出多个虚拟的服务器,让计算机资源得以充分利用;
虚拟化技术的缺点:
- 1、每创建一个虚拟机的时候,都会创建一个操作系统,这个操作系统会占用很多资源,这样无疑大大的增加了资源的消耗,当安装的虚拟机越多,资源消耗就越多;
- 2、环境兼容性问题,开发时的环境运行正常,部署到虚拟机环境测试则有可能发生异常;
基于硬件级虚拟化技术的缺点和不足,随着技术的发展,后续又发展出来了另一种虚拟化技术,即操作系统级虚拟化技术;
操作系统级虚拟化(os-level-virtualization)
操作系统级虚拟化 是运行在操作系统之上的虚拟化技术,它模拟的是运行在一个操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,该技术也称为容器化技术,在容器化技术领域,Docker 是目前最流行的一种实现;
三、Docker是什么?
Docker发布于2013 年,基于LXC技术,LXC是Linux 平台上的容器化技术实现;
LXC是Linux Container的简写,它是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,它与宿主机使用同一个内核,性能损耗小,这种技术是Linux提供的,但是直到Docker出世,该技术才被发挥出来;
2013年 3月 20 日发布 Docker 0.1;
2014 年 6月 9日发布Docker 1.0,1.0 版本标志着 Docker 平台已经足够成熟,并可以被应用到生产产品中(还提供了一些需要付费的支持选项)。
当前Docker的最新版本是20.10.17;
docker官网发行版本
1、Docker 是一个开源的应用容器引擎。
它基于 Google 公司推出的 Go 语言实现,项目代码托管在 GitHub 上进行维护;
2、Docker技术让开发者可以打包他们的应用以及依赖包到一个可移植的容器中
打包好的容器可以发布到任何流行的 Linux 服务器上运行,这样就可以解决开发环境与运维环境不一致的问题了,所以容器技术解决了开发和运维之间的矛盾,让开发专注于开发,运维专注于运维,不要被环境问题所打扰;
3、Docker彻底释放了虚拟化的威力,极大降低了计算机资源供应的成本。
Docker 重新定义了程序开发测试、交付和部署过程,Docker 提出了“构建一次,到处运行”的理念,让应用的开发、测试、部署和分发都变得前所未有的高效和轻松!
4、Docker是一种轻量级的操作系统虚拟化解决方案
Docker 的基础是 Linux 容器(LXC)技术,在LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单;
Docker 自开源后受到广泛的关注,Docker最早是基于Ubuntu开发的,但后续CentOS、Debian、Fedora等主流的Linux操作系统都支持Docker;
总结:简单地说,Docker是对软件和其依赖环境的标准化打包(集装箱),应用之间相互隔离,共享一个OS Kernel(解决了资源浪费的问题),可以运行在很多主流操作系统上;
但是也需要澄清一下,Docker本身不是容器,Docker只是管理容器的引擎;
三、容器和虚拟机的区别
-
容器是将代码和环境的关系打包在一起的一个集合,而虚拟机是在物理层面上,分出来的一个操作系统;
-
多个容器可以运行在同一台物理服务器上,并共享一个操作系统的内核资源。多个虚拟机也可以运行在同一台机器上,但每个虚拟机都需要一个完整的操作系统;
1、下图比较了 Docker 和传统虚拟化方式的不同之处:
可见容器是在本地操作系统层面上实现虚拟化,直接复用本地主机的操作系统,不需要单独安装操作系统,而传统的虚拟化技术方式则需要单独安装每个虚拟机的操作系统。
2、为什么使用Docker
作为一种新兴的虚拟化技术,Docker 跟传统的虚拟化方式相比具有众多的优势。
- 1、Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;
- 2、Docker对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器;
- 3、容器除了运行其中的应用外,基本不消耗额外的系统资源,使得应用的性能很高;传统虚拟机方式运行 10 个完全不同的应用可能我们会起10个虚拟机来部署,而Docker 只需要启动 10 个隔离的应用即可;
- 4、Docker可以更快速的交付和部署,大量地节约开发、测试、部署的时间,对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行;
- 5、更高效的虚拟化,Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率;
- 6、更轻松的迁移和扩展,Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性可以让用户轻松地把一个应用程序从一个平台直接迁移到另一个平台;
四、 Docker运行环境部署
1、 Docker的版本
Docker从2013年 3月 20 日发布 Docker 0.1,到现在已经发布了多个版本,从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。
Docker CE 即社区免费版,可永久免费使用;
Docker EE 即企业版,功能更全,更强调安全,但需付费使用;
我们介绍 Docker CE 版本,当前Docker的最新版本是20.10.17;
Docker官方网站:https://www.docker.com/
2、 Docker的安装
首先我们知道Docker并不是容器,它是一个管理容器的引擎;
我们采用的Linux版本是CentOS 7,学习Docker也更推荐在Linux环境下使用;
Docker 支持 CentOS 6 及以后的版本;
CentOS7系统可以直接通过yum进行安装:
2.1 安装命令
安装前可以查看一下系统是否已经安装了Docker:
yum list installed | grep docker
安装:yum install docker -y
安装后,使用docker --version(docker version,docker -v)查看docker是否安装成功,docker --help 查看docker帮助命令;
卸载:
yum remove docker.x86_64 -y
yum remove docker-client.x86_64 -y
yum remove docker-common.x86_64 -y
3、Docker服务启动
安装之后启动 Docker 服务;
启动:systemctl start docker 或者 service docker start
停止:systemctl stop docker 或者 service docker stop
重启:systemctl restart docker 或者 service docker restart
检查docker进程的运行状态:
systemctl status docker 或者 service docker status
查看docker进程:ps -ef | grep docker
docker info 查看docker系统信息
docker --help查看所有的帮助信息
docker commond --help 查看某个commond命令的帮助信息
五、Docker的运行机制
我们知道Docker并不是容器,而只是一个管理容器的引擎;
1、 Docker的底层运行原理:
- Docker服务
- 启动下载镜像
- 启动该镜像得到一个容器
- 容器里运行着我们想要的程序;
2、第一个Docker容器
根据Docker的运行机制,我们将按照如下步骤运行第一个Docker容器
2.1、将Docker服务启动;
2.2、下载一个镜像,
Docker 运行一个容器前需要本地存在有对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub公共注册服务器中的仓库 https://hub.docker.com)。
2.3、 CentOS下怎么下载(pull)镜像?
从docker hub官网搜索要使用的镜像,也可以在命令行使用命令搜索要使用的镜像,
1、比如 docker search tomcat进行搜索,然后下载所需要的镜像:
下载镜像:docker pull docker.io/tomcat
运行镜像:docker run docker.io/tomcat 前台运行, 要后台运行,加参数 -d
2、显示本地已有的镜像:docker images![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f5d08519353ab1c5b113d71fff733abe.png)
在列出信息中,可以看到几个字段信息
- REPOSITORY:来自于哪个仓库,比如 docker.io/tomcat
- TAG:镜像的标记,比如 latest最新的
- IMAGE ID:镜像的 ID 号(唯一)
- CREATED:创建时间
- SIZE:镜像大小
3、启动下载下来的镜像得到一个容器:
docker run -d docker.io/tomcat 或者 docker run -d 41a54fe1f79d (镜像ID)
默认是前台启动,如果需要后台启动,指定-d参数;
通过 ps -ef | grep tomcat 查看,检查tomcat镜像是否启动容器成功;
2.2、进入Docker容器
docker ps 查看运行了哪些容器
docker stop cef0d139bfd6(容器ID) --停止某个容器
进入容器:docker exec -it cef0d139bfd6(容器ID) bash
其中i表示交互式的,也就是保持标准输入流打开;
t表示虚拟控制台,分配到一个虚拟控制台;
退出容器:exit
2.3、客户机访问容器
从客户机上访问容器,需要有端口映射,docker容器默认采用桥接模式与宿主机通信,需要将宿主机的ip端口映射到容器的ip端口上;
停止容器:docker stop 容器ID/名称
启动容器:docker run -d -p 8080:8080 docker.io/tomcat 或者 41a54fe1f79d
六、Docker核心组件
1、 Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建;
镜像与容器的关系类似于面向对象编程中的类与对象的关系。
2、Docker 三个核心要素
Docker 包括三个核心要素
镜像(Image)、容器(Container)、仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期;
Docker 的运行离不开以上核心几个组件的支持,Docker的成功也是拜这几个组件所赐;
不能错误地理解为Docker就是容器,实际上Docker不是容器,而是管理容器的引擎;(守护进程)
3、镜像
3.1、镜像的基本概念
Docker镜像就是一个只读的模板,可以用来创建Docker容器;
例如:一个镜像可以包含一个完整的 centos 操作系统环境,里面仅安装了 mysql 或用户需要的其它应用程序;
Docker提供了一个非常简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用;
3.2、镜像的组成结构
镜像是由许多层的文件系统叠加构成的,最下面是一个引导文件系统bootfs,第二层是一个root文件系统rootfs,root文件系统通常是某种操作系统的运行环境,比如centos、Ubuntu,在root文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成docker中的镜像;
3.3、镜像的日常操作
1、下载镜像,比如下载redis镜像:docker pull redis:latest
reids是查询到的镜像名称,latest是镜像的标签tag
获取一个镜像有两种方式,一种是从官方镜像仓库下载,一种是自己通过Dockerfile文件构建;
如果有官方镜像,我们就不必自己用Dockerfile文件构建了,除非官方没有才会自己去Dockerfile文件构建;
2、列出已经下载的镜像:docker images,或者 docker images redis
3、运行镜像:docker run -d redis 其中-d表示在后台运行
然后通过ps -ef | grep redis可以查到redis进程
4、查看容器镜像的状态:docker ps
通过docker exec -it a8584016f9b6(容器ID) bash 进入redis容器
5、删除镜像:docker rmi redis:latest 注意是rmi,不是rm,rm是删除容器;
4、容器
4.1、容器的基本概念
容器是从镜像创建的运行实例,它可以被启动、停止、删除,每个容器都是相互隔离的、保证安全平台,可以把看做一个简易版的 Linux环境,包括root用户权限、进程空间、用户空间和网络空间和运行在其中的应用程序;
Docker利用容器来运行应用,镜像是只读的,容器在启动的时候创建一层可写层作为最上层;
4.2、容器的日常操作
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将处于终止状态的容器重新启动;命令:docker start 容器id或容器名称
通过镜像启动容器:docker run -d redis
查看运行中的容器:docker ps
查看所有的容器:docker ps -a
停止容器:docker stop 容器id或容器名称
已经停止的容器,我们可以使用命令 docker start 来重新启动;
开启容器:docker start 容器id或容器名称
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器;
删除容器:docker rm 容器id或容器名称
删除容器时,容器必须是停止状态,否则会报错;
进入容器:docker exec -it 容器id或容器名称 bash
还可以使用 docker inspect + 容器id或容器名称 查看容器的更多信息(元信息);
停用全部运行中的容器:docker stop $(docker ps -q)
删除全部容器:docker rm $(docker ps -aq)
一条命令实现停用并删除容器:
docker stop $(docker ps -q) & docker rm -f $(docker ps -aq)
5、仓库
5.1、仓库的基本概念
仓库是集中存放镜像文件的场所,有时候会把仓库和仓库注册服务器(Registry)看做同一事物,并不严格区分,实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag);
仓库分为公开仓库(Public)和私有仓库(Private)两种形式;
最大的公开仓库是 Docker Hub (https://hub.docker.com/),存放了数量庞大的镜像供用户下载;
当然,用户也可以在本地网络内创建一个私有仓库;
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来即可;
Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务;
5.2、仓库的日常操作
用户可通过 docker search 命令来查找官方仓库中的镜像:
docker search rabbitmq
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建;
- 官方的镜像说明是官方项目组创建和维护的,automated 资源允许用户验证镜像的来源和内容;
根据是否是官方提供,可将镜像资源分为两类; - 一种是类似 centos 这样的基础镜像,被称为基础或根镜像。这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字;
- 还有一种类型,比如 tianon/centos 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀,可以通过前缀 user_name/ 来指定使用某个用户提供的镜像,比如 tianon 用户;
并利用 docker pull 命令来将它下载到本地:
docker pull rabbitmq
docker pull centos