近几年 Docker 还是挺火的, 学习微服务也肯定要知道 Docker 的存在并最好掌握一些基本操作, 毕竟一些体量非常大的项目运行环境会比较复杂, 部署的时候难免会遇到某些问题, 如兼容性 / 生产环境有差异等问题… 本篇文章将以图文的形式对 Docker 进行介绍, 加深对 Docker 的印象.


Docker

  • 1 Docker 介绍
  • 1.1 Docker 是什么?
  • 1.2 要解决的问题及如何解决这些问题?
  • 1.3 Docker 和虚拟机?
  • 2 Docker 的架构


1 Docker 介绍

Docker 是什么? 主要用来解决哪些问题? 如何解决这些问题? 它和我们经常使用的虚拟机又有什么区别? 它是如何架构的?

1.1 Docker 是什么?

Docker 是一种能够快速交付应用并高效运行应用的技术, 它可以将程序 / 依赖 / 运行环境一起打包成一个镜像(image), 并能够迁移到任意的 Linux 操作系统; 它可以利用沙箱机制(沙箱就是一个限制应用程序对系统资源的访问的运行环境)形成隔离容器, 使得各个应用互不干扰; 它可以通过一些命令完成容器的启动或者移除等操作, 非常的方便快捷.

1.2 要解决的问题及如何解决这些问题?

  前面也说过, 一些体量比较大的项目可能运行环境比较复杂, 部署的时候会遇到诸如依赖关系复杂导致的兼容性问题, 或者是开发环境 / 生产环境 / 测试环境有很大的差异. 如下图所示非常的杂乱无章!!!

netcore docker微服务 微服务 docker架构_Docker

解决办法:

  为了解决依赖关系的兼容性问题, Docker 将应用的函数库 / 依赖以及相关的应用一起打包, 将每个包放到一个隔离的容器中去运行, 这样就避免了互相干扰导致的兼容性问题, 如下图所示:

netcore docker微服务 微服务 docker架构_netcore docker微服务_02


那么对于不同系统环境的问题 Docker 又是如何解决的呢?

Docker 将用户程序所需要调用的系统函数库一起打包, 如将 Centos 7 函数库一起打包(Centos 和 Ubuntu 都是基于 linux 内核, 只是系统应用不同, 所提供的函数库不同而已), 运行到不同的操作系统时, 直接基于打包的库函数, 借助于操作系统的 linux 内核来运行, 如下图所示:

netcore docker微服务 微服务 docker架构_微服务_03

总结如下:
问题一: Docker 解决项目依赖关系复杂问题及不同组件依赖的兼容性问题;

  • Docker 允许开发中将应用 / 依赖 / 函数库 / 配置一起打包, 形成可移植的镜像(image);
  • Docker 应用运行在容器中, 使用沙箱机制进行相互隔离.

问题二: Dokcer 解决开发 / 测试 / 生产环境有差异的问题;

  • Docker 镜像中包含了完整的运行环境, 仅仅依赖系统的 Linux 内核, 这样便可以在任意的 Linux 操作系统上运行.

1.3 Docker 和虚拟机?

虚拟机是在操作系统中模拟出一个硬件环境, 然后运行在另一个系统中, 如我在我的 mac 系统中运行 Centos 7 系统; 而 Docker 则是将某个应用所需要的依赖 / 库函数及需要调用的系统函数库全部打包成一个镜像, 运行到不同的操作系统中(基于打包的库函数, 借助于操作系统的 linux 内核来运行);

总之, Docker 是一个系统进程, 而虚拟机则是在操作系统中的操作系统; Docker 体量比较小, 启动速度快, 性能好; 而虚拟机体量比较大, 性能一般, 启动速度也比较慢.

netcore docker微服务 微服务 docker架构_微服务_04

2 Docker 的架构

  在了解 Docker 架构之前, 先要明确两个概念: 镜像和容器;

  • 镜像(Image): Docker 将应用程序及其所需的依赖 / 函数库 / 环境等配置文件打包在一起, 形成一个镜像;
  • 容器(Container): 镜像中的应用程序运行后形成的进程就是容器, 只是 Docker 会给容器做隔离, 对外不可见.
    下面就是我的 linux 中已经装好的镜像及已经形成的容器:

    关于 Docker 的架构:
      Docker 是一个 CS 架构的程序, 也就是客户端 - 服务端架构:
  • 客户端: 通过命令或者是 RestAPI 向 Docker 服务端发送指令, 可以在本地或远程向服务端发送指令;
  • 服务端: Docker 守护进程, 负责处理 Docker 指令, 管理镜像和容器等; 也就是说客户端主要用来发送指令, 而服务端则是来管理这些镜像和容器.