一、背景介绍
在传统应用开发完毕之后,测试和部署一般都不在同一台机器上边进行,容易存在以下几个问题:
跨操作系统(跨平台)问题 | 不同操作系统(比如linux和windows)下边,不论是配置还是应用环境都需要重新考虑,移植应用非常麻烦; |
配置文件+应用版本问题 | 在开发环境、测试环境、生产环境当中,不同的环境下,可能存在的一些基础的配置不同、应用版本不同(比如不同环境可能jdk版本、mysql版本不一样,相应的配置文件也会不同),即便是相同的代码,换个配置环境可能就会出现各种版本、配置错误导致的错误; 即便是不同环境下,重新去修改配置和应用版本,也非常麻烦,提交给测试和运维之后,还需要提供给对方一堆配置文件; |
机器硬件问题 | 由于硬件设备的差异性,可能会导致一些应用在不同的机器上运行失败!(暂时不多加赘述) |
这就是常说的-----“在我的电脑上明明可以运行的呀,为什么你的电脑上就会出现问题呢?”。那我们现在就非常期望能不能有一种技术:可以让应用只要一次配置好环境,即便是在不同机器、不同的平台上,也能够让我们可以免于安装一大堆与应用运行相关的软件、免于去检查软件版本,以及编写一大堆的配置文件,直接一键就能部署好应用呢?使用Docker容器虚拟技术可以很好的解决这个问题!
二、Docker引入
1、Docker是什么?
Docker是基于Linux容器化虚拟技术、采用了GO语言开发的一个开源应用容器引擎,是能够解决运行环境和配置问题的软件容器,是方便做持续集成并且有助于整体发布的容器化虚拟技术!
Docker基本介绍 | |
主要目标 | Build, Ship and Run Any App, Anywhere! |
作用 | 通过对应用组件的封装、分发、部署、运行等生命周期的管理,可以让用户的应用及其运行的环境被打包到一个可移植的容器当中,然后可以发布在任何平台的Docker当中,一键部署和运行,实现“一次镜像,处处运行”; |
具体的操作 | 开发者可以通过Docker,将自己的应用及相关的依赖包等所有应用运行需要的资源,直接打成一个镜像文件;镜像可以通过Docker,拿到能够运行的容器实例。 |
如下图所示, 因为在不同环境当中的镜像文件都是一样的,镜像文件当中所包含的与应用运行相关的资源和配置都一样,而Docker容器在所有操作系统上都是一致的,所以可以很方便地在不同环境当中,实现“一次镜像,处处运行”的特点!
2、Docker和传统虚拟机技术的对比?
传统的虚拟机 | 容器化虚拟技术 | |
定义 | 需要主操作系统上边,通过虚拟机管理系统(比如VMware)虚拟出一整套硬件,然后在上边运行了一个完整的操作系统,再在操作系统上边安装、部署、运行所需应用。 对于主操作系统而言,虚拟机只是一个文件;对于应用而言,虚拟机就是一个真实的系统,应用并不会感知到另一个操作系统的存在; | Linux容器本来就是为了解决虚拟机技术当中的缺点发展出来的另一种虚拟化技术:
|
特点 | 是硬件层面上的虚拟化,捆绑了一整套的操作系统,从而使应用、操作系统、硬件三者这件的逻辑不变。 | 是操作系统层面上的虚拟化,直接用的就是本地主机的操作系统,只需要软件工作所需要的库资源和设置,可以很方便地保证应用可以在不同的环境当中都能始终如一运行。 |
缺点 | 占用资源大;冗余步骤多;启动速度慢;应用整合麻烦; | 得单独支持容器化的相关技术(比如podman,Docker等) |
相同点 | 都是可以实现带环境安装的实例 | |
不同点 | 虚拟机是在虚拟出一套硬件之后,再在上边运行了一个完整操作系统,然后在操作系统上再运行所需要的应用进程; | 容器当中的所有应用进程都是运行于宿主机的内核,容器是没有自己内核的,也不需要做硬件虚拟; 容器之间相互隔离,每个容器都有自己的文件系统,容器之间进程互不影响,可以区分计算资源; |
3、Docker具备的优势?
快速应用交付和部署 | 使用容器化虚拟技术之后,应用开发完毕,只需要交付少量镜像文件,在正式生产环境当中加载镜像并运行即可; 由于镜像当中有内置的应用安装配置,所以可以节省非常多部署配置和测试的时间; |
更便捷的升级和扩容 | 由于现在很多应用都是通过微服务方式架构的,所以应用的构建会变得越来越轻便,每个应用都可以被打包成一个Docker容器,应用的升级就变得简单; 当现有容器已经不足以支撑业务处理的时候,可以通过镜像去运行新的容器,实现应用系统的快速扩容(甚至秒级); |
更简单的系统运维 | 容器会将应用程序相关的环境和状态完全封装,不会因为底层基础架构和操作系统的不一致性给应用带来影响,可以让应用在容器化之后,不同环境下(生产/开发/测试环境)运行的状态都保持高度一致。 当程序出现异常的时候,可以通过测试相同环境下的容器去进行快速定位和修复; |
更高效的计算资源利用 | 因为容器当中的应用进程都是复用宿主的内核,它没有自己的内核,也不需要做硬件虚拟化,资源占用比较小,因此在一台物理机上,可以支持运行多个容器实例,可以提升物理服务器的CPU和内存的利用率; |
有很多大型互联网企业都在使用 | 应用场景非常多; |
三、Docker的基本组成
1、基本组成
镜像(Images) | 本质上是保存有【应用】及【运行所需全部依赖】和【配置】的文件,每个镜像都相当于是一个可以交付的运行环境; Docker镜像是由一层一层叠起来的文件系统组成的; 镜像是只读的模版,一旦创建就不可以修改。可以通过镜像去创建Docker容器,每个镜像都可以创建多个容器实例; | 镜像是构建容器的基础,容器是镜像的运行实例; |
容器(container) | 容器基于镜像创建的运行实体,它是一个独立的、轻量级的可执行环境,是运行的进程,里边有应用程序在运行所需要的所有文件、库、配置等信息。 容器可以看成镜像运行之后得到的形态,是镜像的运行实例,可以动态执行命令、提供服务; 容器之间是相互隔离的; | |
仓库(repository) | 是存放镜像文件的地方,可以将镜像文件发布到仓库当中,也可以从仓库里边拉取镜像; |
2、Docker的架构
Docker是Client-Server结构的系统,它的守护进程运行在主机上;
Dcoker是通过Socket连接从客户端去访问守护进程的,当守护进程收到来自客户端的命令之后,就会去管理运行在主机上边的容器,而主机上边如果没有对应的容器,就会先去仓库当中下载一个镜像文件,Docker会运行这个镜像文件,继而拿到对应的容器;
四、Docker的常用指令
1、Docker当中的帮助命令
查询某个指令的帮助信息 | docker 【指令】 --help |
2、Dcoker当中的镜像命令
注意:镜像是只读的,所以没有修改哦!!!
查询 | 查询宿主机上所有镜像文件 |
可带选项: -a:查询所有镜像(包括历史镜像) -q:只显示镜像的id |
查询某个镜像的名字 |
command比如: --limit:搜索查询指定镜像名前几个 | |
查看镜像或容器占用硬盘空间 |
| |
新增 | 从仓库拉取镜像文件 |
注意:镜像不带版本号,默认最新版本,带版本号,就拉取指定版本的镜像; |
将容器导出为镜像文件到宿主机 |
| |
将容器打成镜像 |
| |
删除 | 删除没有运行容器的镜像 |
|
强制删除镜像,包括正在运行容器的镜像 |
| |
一次性删除多个镜像 |
|
3、Docker当中的容器命令
查询 | 查询运行的容器 |
选项: -a:查询所有运行的容器包括历史运行的容器 -q:只显示正在运行的容器编号 -l:显示最近创建的容器 -n:只显示最近n个创建的容器 |
查看容器日志 |
| |
动态查看容器内运行的进程 |
| |
查看容器内部具体命令细节 |
| |
操作 | 启动容器 |
options: --name=”容器的新名字” :给容器指定名称 -i:以交互模式启动容器 -t:为容器分配一个伪输入终端 -d:后台运行容器并返回容器ID -p:给容器指定映射端口(-p hostPort:容器Port) -P:给容器随机指定映射端口 |
重启容器 |
| |
启动已经停止的容器 |
| |
停止容器 |
| |
强制停止容器 |
| |
退出容器 |
会导致容器被关闭;
退出容器但是不会关闭容器 | |
删除 | 删除已经停止的容器 |
|
强制删除容器,包括正在运行的容器 |
| |
备份容器 | 从容器备份文件到宿主机 |
|
导出容器 |
| |
导入容器 |
| |
进入容器 | 进入运行的容器内部 |
|
|