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,我建议你从今天开始试试。相信我,你会爱上它的。