引言:写这篇文章的原因还是最近的项目中多次提到了docker这个东西,虽然在用(就是跟着那种足够详细的指导一步一步使用),但是对于这个东西,我完全没有自己的理解,docker到底是个什么,容器、容器部署这些到底有什么作用。故此有了这篇文章,算是分享一个自己的理解,也希望看见大家的理解

一.Docker到底解决了什么问题(工具的诞生都是为了解决问题,所以先从这方面去介绍)

先看一个程序员经典痛点:简单来讲就是代码在这台电脑可以运行,换到另外一台电脑就跑不动了,这个是个梗哈,但也是实际情况,我脑回路比较清奇,我想的是交付的时候直接把这台电脑一起交付过去就行了,欸,很巧的是其实docker干的就是差不多的事情。

换台电脑就跑不动的原因:环境不一致,我说的直接把电脑一起交付过去其实就是把环境原封不动地交付过去(当然在实际项目中这是不可能的,不然每有一个软件就有一台计算机这个有点夸张了),不过目的也就明确了,就是把环境1:1复刻过去,这就是docker干的事。(写到这里,其实看似说通了,其实我自己也是懵逼的,为啥,因为是个人都知道,你下载一个软件也好,或者其它什么也好,其实都分了什么windows/linux/mac对吧,你docker牛逼,把环境都搬过去了,那你docker本身又如何兼容docker所处的环境,而且这样和其实有点像虚拟机了,以及docker搬环境,搬多少,内部的环境与外部的环境属于不同的又该怎么办,这是我写到这里冒出来的问题,接这往下看吧)

最经典的类比:集装箱

你可以把 Docker 理解成「软件界的集装箱」:

  • 过去运输货物,每件货形状大小都不一样,装船、卸车、中转都要重新分拣打包,效率极低,还容易坏。
  • 有了集装箱之后,所有货物都装进统一规格的箱子里,全程密封不拆箱。不管是装船、卡车拉、火车运,任何运输工具都能直接适配,不用管箱子里装的是什么。

对应到软件世界:

  • 货物 = 你的应用(代码、依赖、配置、运行环境)
  • 集装箱 = Docker 容器
  • 轮船 / 卡车 / 火车 = 任何装了 Docker 的机器(电脑 / 服务器 / 云主机)

一句话总结: Docker 把应用连同它需要的所有运行环境,一起打包成一个密封的 “箱子”。这个箱子放到任何有 Docker 的机器上,直接就能运行,完全不用重新配置环境,也不会出现 “水土不服”。

二.核心概念:镜像、容器、仓库

Docker必懂得三个核心概念,三者是[模板->实例->仓库]的关系。

1.镜像(image)

镜像是只读的模板文件,相当于集装箱的"设计图纸+半成品"。

比如 nginx:latest 镜像,就是一个 “已经装好 Nginx 软件的系统模板”;python:3.11 镜像,就是带 Python 3.11 环境的模板。

你可以基于官方基础镜像,往里添加自己的代码、配置、依赖,打包成属于你自己的应用镜像。

镜像分层存储,复用率高,体积小。

2.容器(container)

容器是镜像运行起来的实例,相当于真正投入使用的集装箱。

类比面向对象编程:镜像 = 类,容器 = 对象;一个镜像可以创建无数个互不干扰的容器。

容器默认是 “临时” 的:容器运行时产生的数据、日志、修改,容器删除后就会消失。如果需要数据持久保存,要用「数据卷(Volume)」把数据映射到宿主机上。

容器之间互相隔离:每个容器有自己的文件系统、网络、进程空间,A 容器崩溃、中毒、改配置,完全不会影响 B 容器。

3.仓库(Registry)

仓库是存放镜像的"云盘/应用商店"。

官方公共仓库是 Docker Hub,里面有海量官方镜像(MySQL、Redis、Nginx、Ubuntu 等),拉下来就能用。

国内常用阿里云镜像、网易云镜像等加速源,企业内部一般会搭建私有仓库(Harbor)存放自己的业务镜像。

三.容器与虚拟机的对比

容器与虚拟机的本质区别在[隔离层级]:

对别维度虚拟机(VMware/KVM)Docker容器
隔离级别操作系统级隔离,模拟完整硬件&内核进程级隔离、共享宿主机操作系统内核
资源占用重,每个虚拟机占几GB磁盘、几GB内存轻,一个容器通常只有几十MB到几百MB
启动速度分钟级秒级
单机密度一台服务器跑十几个很吃力一台服务器轻松跑上百个
隔离强度极强,完全独立系统较强,满足大多数业务隔离需求

通俗对比:

虚拟机:在你的房子里,重新盖一整栋独立小房子,有自己的墙壁、水电、家具(完整操作系统)。安全但费材料、盖得慢。

