2、Docker简介:Docker是什么、Docker与虚拟机的区别、Docker的核心概念(镜像、容器、仓库)、Docker的应用场景
2.1 Docker到底是什么?
说实话,我第一次接触Docker的时候,也觉得它挺玄乎的。简单来说,Docker就是一个容器化平台。它让你能把应用和它需要的所有依赖——代码、运行时、系统工具、库文件——打包成一个标准化的单元。
这个单元,我们叫它容器。你想想看,以前我们部署一个Java应用,得先装JDK,配环境变量,搞Tomcat,调配置文件……一套下来少说半小时。用Docker呢?一条命令,几秒钟,应用就跑起来了。
我个人习惯把Docker比作「轻量级的集装箱」。不管你的应用是用Python写的,还是用Go写的,只要打包成Docker镜像,就能在任何装了Docker的机器上运行。开发环境、测试环境、生产环境,完全一致。这就是我为什么说,Docker解决了「在我机器上能跑啊」这个世纪难题。
核心定义: Docker是一个开源的应用容器引擎,基于Go语言开发,遵循Apache 2.0协议。它让开发者可以打包应用及依赖到一个可移植的容器中,然后发布到任何流行的Linux或Windows机器上。
2.2 Docker与虚拟机的区别
很多新手会问:Docker和虚拟机(VM)到底有啥区别?嗯,这个问题我当年也纠结过。咱们直接看对比:
| 对比维度 | Docker容器 | 虚拟机(VM) |
|---|---|---|
| 启动速度 | 秒级(毫秒级启动) | 分钟级(需要启动完整OS) |
| 资源占用 | 极低(共享宿主机内核) | 较高(每个VM有独立OS) |
| 隔离级别 | 进程级隔离(Namespace+Cgroups) | 硬件级虚拟化(Hypervisor) |
| 磁盘占用 | MB级别(镜像分层,共享基础层) | GB级别(每个VM包含完整OS) |
| 性能损耗 | 几乎无(直接调用宿主机内核) | 有一定损耗(需要虚拟化硬件) |
| 可移植性 | 极高(一次构建,到处运行) | 一般(依赖Hypervisor兼容性) |
说白了,虚拟机是「虚拟出一整台电脑」,里面跑完整的操作系统。而Docker容器是「虚拟出一个进程的运行环境」,共享宿主机的内核。
我在项目中遇到过这样一个场景:公司有台32核的服务器,以前用虚拟机部署微服务,最多跑10个实例就卡得不行。换成Docker后,同样的硬件跑了50多个容器,CPU和内存还有富余。这就是差距。
我的建议: 如果你需要运行不同操作系统的应用(比如Windows和Linux混用),或者需要强隔离的安全场景,选虚拟机。其他情况,尤其是微服务、DevOps场景,Docker是更优解。
2.3 Docker的核心概念
要玩转Docker,三个概念必须搞明白:镜像、容器、仓库。我习惯用一个类比来解释:
- 镜像(Image) → 就像「做蛋糕的模具」,是只读的模板
- 容器(Container) → 就像「用模具做出来的蛋糕」,是可运行的实例
- 仓库(Registry) → 就像「存放模具的超市」,用来分享和下载镜像
2.3.1 镜像(Image)
镜像是Docker的核心资产。它是一个只读的、分层结构的文件,包含了运行应用所需的一切。你想想看,一个镜像里有什么?
- 一个精简的操作系统(比如Alpine Linux,只有5MB)
- 应用代码和依赖库
- 环境变量、配置文件
- 启动命令
镜像是分层构建的。每一层都是只读的,修改时只创建新层。这样做的好处是:多个镜像可以共享底层,节省大量磁盘空间。
# 查看本地镜像列表
docker images
# 拉取一个镜像
docker pull nginx:latest
# 构建自己的镜像(需要Dockerfile)
docker build -t my-app:v1.0 .
我记得有一次,团队里有人把基础镜像从Ubuntu换成了Alpine,镜像体积直接从1.2GB降到了150MB。部署速度提升了不止一个量级。嗯,这里要注意:镜像越小,拉取越快,攻击面也越小。
2.3.2 容器(Container)
容器是镜像的运行实例。你可以把它理解成一个轻量级的、隔离的进程。每个容器都有自己的文件系统、网络栈、进程空间。
容器和镜像的关系,就像程序和进程的关系。镜像是静态的,容器是动态的。你可以从同一个镜像启动多个容器,每个容器都是独立的。
# 从镜像启动一个容器
docker run -d --name my-nginx -p 8080:80 nginx
# 查看运行中的容器
docker ps
# 进入容器内部
docker exec -it my-nginx /bin/bash
# 停止并删除容器
docker stop my-nginx && docker rm my-nginx
避坑指南: 我曾经犯过一个错误——在容器里存储数据。容器被删除后,数据全丢了。后来我学会了使用数据卷(Volume)或绑定挂载(Bind Mount)来持久化数据。记住:容器是无状态的,数据要放在外面。
2.3.3 仓库(Registry)
仓库就是存放和分发镜像的地方。最常用的是Docker Hub,它是官方的公共仓库。当然,企业里一般会搭建私有仓库,比如Harbor、Nexus。
仓库的命名规则是:[仓库地址]/[用户名]/[镜像名]:[标签]。比如:
nginx:latest→ 官方仓库的Nginx最新版myregistry.com/myteam/myapp:v1.0→ 私有仓库的自定义镜像
# 登录到仓库
docker login
# 推送镜像到仓库
docker push myusername/myapp:v1.0
# 从仓库拉取镜像
docker pull myusername/myapp:v1.0
我个人习惯在团队里搭建一个Harbor私有仓库。原因很简单:安全可控。镜像里可能包含敏感信息,放在公共仓库总归不放心。而且私有仓库支持镜像扫描、权限控制,CI/CD集成也更方便。
2.4 Docker的应用场景
说了这么多,Docker到底能干啥?我总结了几个最实用的场景:
2.4.1 开发环境标准化
这是Docker最直接的价值。以前新同事入职,光配开发环境就要折腾半天。现在呢?一个docker-compose up,数据库、缓存、消息队列全起来了。环境完全一致,再也不用担心「在我机器上能跑」的问题。
2.4.2 微服务架构
微服务天然适合容器化。每个服务独立打包、独立部署、独立扩缩容。我在项目中用Docker Compose编排了十几个微服务,一条命令启动整个系统。配合Kubernetes,还能实现自动伸缩和故障恢复。
2.4.3 CI/CD流水线
Docker是CI/CD的基石。代码提交后,自动构建镜像、运行测试、推送到仓库、部署到环境。整个过程完全自动化。我见过最快的流水线:从代码提交到生产部署,只需要3分钟。
2.4.4 快速原型和测试
想试试某个新数据库?docker run一下就起来了。用完直接删掉,不留痕迹。测试环境也可以随时创建和销毁,大大提高了开发效率。
2.4.5 混合云部署
Docker镜像的可移植性让它成为混合云部署的理想选择。同一个镜像,可以在本地开发机、私有云、公有云上运行。我帮客户做过一个项目:开发环境用Docker Desktop,测试环境用自建Kubernetes,生产环境用阿里云ACK。镜像完全一致,部署零适配成本。
一句话总结: Docker不是银弹,但它解决了应用打包、分发、运行中的核心痛点。如果你还没用上Docker,我建议你从今天开始试试。相信我,你会爱上它的。