1. Docker入门:从零开始理解容器化

大家好,我是你们这门课的老师。今天咱们聊聊Docker的入门知识。说实话,我第一次接触Docker是在2015年,那时候它还是个新鲜玩意儿。当时我在做一个微服务项目,环境配置搞得我头大——开发环境跑得好好的,一到测试环境就崩。后来同事推荐了Docker,嗯,用完之后我就再也没回头过。

1.1 Docker发展史:一个意外的诞生

Docker的故事得从2013年说起。当时dotCloud公司(后来改名叫Docker Inc.)的创始人Solomon Hykes,在PyCon大会上展示了一个叫Docker的开源项目。说白了,它就是把Linux容器技术包装成了一个好用的工具。

为什么会诞生Docker?我个人的理解是:大家受够了「在我机器上能跑」这种鬼话。你想想看,一个应用从开发到上线,要经过开发环境、测试环境、预发布环境、生产环境。每个环境的操作系统版本、依赖库、配置文件都可能不一样。Docker就是来解决这个问题的。

我记得Docker 1.0发布的时候,整个技术圈都沸腾了。为什么?因为它让「构建一次,到处运行」变成了现实。从2013年到现在,Docker已经成了云原生时代的基石。Kubernetes、Jenkins、GitLab CI这些工具,都离不开Docker的支持。

关键时间节点:

  • 2013年3月:Docker首次公开亮相
  • 2014年6月:Docker 1.0正式发布
  • 2015年:Docker生态爆发,Kubernetes开始支持Docker
  • 2017年:Docker企业版发布
  • 2020年至今:Docker成为云原生标配

1.2 Docker核心概念:镜像、容器、仓库

这三个概念是Docker的命根子。我刚开始学的时候,总觉得它们很抽象。后来我用一个比喻就搞懂了——镜像就是菜谱,容器就是做出来的菜,仓库就是存放菜谱的地方

1.2.1 镜像(Image)

镜像是一个只读的模板,包含了运行应用所需的一切:代码、运行时、系统工具、库、配置。说白了,它就是一个打包好的文件系统。

我在项目中遇到过一个问题:有个同事把镜像做得特别大,足足2个G。部署的时候慢得要死。后来我教他用多阶段构建,把镜像从2G压缩到了200M。嗯,这里先卖个关子,后面章节会详细讲。

镜像的特点:

  • 分层结构:每个镜像由多个只读层叠加而成
  • 不可变性:镜像一旦创建,就不能修改
  • 可复用性:多个容器可以共享同一个镜像

小技巧:查看本地镜像用 docker images,拉取镜像用 docker pull。我习惯在拉取镜像时指定版本号,比如 docker pull nginx:1.21,避免用latest标签——你永远不知道latest指向哪个版本。

1.2.2 容器(Container)

容器是镜像的运行实例。你可以把它理解成一个轻量级的虚拟机,但它不虚拟化硬件,而是共享宿主机的操作系统内核。

容器的生命周期:

  1. 创建:从镜像启动一个容器
  2. 运行:容器开始执行任务
  3. 停止:容器停止运行
  4. 删除:移除容器

我曾经犯过一个错误:启动容器后忘了加 --rm 参数,结果容器停止后还留在磁盘上,占了一堆空间。后来我养成了习惯——测试用的容器一律加 --rm,用完自动清理。

注意:容器是临时性的。容器停止后,里面的数据默认会丢失。如果你需要持久化数据,要用数据卷(Volume)或者绑定挂载(Bind Mount)。这个后面会详细讲。

1.2.3 仓库(Registry)

仓库就是存放镜像的地方。Docker Hub是官方的公共仓库,里面有几百万个镜像。你也可以搭建私有仓库,比如Harbor、Nexus。

仓库的操作很简单:

  • docker push:把本地镜像推送到仓库
  • docker pull:从仓库拉取镜像到本地
  • docker search:搜索仓库中的镜像

我个人习惯在公司内部搭建Harbor私有仓库。为什么?因为安全。你想想看,把公司代码的镜像放在公共仓库,万一泄露了怎么办?

1.3 Docker与虚拟机的区别

这个问题我面试过很多人,十有八九答不清楚。咱们用一张表来说明:

对比项 Docker容器 虚拟机
启动速度 秒级(毫秒级启动) 分钟级
资源占用 轻量(MB级别) 重量(GB级别)
内核 共享宿主机内核 独立内核
隔离性 进程级隔离 硬件级隔离
性能 接近原生 有性能损耗
适用场景 微服务、DevOps、CI/CD 需要完整OS、安全要求高

说白了,Docker和虚拟机的核心区别在于:Docker共享宿主机内核,虚拟机有独立内核

为什么会这样?因为Docker用的是Linux的命名空间(Namespace)和控制组(Cgroups)技术。它只是把进程隔离开,并没有虚拟化硬件。所以Docker容器里跑的Linux内核版本,必须和宿主机兼容。

我在项目中遇到过一个问题:有个同事想在Docker容器里跑Windows应用,结果发现不行。为什么?因为Docker依赖Linux内核特性,Windows容器需要Windows Server 2016以上的版本,而且只能在Windows宿主机上跑。

总结一下:

  • 如果你需要跑多个应用,每个应用独立部署、快速迭代——选Docker
  • 如果你需要跑不同操作系统的应用,或者对安全隔离要求极高——选虚拟机
  • 大多数情况下,两者可以配合使用:虚拟机里跑Docker

好了,第一章的内容就到这里。记住这三个核心概念:镜像、容器、仓库。它们是Docker的基石。下一章咱们聊聊Docker的安装和基本操作,到时候我会手把手教你怎么用Docker跑第一个容器。

课后练习:

  1. 在Docker Hub上搜索一个你感兴趣的镜像
  2. docker pull 拉取它
  3. docker run 启动一个容器
  4. docker ps 查看运行中的容器

试试看,很简单。遇到问题别怕,后面章节会详细讲。