容器:在你的房子里,用隔板隔出一个个独立房间,共享房子的地基、水电(宿主机内核),每个房间有自己的家具。隔起来快、占空间小、性价比高。

补充:Windows/Mac 上的 Docker 桌面版,底层会跑一个轻量 Linux 虚拟机来提供内核,本质上还是共享这个虚拟机的内核。

四.容器部署是什么

容器部署,就是一种全新的应用发布方式:

1.开发人员把代码、依赖、环境、配置,一起打包成Docker镜像;

2.把镜像推送到镜像仓库;

3.运维、自动化工具在目标服务器上拉去镜像、一条命令启动容器,应用就跑起来了。

整个过程不需要在服务器上安装任何运行环境、不需要改配置、不需要解决依赖冲突,只要服务器装了Docker,就能一键部署。

五、为什么要用Docker/容器:核心价值

1.环境绝对一致,彻底解决”我电脑上能跑“

一次构建,到处运行。开发、测试、生产用同一个镜像,再也不会出现”本地好好的,上线就崩“的环境问题。

2.轻量高效,资源利用率极高

容器共享宿主机内核,没有额外的操作系统开销。同样一台服务器,容器数量能达到虚拟机的 5~10 倍,大幅节省服务器成本。

3.秒级启动,部署/回滚极快

镜像有版本标签(比如v1.0/v2.0),发布就是拉去新镜像启动容器;出问题直接切回滚版本镜像,回滚只需要几秒。

4.环境隔离,互不干扰

一台机器上跑多个应用,A用Python3.8, B用Python3.11,完全不会冲突;一个应用崩了、被攻击了,不会波及其他应用。(这里听着有点像conda创建虚拟环境)

5.可移植性极强

不管是物理机、虚拟机、云服务器、国产系统,只要装了Docker,镜像就能直接跑。应用迁移、跨云迁移成本极低。

6.完美适配自动化与云原生

配合CI/CD工具(Jenkins/GitLab CI),代码提交后自动构建镜像、自动部署;配合Kubernetes可以实现自动扩缩容、故障自愈,是云原生时代的技术基石。(我也不懂这块到底是干啥的,也算是一个坑吧,未来了解了再把它填上)

六.什么场景下会用Docker

1.微服务架构部署

每个微服务打包成一个容器,独立开发、独立部署、独立升级,服务之间互不影响,是微服务的最佳落地载体。

2.团队开发与测试统一环境

团队所有人用同一个镜像开发,避免”你环境有问题“的扯皮;测试环境和生产环境100%一致,大幅降低测试漏测概率。

3.快速搭建中间件/学习环境

想试用MySQL、Redis、MongoDB、Elasticsearch?不用下载安装、不用改配置,一条docker run命令直接启动,用完就删,干净不污染本地环境。

4.持续集成/持续部署(CI/CD)

代码提交->自动构建镜像->自动部署测试环境->审核后自动上线生产,形成完整自动化流水线,是互联网公司的标准玩法。

5.云原生与弹性伸缩

应对电商大促、流量突增,一分钟内启动上百个容器扛流量,高峰过后自动销毁,按需付费,大幅节省成本。

6.老旧应用迁移

老系统跑在Windows Server 2008、CentOS 6等旧系统上,想迁到新服务器又怕改坏。直接打包成容器镜像,在新环境原样运行,几乎不用修改代码。

7.多租户Saas服务

每个客户分配一个独立容器,数据和环境完全隔离,成本比给每个客户开一台虚拟机低得多。

七.容器的编排

当容器数量多了、应用需要多个容器配合(前后端、数据库),就需要编排工具:

Docker Compose:单机多容器编排。用一个 docker-compose.yml 文件定义所有容器,一条 docker-compose up 全部启动,适合开发和小型项目。

Kubernetes(K8s):生产级集群编排。管理成百上千台服务器上的容器,实现自动部署、自动扩缩容、故障自愈、负载均衡,是大厂的标准方案。

八.总结

Docker的本质是应用打包与运行的标准化工具,它把”环境“这个麻烦的变量彻底封装起来,让应用的交付、部署、迁移变得像搬集装箱一样简单高效。

在微服务、自动化运维、云原生的大趋势下,已经成为后端开发、运维、测试岗的必备技能。

结语:其实这边文章里面还有好多东西我自己都没有弄清楚,主要是因为在做nlp2sql时用到了国产的显卡,然后就需要去搞vllm,然后又不兼容,又得搞专门提供的容器,用里面的适配版本的vllm,然后再把接口从容器引导宿主机,这里面有使用docker的过程,所以写下此文章,里面有些坑后续再填吧,大家就当个粗略了解docker的乐呵文看看得了。

更多推荐