面试必备之 docker 相关知识 上
你好 我是懂 java 的测试
前言
当前容器已被广泛使用,很多公司都会用 docker 用来部署测试环境和生产环境;求职面试中,面试官对 docker 情有独钟;
学好 docker 这门技术,一方面可以在面试中体现自己的知识广度,另一方面使用 docker 技术在工作中处理一些棘手问题就会变得得心应手;
由于 docker 技术涉及到的东西很多,所以本系列文章不会面面俱到,只会分享在面试或工作中能使用到的技术;
文章分为上下两篇,主要讲述 docker 的基本概念、基本命令的使用和一些常用的高阶知识。
docker 是什么?
任何一门技术肯定是为了解决某个问题而出现的,学习一门技术之前,可以先想想这门技术的出现解决了什么问题,因此在理解 docker 之前,可以先想想用 docker 之前怎么部署项目的?
这里以部署 java 的 spring 框架项目为例,找一台物理机、安装虚拟软件以后,再虚拟一个虚拟机出来,在虚拟机中搭建 jdk、maven、tomcat(springboot 内部镶嵌了 tomcat)、redis 等基础环境,然后打包项目成一个 war 包丢入 Tomcat 中,启动 tomcat。
一切看着很方便,但是假如生产环境并发量很大,急需扩容几台虚拟机,是不是还得重复上述过程?扩容的同时,既要保证基础软件版本一致,又要保证大量配置文件正确,太耗时耗力。
不知道大家有没有遇到一种场景,就是在开发中,一般都会遇到相同的代码在自己的电脑上可以运行,但是当把项目打包发送给其他人的时候,相同的代码在别人的电脑上却不能运行,为啥?这是因为项目中使用到的一些技术的的版本不同的原因,例如 mysql 数据库的版本,java、jdbc 等技术驱动包的不同,都会导致项目无法运行。
除此之外,虚拟机资源成本很高的,每个项目都独立使用一个虚拟机资源,空闲期有点浪费,另外虚拟机启动一次真的很耗时。
那么怎么解决上述问题呢?docker 可以,首先我们可以使用 docker,把项目打成镜像(image),包含了运行环境和配置,上传到仓库中,然后其他虚拟机使用的时候拉取镜像,运行容器即可,速度极快,资源利用率得到极大提升,真正做到“一次镜像,处处运行”。
那么 docker 和虚拟机有什么区别?

docker 架构是什么样的?
如下截图,Docker 使用的是 C/S 架构,Docker Client 用于和 Docker 的守护进程通信(守护进程就是 Server),守护进程可以用来构建、运行和分发 Docker 容器等操作。Docker Client 和守护进程可以在同一系统上运行,或者将 Docker Client 远程连接到守护进程。使用REST API
协议,并通过UNIX
套接字或网络接口进行通信。另一个 Docker Client 是 Docker Compose(允许我们将一组容器组成的应用程序)

docker 三大核心是什么?
这里要说的 Docker 三大核心,分别是image
镜像container
容器,repository
仓库;这可以说是 Docker 最重要的部分。
1)镜像
Docker 镜像是 Docker 容器运行时的只读模板,镜像可以用来创建 Docker 容器(每一个镜像都由一系列的层组成)
2)容器
Docker 主要就是利用容器来运行应用,一个 Docker 容器内可以说包含了某个应用运行所需要的环境。每一个 Docker 容器都是从镜像创建出来的。可以说容器就是镜像创建的运行实例,它可以被启动,停止,删除等。而且每个容器都是互相隔离的,保证安全的平台。
3)仓库
Docker 仓库主要就是 用来集中保存镜像的地方,当我们创建了自己的镜像后,可以使用push
命令将它上传到公共仓库(Public)或者私用仓库(Private),这样的好处是,当我们需要在另外的服务器上使用这个镜像时,可以直接从仓库进行拉取(速度相对较快)。
docker 镜像操作命令有哪些?
docker images
查看本地已有镜像

docker pull mysql
拉取一个 mysql 的镜像到本地,不加版本号,默认拉取最新的,如果想指定版本号可以这样用 docker pull mysql:5.7
dockersearch mysql
搜索 mysql 镜像,

docker rmi -fmysql
docker rmi mysql,删除 mysql 镜像,加上 -f 是指强制删除 mysql 镜像,删除多个镜像呢?可以这么玩,docker rmi mysql hadoop hive,删除 mysql、hadoop、hive 三个镜像。
docker rmi $(docker images | grep "hub" | awk '{print $3}')
上面这条命令,可以删除所有名字中带 “hub” 关键字的镜像。
总结
docker 上篇文章就分享到这里,鉴于文章篇幅有限,本文主要讲述了 docker 基本概念和操作镜像的基本命令。下篇文章会着重讲解 docker 容器和仓库的相关操作命令和 dockerfile 等高阶知识。