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,然后跑第一个容器。