1. 前言

接触Docker也有两年多了,断断续续玩过一些应用场景,如安装一些常用工具服务,部署业务项目,基于gitlab+jenkins pipeline+docker的CI/CD实现等。了解其基本知识与操作,但不能说深度掌握,故借此系列进行梳理与学习,也希望对有意学习Docker的人提供参考。

2. Docker简介

Docker最初是dotCloud公司(后来也改名为Docker)的一个内部项目,于2013年3月开源。Docker使用Google推出的Go语言实现,基于Linux内核的cgroup、namespace、Union FS等技术(先不用急着了解这些都是啥),对进程进行隔离,是操作系统层面的虚拟化技术。相对于传统的硬件层面的虚拟化技术(虚拟机),Docker显得更为轻量化。下图为传统虚拟机与Docker的结构对比
vm-docker

由上图可看出传统虚拟机技术是在硬件层面虚拟出一套硬件(CPU、内存、磁盘、网卡等)后,在其上运行一个完整的操作系统,再在操作系统上运行应用进程;而Docker的应用进程是直接运行在宿主机的内核上,也不需要进行硬件虚拟,因此,Docker要比传统虚拟机更为轻便。

总结Docker相对传统虚拟化技术的优势如下:

  1. 更高的资源利用率:Docker不需要硬件虚拟与运行完整操作系统的开销,所以资源利用率更高,同样配置的主机,采用Docker往往可以运行更多数量的应用。
  2. 更高效的使用体验:在操作系统上安装一些常用软件,如mysql,redis等,往往需要折腾好一阵,有些还要手动安装各种依赖,而采用Docker,可能几行命令就可以让一个服务快速运行起来。
  3. 一致的运行环境:Docker镜像功能可以把程序运行需要的环境进行封装,确保程序在开发、测试、生产环境都能保持一致性,避免因环境不一致导致程序运行异常。
  4. CI/CD支持:使用Docker可以定制镜像来实现持续集成、持续部署,如基于gitlab + jenkins pipeline + docker的自动化部署。
  5. 更轻松的维护:因为Docker保证了运行环境的一致性,因此应用的迁移或缩放将变得很容易;Docker的分层存储与镜像技术,也使得应用重复部分的复用变得更简单,基于基础镜像可以进一步扩展定义自己的镜像,也可以直接使用官方镜像来使用。

3. Docker的基本架构

Docker的基本架构图如下
docker-arch

主要包括几部分:

  1. Docker daemon(Docker守护进程 dockerd):Docker的执行引擎,负责监听处理Docker客户端请求与管理Docker相关对象,如镜像、容器、网络、数据卷等。一个Docker守护进程可与其它Docker守护进程进行通信,作为Docker服务进行管理。
  2. Docker client(Docker客户端 docker):Docker客户端(docker CLI命令)是大多数用户用来与Docker守护进程交互的方式,比如你在命令行执行docker run,Docker客户端将发送该命令请求到Docker守护进程,由守护进程执行。Docker客户端可通过REST API, UNIX Socket或网络接口来与Docker守护进程进行通信,并且可与多个Docker守护进程进行通信。
  3. Docker Registry(Docker注册中心):用来存储Docker镜像的仓库,类似于Maven的Nexus。Docker官方提供了一个公共镜像仓库Docker Hub( https://hub.docker.com/ ),docker相关命令默认会从Docker Hub上搜索与下载镜像,我们可以配置一些国内镜像仓库地址来进行加速,甚至搭建自己的私有镜像仓库。
  4. Docker Objects:Docker管理的对象,主要包括镜像、容器、网络、数据卷等。

4. Docker的用途

根据第二部分Docker的优势及笔者的经验来看,目前Docker主要用于

  1. 常用软件服务的搭建运行,如Mysql、Redis、Nginx等
  2. 业务服务的发布部署,尤其是基于SpringBoot的微服务
  3. CI/CD实现,结合Gitlab的webhook,Jenkins的pipeline,实现自动化集成与部署
  4. 快速的弹性伸缩,在容器集群化管理的场景中,如Swarm、K8s解决方案中,可基于容器对服务进行快速的弹性伸缩来应对业务量的突发情况
  5. 执行环境封装,如一些深度学习框架模型,打成Docker镜像的方式进行发布,可以快速在不同的环境中运行起来

5. 总结

在微服务架构、DevOps这些概念盛行的时代,容器化技术变得越来越重要,几乎成为每一位开发人员需要掌握的技能。本系列文章是笔者基于自身实践及相关文献参考,对Docker相关技术进行整理,欢迎关注,共同学习。


我的个人博客地址:http://blog.jboost.cn
我的微信公众号:jboost-ksxy (一个不只有技术干货的公众号,欢迎关注,及时获取更新内容)
———————————————————————————————————————————————————————————————
微信公众号