初识Docker容器

初识Docker容器


1. 什么是Docker


Docker 是一个开源的容器化平台,用于自动化部署和管理应用程序。它通过将应用程序及其所有依赖打包成一个轻量级、可移植的容器来解决传统虚拟化中的性能开销问题。Docker 容器可以在任何支持 Docker 的环境中运行,无论是本地开发环境、测试服务器,还是生产环境。可以很容易地从一个环境迁移到另一个环境,支持跨平台的部署和扩展。

1.1 常规部署的问题

大型项目组件较多,运行环境也较为复杂。

  • 开发、测试和生产环境的配置差异可能导致应用程序在某些环境下正常运行,而在其他环境中出错。
  • 应用程序依赖的库、框架、数据库等需要手动安装和配置,管理和维护不同版本的依赖变得复杂。
image-20210731141907366

有的项目中部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突,给部署带来了极大的困难。

1.2 Docker如何解决依赖兼容问题

  • 打包应用及其依赖:将应用的库(Libs)、依赖(Deps)和配置文件与应用一起打包到容器镜像中,确保应用运行所需的一切都包含在内。
  • 容器隔离运行:每个应用运行在独立的容器中,隔离它们的运行环境,避免不同应用之间的依赖冲突和互相干扰。
image-20210731142219735

这样打包好的应用包中,既包含应用本身,也保护应用所需要的Libs、Deps,无需再操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。

虽然解决了不同应用的兼容问题,但是开发、测试等环境会存在差异,操作系统版本也会有差异,怎么解决这些问题呢?

1.3 Docker如何解决操作系统环境差异

1.3.1 操作系统结构

要解决不同操作系统环境差异问题,必须先了解操作系统结构。以一个Ubuntu操作系统为例,结构如下:

image-20210731143401460

结构包括:

  • 计算机硬件:例如CPU、内存、磁盘等
  • 系统内核:所有Linux发行版的内核都是Linux,例如CentOS、Ubuntu、Fedora等。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件。
  • 系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使用更加方便。

计算机交互的流程:

  1. 应用调用操作系统应用(函数库),实现各种功能。
  2. 系统函数库是对内核指令集的封装,会调用内核指令。
  3. 内核指令操作计算机硬件。

Ubuntu和CentOS等都是基于Linux内核,只是系统应用不同,所提供的函数库有差异。

image-20210731144304990

此时,若将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配。

image-20210731144458680

1.3.2 Docker解决不同系统环境的问题

Docker 将用户程序与其所需的系统库(如 Ubuntu 的函数库)一起打包进镜像,确保运行时环境一致。

当 Docker 在不同操作系统上运行时,它直接使用打包好的系统函数库,借助操作系统的 Linux 内核(Docker 依赖 Linux 内核特性)来运行容器中的应用程序。

这样,即使底层操作系统不同,Docker 仍能确保应用程序在一致的环境下运行,解决了环境差异带来的兼容性问题。

image-20210731144820638

2. 总结


2.1 Docker解决大型项目依赖兼容性问题

  • Docker允许在开发中将应用、依赖、函数库、配置等打包在一起,形成一个可移植的镜像,确保应用及其所需的环境一致。
  • Docker应用运行在容器中,利用沙箱机制,实现相互隔离,避免不同组件之间的依赖冲突。

2.2 Docker解决开发、测试、生产环境差异问题

  • Docker镜像包含完整的运行环境,包括操作系统的函数库和应用依赖,仅依赖宿主系统的Linux内核,因此可以在任意Linux操作系统上一致运行
  • 无论开发、测试还是生产环境,只要使用相同的镜像,就能保证运行环境的一致性,避免因环境差异导致的问题。

2.3 Docker的优势总结

  • 可移植性:将程序及其依赖、运行环境一起打包为镜像,可轻松迁移至任何支持Docker的Linux操作系统。
  • 隔离性:容器利用沙箱机制实现应用间的隔离,确保各个应用互不干扰
  • 快捷性:启动、停止、移除应用都可通过一行命令完成,提升了部署和管理的便捷性