原文地址: http://blog.jboost.cn/2019/07/13/docker-1.html 

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的结构对比

由上图可看出传统虚拟机技术是在硬件层面虚拟出一套硬件(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的基本架构图如下

主要包括几部分:

  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 (一个不只有技术干货的公众号,欢迎关注,及时获取更新内容)
———————————————————————————————————————————————————————————————

Docker笔记(一):什么是Docker的更多相关文章

  1. docker笔记(2)——docker镜像操作

    操作环境:mac OS 10.14.6 docker版本:10.03.1 终端:iterm2 3.3 时间:2019年8月 docker 镜像,是运行容器的模板,通过pull操作会向指定仓库获取镜像, ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker笔记一:Docker介绍

    目录 什么是Docker? Docker的核心概念 Docker镜像命令 Docker容器命令 Docker实战 查看我的镜像 启动Redis Docker中国镜像加速 血与泪的教训 什么是Docke ...

  4. Docker笔记(二):Docker管理的对象

    原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html 在Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像.容器. ...

  5. Docker笔记(四):Docker镜像管理

    原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...

  6. Docker笔记(七):常用服务安装——Nginx、MySql、Redis

    开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的安装方法,一般都相对比较繁琐 —— 要经过下载软件或源码包,编译安装,配置,启动等步骤,使用 Docker ...

  7. Docker笔记(八):数据管理

    前面(哪个前面我也忘了)有说过,如果我们需要对数据进行持久化保存,不应使其存储在容器中,因为容器中的数据会随着容器的删除而丢失,而因通过将数据存储于宿主机文件系统的形式来持久化.在Docker容器中管 ...

  8. Docker笔记(九):网络管理

    Docker的应用运行在容器中,其相互之间或与外部之间是如何通信的,涉及到哪些知识点,本文对相关内容进行整理.因网络这块牵涉的面较多,因此只从日常使用或理解的角度出发,过于专业的就不深入探讨了. 1. ...

  9. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

  10. 【Linux】【自学笔记】Linux下面docker安装mysql

    写在前面: 捣腾继续,之前把一个SpringBoot的程序安装在docker上面,参考链接:https://www.cnblogs.com/aki-stones/p/2019-11-01-note.h ...

随机推荐

  1. String,CString,TCHAR,char之间区别和联系

    char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char; TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用 ...

  2. mvn 命令在command prompt无法识别

    Download maven from this website: https://maven.apache.org/download.cgi 解压binary包后放到一个位置,比如C:\apache ...

  3. 用蓝牙连接debian和诺基亚手机

    本方法已经用debian 4.0.诺基亚9300和一个hl-united牌子的USB蓝牙适配器测试过了,效果很好.             1.安装必要的软件包:   #apt-get install ...

  4. 使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理

    原文:使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理 摘要 通过对博客文章的管理,实现外键操作. 目录[-] 八.博客文章管理 1.查看文章 2.添加博客        3 ...

  5. 问题记录,Release模式和Debug运行效果不一样,Release必须加延时

    这个程序大体是这样一个逻辑,通过win32程序与设备交互,主线程先向设备发送命令要求 循环验证 然后一个线程专门负责接收设备返回信息 两边通过全局变量的变化来交流,主线程通过接收线程收到的信息设置界面 ...

  6. UWP-电子音读出文字

    原文:UWP-电子音读出文字 源码: https://github.com/lindexi/Markdown 代码 private async void speech(string str, Medi ...

  7. 为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)

    为何只能在其关联的线程内启动timer? 在QTimer源码分析(以Windows下实现为例) 一文中,我们谈到: QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器 ...

  8. Linux命令执行顺序与管道命令

    命令执行顺序控制 顺序执行多条命令:command1;command2;command3... 有选择执行命令:which command1 && command2 || comman ...

  9. postgresql + JDBC 学习

    Based on debian 9, postgresql 9.6 and Java 8, at Dec-24-2018 ======================================= ...

  10. SVN更新报错问题(Please execute the 'Cleanup' command)

    SVN更新报错问题(Please execute the 'Cleanup' command) https://segmentfault.com/a/1190000012571289 svn: E20 ...