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)
容器是镜像的运行实例。你可以把它理解成一个轻量级的虚拟机,但它不虚拟化硬件,而是共享宿主机的操作系统内核。
容器的生命周期:
- 创建:从镜像启动一个容器
- 运行:容器开始执行任务
- 停止:容器停止运行
- 删除:移除容器
我曾经犯过一个错误:启动容器后忘了加 --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跑第一个容器。
课后练习:
- 在Docker Hub上搜索一个你感兴趣的镜像
- 用
docker pull拉取它 - 用
docker run启动一个容器 - 用
docker ps查看运行中的容器
试试看,很简单。遇到问题别怕,后面章节会详细讲。