为什么要使用docker
解决协作编码时,遇到的各种软件(中间件等)版本不同的问题
想必有经历过协作开发的小伙伴们都遇过这样的问题,开发完的东西,在这台电脑完美运行,但是在另外一台电脑就跑不动了。这大多数是由于某些软件版本和环境不相同所导致的问题,而解决这种问题,时常要花费许许多多的物力人力。这非常不利于软件的开发和使用。
而docker的出现,可以解决掉上述所说的软件版本和环境不同的问题。
解决环境(切换/配置)麻烦的问题
我们在编程过程中,有很多时间都浪费在了“环境”的问题上,只要我们使用了docker。在docker镜像运行时使用不同的参数或者是用不同“环境”时的镜像,我们就可以做到简单快捷的切换和配置环境(甚至许多docker镜像都是开箱即用的)。还有一点就是,一个docker容器启动的速度是非常快的,只要短短几秒,就能启动一个实例。
实例启动速度快,容易对服务进行扩缩容
某一些业务是很难界定究竟要开多少个服务才能够保证能够正常提供服务的。如果提供多了,会造成浪费,提供少了则会影响用户使用。那么就要求我们的服务必须做到快速的扩缩容。而docker启动速度快且镜像比较小,就很适合这种场景。
什么是docker
Docker是PaaS提供商 dotCloud 开源的一个基于LXC的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
目前,Docker可以在容器内部快速自动化部署应用,并可以通过内核虚拟化技术来提供容器的资源隔离与安全保障等。由于众多新颖的特性以及项目本身的开放性,Docker在不到两年的时间里迅速获得诸多厂商的青睐。
docker理念
简单来说,docker的理念就是,一次镜像,处处运行。
容器和虚拟机比较
-
虚拟机
- 传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统,在虚拟机上安装从操作系统,在从操作系统中安装和部署各种应用
-
容器
- Docker容器是在操作系统层面实现虚拟化,直接复用本机的操作系统,而传统的虚拟机是在硬件层面实现虚拟化。与传统虚拟机相比,Docker优势体现为启动速度快,占用体积小。
- Docker==利用的是宿主机的内核,而不需要加载操作系统内核==,因此新建一个docker容器仅需要几秒钟
-
Docker容器 虚拟机 操作系统 与宿主机共享OS 宿主机OS上运行虚拟机OS 存储大小 镜像小,便于存储和传输 镜像庞大 运行性能 几乎无额外性能损失 操作系统额外的CPU,内存消耗 移植性 轻便,灵活,适应于Linux 笨重,与虚拟化技术耦合度高 硬件亲和度 面向软件开发者 面向硬件运维者 部署速度 快 较慢
docker的一些优势
- 它使得配置更加简单。
- 它让开发人员能够更加专注于业务逻辑,减少了开发时间并且提高了生产力
- 在docker容器中运行的应用是隔离的(程序A不会影响程序B)
- 它以容器化的形式减少了多台服务器的使用
- 它具有快速部署的能力
- docker可以在任何基础设施上运行,无论是普通的家用机器,还是云服务器。
docker如何解决上面提到的问题
上面我们提到过docker可以解决软件版本和环境不同的问题,那么docker他是怎么解决的呢?
将应用及其依赖和环境打包成镜像
像我们安装Linux虚拟机一样,我们需要使用镜像,通过镜像来安装系统。而有的镜像安装完后,基本没有额外的什么软件,有的镜像安装完后则有许多的软件(这就是在镜像中添加了其他软件)。
docker镜像就是这样,我们可以将依赖和环境构建成一个镜像,只需要运行docker的命令,就可以进行安装。
如何使用docker下载别人提供的镜像?
使用docker pull拉取镜像
docker pull的命令为:docker pull 镜像名:标签(TAG)
在docker pull之前我们可以先用docker search查看是否有这个镜像,然后再进行拉取。也可以通过dockerhub去查看是否有这个镜像。
我个人是比较推荐使用dockerhub去查看是否有这个镜像,因为用dockerhub能够比较直观的看清楚哪些就是你要的镜像,并且会提供给你拉取的语句。
以openresty为例子
使用docker run拉取并运行镜像
docker run的基本命令为:docker run 镜像名:标签(TAG)
。对于这个命令的参数,我们暂不讨论。
例如:我们使用docker run hello-world:latest
命令,docker会先在本地仓库寻找hello-world:lastest镜像是否存在,若不存在,则会去远程仓库进行拉取。拉取成功后则运行。
如何构建属于自己的docker镜像?
使用Dockerfile
Dockerfile是什么?
Dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建步骤:编写dockerfile文件,docker build -t 镜像名:标签名(TAG) . 命令自动构建镜像(可以但是绝对不允许不填写镜像名和标签名,会造成虚悬镜像的问题),docker run镜像运行容器实例
docker执行Dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并且对容器进行修改
- 执行类似docker commit(提交对容器改变的操作)提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令,直到全部执行完成
什么是虚悬镜像(dangling images)
仓库名(镜像名)、标签名都为<none>
的镜像,它们是失去存在价值的镜像,通常不建议使用。并且也建议删除掉虚悬镜像来释放空间,避免浪费资源。
批量删除方法:docker image prune
希望我整理出来的内容能够帮助到学习docker的小伙伴们