1. Docker基础入门:Docker是什么、Docker与传统虚拟化对比、Docker核心概念(镜像、容器、仓库)、安装Docker引擎(Linux/Windows/Mac)

好,咱们直接开始。第一章,我打算先带大家搞清楚Docker到底是什么。很多新手一上来就敲命令,结果连容器和虚拟机的区别都说不清楚,后面踩坑了都不知道怎么排查。我个人习惯是,先理解本质,再动手操作。

1.1 Docker是什么?

说白了,Docker就是一个容器化平台。它让你能把应用和它依赖的环境打包在一起,形成一个标准化的单元。这个单元可以在任何安装了Docker的机器上运行,不管底层是什么操作系统。

我举个例子你就明白了。以前我们部署一个Java应用,得先装JDK、配环境变量、装Tomcat、调配置文件……换一台机器,这套流程得重来一遍。有了Docker,你只需要把应用和JDK、Tomcat一起打包成一个镜像,然后一条命令就能跑起来。环境不一致的问题,彻底解决了。

核心思想:一次构建,到处运行。这跟Java的"一次编写,到处运行"有点像,但Docker解决的是整个运行环境的问题,而不仅仅是语言层面。

1.2 Docker与传统虚拟化对比

很多同学会问:Docker和虚拟机(VM)到底有什么区别?嗯,这里我直接画个对比表,你一看就明白。

对比维度 传统虚拟机 Docker容器
启动速度 分钟级(需要启动完整操作系统) 秒级(直接运行在宿主机内核上)
资源占用 高(每个VM有独立OS,占用大量内存和磁盘) 低(共享宿主机内核,只占用应用所需资源)
隔离性 强(完全虚拟化,硬件级别隔离) 中等(进程级别隔离,依赖Linux内核特性)
性能 接近物理机,但有虚拟化损耗 接近原生,几乎没有额外损耗
镜像大小 GB级别(包含完整操作系统) MB级别(只包含应用和依赖)
管理复杂度 高(需要管理Hypervisor、虚拟机模板等) 低(Docker CLI + Docker Compose即可)

我在项目中遇到过这样的情况:一个微服务架构,如果全用虚拟机,光启动所有服务就得等十几分钟。换成Docker后,几十秒全部就绪。你想想看,开发调试的效率提升了多少?

我的建议:如果你需要强隔离、运行不同内核的应用(比如Windows和Linux混跑),那还是用虚拟机。但绝大多数后端应用、中间件、数据库,用Docker完全够用,而且更轻量。

1.3 Docker核心概念:镜像、容器、仓库

这三个概念是Docker的基石。我习惯用一个类比来理解:

  • 镜像(Image):就像是一个(Class)。它是只读的模板,定义了应用运行所需的一切。
  • 容器(Container):就像是一个实例(Instance)。它是镜像的运行态,可以启动、停止、删除。
  • 仓库(Repository):就像是一个代码仓库(比如GitHub)。用来存储和分发镜像。

1.3.1 镜像(Image)

镜像是分层构建的。每一层代表一个Dockerfile指令。比如你写一个Dockerfile:

FROM ubuntu:20.04          # 基础镜像层
RUN apt-get update && apt-get install -y nginx  # 安装nginx层
COPY index.html /var/www/html/  # 复制文件层
CMD ["nginx", "-g", "daemon off;"]  # 启动命令层

每一层都是只读的。当你修改了某一行,Docker只会重新构建那一层以及后面的层,前面的层会复用缓存。这就是Docker构建速度快的原因之一。

注意:镜像层是只读的。容器启动时,会在镜像层之上加一个可写层。所有对容器的修改(比如写日志、改文件)都发生在这个可写层。容器删除后,可写层也会消失。所以,重要数据一定要用数据卷(Volume)持久化。

1.3.2 容器(Container)

容器就是镜像的一个运行实例。你可以启动、停止、重启、删除它。每个容器都是隔离的,有自己的文件系统、网络、进程空间。

我曾经犯过一个错误:在生产环境直接修改了容器里的配置文件,结果容器重启后,所有修改都丢了。嗯,从那以后我再也不敢直接改容器内部了。正确的做法是用环境变量或者挂载配置文件。

1.3.3 仓库(Repository)

仓库分为公开仓库和私有仓库。最常用的公开仓库是Docker Hub。你可以用docker pull拉取镜像,用docker push推送镜像。

举个例子:

# 拉取MySQL 8.0镜像
docker pull mysql:8.0

# 给镜像打标签
docker tag mysql:8.0 myregistry.com/mysql:8.0

# 推送到私有仓库
docker push myregistry.com/mysql:8.0

小技巧:国内访问Docker Hub可能比较慢。我建议配置镜像加速器,比如阿里云、中科大、网易的加速器。具体配置方法后面会讲。

1.4 安装Docker引擎

不同操作系统安装方式略有不同。我分别说一下。

1.4.1 Linux(以Ubuntu为例)

我个人最常用的是Ubuntu。安装步骤很简单:

# 1. 更新包索引
sudo apt-get update

# 2. 安装依赖包
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 3. 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 4. 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装Docker引擎
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# 6. 验证安装
sudo docker run hello-world

安装完成后,记得把当前用户加入docker组,这样就不用每次敲sudo了:

sudo usermod -aG docker $USER
# 然后退出重新登录,或者执行 newgrp docker

安全提醒:把用户加入docker组相当于给了该用户root权限。因为docker组用户可以挂载宿主机任意目录到容器中,从而获取宿主机文件。生产环境请谨慎操作。

1.4.2 Windows

Windows上推荐使用Docker Desktop for Windows。它需要开启Hyper-V或WSL 2(Windows Subsystem for Linux 2)。

安装步骤:

  1. 去Docker官网下载Docker Desktop安装包。
  2. 双击安装,一路默认即可。
  3. 安装完成后,启动Docker Desktop。
  4. 在任务栏右下角找到Docker图标,右键点击,选择"Switch to Windows containers..."(如果需要运行Windows容器)。

我建议使用WSL 2后端,性能更好,而且可以和Linux容器无缝集成。你可以在Docker Desktop的设置里,选择"Use WSL 2 based engine"。

1.4.3 Mac

Mac上同样推荐Docker Desktop for Mac。安装方式跟Windows类似:

  1. 下载Docker Desktop for Mac(Intel芯片或Apple Silicon芯片版本要选对)。
  2. 将Docker.app拖入Applications文件夹。
  3. 启动Docker Desktop,等待状态栏图标变绿。

Apple Silicon芯片(M1/M2/M3)的Mac要注意:有些老镜像可能不支持ARM架构。不过现在大部分主流镜像都提供了多架构支持,Docker会自动拉取对应架构的版本。

验证安装:不管什么系统,安装完成后打开终端,执行docker --versiondocker compose version,能看到版本号就说明安装成功了。

1.5 本章小结

这一章我们搞清楚了:

  • Docker是什么——一个容器化平台,解决环境一致性问题。
  • Docker和虚拟机的区别——更轻量、更快、资源占用更少。
  • 三大核心概念——镜像(只读模板)、容器(运行实例)、仓库(存储分发)。
  • 不同系统的安装方法——Linux用命令行,Windows/Mac用Docker Desktop。

下一章,我会带大家实际操作:拉取第一个镜像、运行第一个容器、学习Docker的常用命令。到时候你会发现,原来部署一个数据库或中间件,真的只需要几秒钟。