初识Docker学习笔记

First impression of beginning to learn docker

Docker第一印象

详细的介绍和说明Docker的架构和背景不是本文的目的,我会给出少量的资料和文档。我在这里可能更多会给出一些个人的理解。

参考资料:

先说说容器化主要用来解决什么问题。在应用Docker等容器化工具以前,系统的部署主要通过虚拟机来进行。虚拟机是一种硬件级别的虚拟化技术,虚拟机分享主机 的硬件资源,各自运行自己的操作系统和运行时,不同虚拟机可以运行不同的操作系统。虚拟机可以很好的隔离各种软件环境,但是随之而来也产生了一些问题:

  • 虚拟机OS的更新与维护工作量
  • 虚拟机OS的授权许可成本
  • 虚拟机OS占用的不必要的资源
  • 虚拟机并不能保证部署环境的可控性

因为每台虚拟机都有自己的操作系统,这会给公司带来巨大的软件授权成本并给IT支持带来巨量的系统更新和维护的工作量,甚至有很多公司因为没有足够的人力更新和 维护所有的虚拟机,大部分虚拟机都停留在未更新的状态。同时在虚拟机上部署服务和软件的体验与实体服务器相比并无不同。依然可能存在环境差异、依赖项冲突以 及部署步骤繁琐复杂等问题。而且每台虚拟机自身的操作系统及运行时同样会占用大量的CPU、内存等系统资源。我以前的公司曾经遇到过Windows虚拟机在长时间运 行后系统反应迟钝或干脆不响应的问题,而此时CPU资源占用并不高,重启虚拟机后即可解决。

容器化、操作系统级虚拟化能够在提供环境隔离的前提下消除虚拟机自身的操作系统带来的负面影响,大大提升虚拟化的软硬件资源利用率,并降低各方面成本。同时 就Docker而言,Docker的容器化方案可以大大降低部署的复杂性,通过一行命令即可完成部署,且部署结果稳定可靠。真正实现一次构建,随处运行。

Docker之所以在众多容器解决方案中脱颖而出的另一个原因是Docker使用起来相对比较简单,入门相对比较快。且在现有项目中应用Docker需要做的修改很小,作为 .Net程序员,我已经成功尝试给.Net Core 2.1~.Net 5.0的项目配置Dockerfile并成功构建。同时借助Docker的便捷性,和对不同平台及架构的支持,我成功 将公司原有运行在Windows环境下的网站+服务重新构建为linux-arm平台,并使用跟x86平台完全相同的命令部署到我自己的树莓派3上。在没有使用Docker时,对 不熟悉Linux平台的开发/运维人员而言,将.Net Core开发的程序部署到linux-arm上可能会非常复杂,仅安装准备.Net Core运行时都有可能遇到这样或那样的 问题。现在只要基本了解Docker命令,几乎人人都可以完成这样的操作。

Docker知识点及学习曲线分析

Docker的组成及常用工具链

我们平时讨论的Docker可以分为Docker CLI Client和Docker Engine两个主体,同时会经常配合Docker-Compose工具一起使用。在多实例和集群解决方案中 还会用到Kubernetes这个工具。Docker-Compose和Kubernetes都属于容器编排工具。

学习Docker所需的知识点

  • 简单的Linux基础知识
  • 常用的Docker CLI命令行的基本用法
  • Dockerfile的编写、配置方式
  • Docker-Compose与yml配置文件的编写、配置方式
  • Kubernetes管理集群

Docker大致学习曲线

Docker涉及的概念不算多,在具备简单Linux基础的前提下,上手会非常快。在Windows和macOS上部署的版本都包含Docker CLI Client,Docker Engine 和Docker-Compose三个组件。Visual Studio中已经提供了Dockerfile和Docker容器及Docker-Compose容器编排两种方式的调试功能。往后做详细的设置 时可能会遇到一些需要研究的问题,尤其是给不同的开发平台开发出的代码配置Dockerfile时可能需要针对性研究。在往后对于Kubernetes的学习会涉及更多概 念性的知识,且这部分会更靠近运维方面,开发团队可以放在最后再学习和了解。