1、Docker入门:Docker是什么、为什么用Docker、Docker与传统虚拟化对比、Docker核心概念(镜像、容器、仓库)
1.1 Docker到底是什么?
说实话,我第一次接触Docker的时候,也觉得很玄乎。说白了,Docker就是一个「集装箱」管理系统。你想想看,以前我们部署一个应用,要装环境、配依赖、调参数,折腾半天。有了Docker,你只需要把应用和它需要的所有东西打包成一个「镜像」,然后就能在任何地方运行。
我个人习惯把Docker理解成「轻量级的虚拟机」,但它比虚拟机轻得多。它直接使用宿主机的操作系统内核,不需要每个应用都装一个完整的操作系统。嗯,这里要注意,Docker不是虚拟化硬件,而是虚拟化操作系统。
一句话总结:Docker是一个开源的容器化平台,让你能把应用及其依赖打包在一起,确保在任何环境中都能一致地运行。
1.2 为什么我们要用Docker?
我在项目中遇到过不少环境不一致的问题。开发环境跑得好好的,一到测试环境就崩了。这种「在我机器上能跑」的尴尬,相信你也经历过。
Docker解决了三个核心痛点:
- 环境一致性:开发、测试、生产环境完全一样,再也不用担心「环境差异」
- 快速部署:启动一个容器只需要秒级,比虚拟机快得多
- 资源利用率高:一台物理机可以运行几十甚至上百个容器
我曾经帮一个团队迁移项目,原来部署一套环境要2小时,用了Docker后,5分钟搞定。说白了,Docker就是让你从「搬砖」变成「搭积木」。
1.3 Docker vs 传统虚拟化
很多人会问:Docker和虚拟机到底有什么区别?我画个简单的对比你就明白了。
| 对比维度 | 传统虚拟机 | Docker容器 |
|---|---|---|
| 启动速度 | 分钟级 | 秒级 |
| 占用空间 | GB级别 | MB级别 |
| 性能损耗 | 较高(需要虚拟化硬件) | 几乎无损耗(直接使用宿主机内核) |
| 隔离性 | 完全隔离(独立内核) | 进程级隔离(共享内核) |
| 资源利用率 | 较低 | 高 |
为什么会这样?因为虚拟机需要模拟完整的硬件,每个虚拟机都包含一个完整的操作系统。而Docker容器直接共享宿主机的操作系统内核,只打包应用和它的依赖。你想想看,这就像住酒店和住宿舍的区别——虚拟机是单独开一间房,Docker是大家共用走廊和卫生间。
我的建议:如果你需要运行不同操作系统的应用(比如Windows和Linux),那就用虚拟机。如果只是部署Linux应用,Docker是更好的选择。
1.4 Docker核心概念:镜像、容器、仓库
这三个概念是Docker的基石。我记得刚学Docker时,总是搞混镜像和容器。其实很简单:
1.4.1 镜像(Image)
镜像就是一个只读的模板,包含了运行应用所需的一切:代码、运行时、库、环境变量、配置文件。你可以把它理解成「安装光盘」或者「类」。
举个例子,一个Nginx镜像大概长这样:
# 查看本地镜像
docker images
# 拉取一个Nginx镜像
docker pull nginx:latest
# 查看镜像的详细信息
docker inspect nginx:latest
镜像采用分层存储的设计,每一层都是只读的。这样做的好处是:多个镜像可以共享相同的基础层,节省磁盘空间。我在项目中经常用这个特性,比如所有Java应用都基于同一个OpenJDK基础镜像,只需要拉取一次。
1.4.2 容器(Container)
容器是镜像的运行实例。你可以把它理解成「运行中的程序」或者「对象」。镜像是静态的,容器是动态的。
容器有一个可写层,你对容器的所有修改(比如写日志、创建文件)都保存在这个可写层。但要注意,一旦容器被删除,这些修改也就没了。
# 从镜像启动一个容器
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 查看运行中的容器
docker ps
# 进入容器内部
docker exec -it my-nginx /bin/bash
# 停止并删除容器
docker stop my-nginx
docker rm my-nginx
避坑指南:我曾经在生产环境犯过一个错误——直接在容器里修改配置文件,然后容器重启后配置全丢了。记住,容器是临时性的,重要数据要用数据卷(Volume)持久化。
1.4.3 仓库(Registry)
仓库就是存放镜像的地方。你可以把它理解成「应用商店」或者「GitHub」。Docker Hub是官方的公共仓库,里面有几百万个镜像。
我建议你在项目中搭建私有仓库,特别是涉及公司业务代码的时候。常用的私有仓库方案有:
- Docker Hub私有仓库:适合小团队,免费版有数量限制
- Harbor:企业级私有仓库,功能强大,支持权限管理
- 阿里云容器镜像服务:国内访问速度快
# 从仓库拉取镜像
docker pull ubuntu:20.04
# 推送镜像到仓库
docker push your-registry/your-image:tag
# 搜索镜像
docker search nginx
说白了,这三个概念的关系就是:镜像是模板,容器是实例,仓库是存放模板的地方。你从仓库拉取镜像,然后基于镜像创建容器来运行应用。
核心要点:
- 镜像是只读的,容器是可写的
- 一个镜像可以创建多个容器
- 容器删除后,数据会丢失(除非使用数据卷)
- 仓库用于分发和共享镜像
好了,这就是Docker入门的第一课。你可能会觉得概念有点多,但别急,后面我们会一步步动手操作。记住,Docker的核心就是「一次构建,到处运行」。下一章我们开始安装Docker,然后跑第一个容器。