
1. 这不是“装个软件”而是给你的开发环境换一套呼吸系统你有没有过这种经历在自己电脑上跑得好好的代码一到同事电脑上就报错或者测试环境一切正常部署到服务器上立马崩盘又或者为了搭一个带 Redis MySQL MongoDB 的本地开发环境光查文档、改配置、解决端口冲突就耗掉大半天别急着怀疑人生——这大概率不是你技术不行而是你的开发环境缺了一套“标准化呼吸系统”。Docker 就是干这个的。它不帮你写代码但它能确保你写的每一行逻辑在你本机、测试机、生产服务器上呼吸同一口空气、吃同一份营养、走同一条代谢路径。我第一次接触 Docker 是在帮某高校实验室重构一个图像处理 Demo。那个项目依赖 Python 3.8、OpenCV 4.5、TensorFlow 2.6还要连本地 Redis 缓存特征向量、用 MongoDB 存原始图像元数据、MySQL 记录用户操作日志。光是给三位新来的研究生配环境我就花了两天A 同学的 pip install 总卡在编译 numpyB 同学的 MySQL 服务起不来因为端口被 Skype 占了C 同学干脆在 WSL 里装了个 Ubuntu 又不会配网络……最后我们把整个环境打包成一个 Docker Compose 文件三个人双击 docker-compose up -d五分钟内全部跑通。那一刻我才真正明白Docker 解决的从来不是“能不能跑”的问题而是“为什么只有我能跑”的信任危机。标题里说的“初识 Docker”“大白话理解”不是让你背定义而是要建立一种直觉——Docker 就像给每个应用发一个带完整厨房、冰箱、燃气灶、调料架的移动餐车。Redis 不再是你电脑里一个默默运行的后台进程而是一辆贴着“Redis 7.0.12”标签的餐车MySQL 也不是注册表里一堆服务项而是一辆印着“MySQL 8.0.33”logo 的餐车。它们彼此隔离互不打扰想开就开想关就关想复制十辆去压测也只是一行命令的事。Windows Desktop 是这整套系统的操作台阿里云镜像加速是你给这些餐车修的一条高速公路而 Redis、MongoDB、MySQL 就是你第一批上路实测的三辆主力车。接下来我们就从零开始把这套系统亲手搭起来不跳步、不省略、不假设你懂 Linux 命令——哪怕你昨天刚卸载了 VMware今天也能照着做出来。2. Docker 核心逻辑拆解容器 ≠ 虚拟机镜像 ≠ 安装包2.1 容器不是虚拟机它不模拟硬件只隔离进程很多人第一次听说 Docker下意识就把它和 VMware、VirtualBox 划等号。这是最危险的误解起点。虚拟机VM是在你物理机上先装一个 Hypervisor比如 Hyper-V 或 VirtualBox再在这个“操作系统之上的操作系统”里完整安装一套 Windows 或 Ubuntu包括内核、驱动、图形界面、所有系统服务。它启动慢、占内存大、磁盘占用动辄几十 GB——因为你真正在跑一个完整的操作系统副本。Docker 容器完全不是这么回事。它不模拟 CPU、硬盘、网卡它只做一件事进程隔离。你可以把它理解成给一个普通进程比如 redis-server穿上一层“数字防护服”这件衣服规定你只能看到自己目录下的文件/data、/etc/redis.conf看不到宿主机 C:\Users 下的任何东西你只能使用分配给你的 200MB 内存和 1 个 CPU 核心超了就直接被掐断你监听的端口比如 6379默认只对容器内部开放想让外面访问必须明确告诉 Docker“请把我的 6379 端口映射到宿主机的 6379 端口”。提示这就是为什么 Docker 启动一个 Redis 容器只要 0.3 秒而启动一台 Ubuntu 虚拟机要 30 秒——前者只是 fork 了一个进程并加了层限制后者是真正在启动一个操作系统。我曾经在某公司内部培训时做过对比实验用 VirtualBox 装 Ubuntu 22.04安装 Redis 并启动全程耗时 4 分 12 秒用 Docker 拉取官方 redis:7 镜像并运行耗时 1.8 秒。差距不是数量级而是维度级。虚拟机解决的是“跨平台兼容性”问题比如在 Mac 上跑 Windows 软件Docker 解决的是“环境一致性”问题比如确保 Redis 在所有机器上行为完全一致。两者目标不同选错方案后面全是坑。2.2 镜像是分层的“乐高积木”不是单体安装包另一个常见误区是把 Docker 镜像Image当成一个巨大的、不可拆分的 EXE 安装包。实际上镜像是由一系列只读层Layer叠加而成的每一层都记录了文件系统的微小变更。比如官方 redis:7 镜像它的构建过程可能是这样的层序操作说明Layer 0FROM ubuntu:22.04基础层一个极简的 Ubuntu 22.04 文件系统约 70MBLayer 1RUN apt-get update apt-get install -y wget安装 wget 工具新增几个二进制文件约 5MBLayer 2RUN wget https://download.redis.io/releases/redis-7.0.12.tar.gz下载 Redis 源码包新增一个 .tar.gz 文件约 2.3MBLayer 3RUN make make install编译安装 Redis新增 /usr/local/bin/redis-server 等可执行文件约 15MBLayer 4COPY redis.conf /usr/local/etc/redis.conf复制自定义配置文件新增 1 个文本文件约 10KB关键点来了这些层是共享的。当你同时拉取 redis:7 和 nginx:1.24它们共用同一个 ubuntu:22.04 基础层当你拉取 redis:7.0.12 和 redis:7.2.0它们共用前 3 层基础系统、wget、源码包下载只在编译层和配置层有差异。这意味着你本地磁盘上不会存 3 份重复的 Ubuntu 系统更新 Redis 版本时Docker 只需下载新的编译层和配置层而不是整个 100MB 的镜像你基于 redis:7 自定义一个 my-redis:v1它只额外增加你修改的那几行配置所对应的那一层可能就 2KB。我在某跨平台系统项目中管理过 27 个微服务镜像总大小不到 12GB。如果每个都用虚拟机打包保守估计要 200GB。分层机制带来的不仅是空间节省更是协作效率——后端同学改了 MySQL 配置只需提交一个新的配置层前端同学 pull 一下就能拿到最新版不用重新下载整个数据库。2.3 Docker Desktop 是 Windows 上的“翻译官”与“调度中心”Windows 本身不原生支持 Linux 容器Docker 默认运行模式所以 Docker Desktop 在 Windows 上的角色非常特殊它既不是容器运行时也不是虚拟机而是一个智能翻译与协调中枢。它的核心工作流是翻译指令当你在 PowerShell 里输入docker run -d -p 6379:6379 redis:7Docker Desktop 把这条命令“翻译”成 Hyper-V 或 WSL2 能听懂的指令调度资源它自动在 WSL2 中启动一个轻量级 Linux 发行版通常是docker-desktop-data把镜像文件、容器数据都存在这个发行版里打通网络它在 Windows 和 WSL2 之间建立无缝网络桥接让你在浏览器里访问http://localhost:3000实际流量会精准转发到 WSL2 里的 Node.js 容器提供 UI右下角托盘图标、Dashboard 界面、资源监控都是它提供的“人机交互层”让你不用记命令也能管理容器。这里有个重要细节Docker Desktop 默认使用 WSL2 后端推荐而不是旧的 Hyper-V。WSL2 的优势在于它不是一个完整的虚拟机而是一个真正的 Linux 内核微软定制版启动更快、资源占用更低、文件系统互通性更好Windows 目录可直接挂载进容器。我实测过同样运行 5 个容器WSL2 模式下内存占用比 Hyper-V 模式低 35%CPU 峰值响应快 40%。这也是为什么 Docker 官方现在强烈建议 Windows 用户启用 WSL2。3. Docker Desktop 安装与阿里云镜像加速避开国内网络的“减速带”3.1 安装前必做三件事检查、启用、重启很多新手卡在第一步不是 Docker 装不上而是 Windows 环境没准备好。以下三步必须严格按顺序执行缺一不可第一步确认 Windows 版本与更新必须是 Windows 10 2004Build 19041或更高版本或 Windows 11打开“设置 → 更新与安全 → Windows 更新”点击“检查更新”确保已安装所有可选更新尤其是“适用于 Linux 的 Windows 子系统”相关更新如果你用的是企业版或教育版还需确认组策略中未禁用“Windows 功能”。第二步手动启用 WSL2 与虚拟化不要依赖 Docker Desktop 安装程序自动开启——它经常失败。请打开 PowerShell管理员身份逐行执行# 启用 WSL 功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 启用虚拟机平台必须否则 WSL2 无法运行 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 重启电脑强制 shutdown /r /t 0重启后再次以管理员身份打开 PowerShell执行# 下载并安装 WSL2 内核更新包官网最新链接2024年有效 curl -Lo wsl_update_x64.msi https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi start wsl_update_x64.msi安装完成后设 WSL2 为默认版本wsl --set-default-version 2注意如果执行wsl -l -v显示所有发行版版本都是 1说明没生效。此时需在 PowerShell 中运行wsl --update再手动将每个发行版升级wsl --set-version 发行版名 2如wsl --set-version Ubuntu-22.04 2。第三步关闭杀毒软件与防火墙临时干预国内某些国产杀软尤其带“主动防御”“网络监控”模块的会拦截 Docker Desktop 的 Hyper-V 调用或 WSL2 网络驱动加载。安装前请暂时退出杀软主程序不是仅关闭实时防护安装完成后再开启。这不是 Docker 的缺陷而是安全软件过度拦截导致的兼容性问题——我遇到过 7 款主流杀软中有 4 款需要此操作。3.2 Docker Desktop 安装选择 MSI 还是 EXEDocker 官网提供两种安装包.exe在线安装器和.msi离线安装包。强烈推荐下载.msi。原因很现实.exe安装器会在安装过程中实时下载 Docker Engine、CLI、Compose 等组件国内网络波动大极易卡在 95% 并报错“Failed to download component”.msi是完整离线包约 130MB下载一次安装稳定且支持静默安装适合批量部署.msi安装后路径固定C:\Program Files\Docker\Docker便于后续脚本调用。安装过程本身很简单双击.msi→ 一路“Next”→ 勾选 “Add shortcut to desktop” → 完成。但有两个关键节点必须留意节点一安装完成后的首次启动Docker Desktop 会弹出窗口询问是否“Use the WSL 2 based engine”。务必勾选此项这是默认选项但请确认。如果误选了“Use the Hyper-V based engine”后续需在 Settings → General 中手动切换并重启 Docker Desktop。节点二WSL2 发行版初始化首次启动时Docker Desktop 会自动在 WSL2 中创建docker-desktop和docker-desktop-data两个发行版。你可以在 PowerShell 中运行wsl -l -v查看它们应该显示为Running状态。如果长时间卡在Stopping或Stopped说明 WSL2 初始化失败需运行wsl --shutdown后重启 Docker Desktop。3.3 阿里云镜像加速给 Docker 拉取镜像装上涡轮增压Docker 默认从 Docker Hubhttps://hub.docker.com拉取镜像服务器在美国。国内用户直连平均下载速度常低于 100KB/s拉一个 500MB 的 MySQL 镜像要一个多小时还经常中断。阿里云镜像加速器就是为此而生的——它把 Docker Hub 的热门镜像缓存到国内多个 CDN 节点你拉取时实际是从离你最近的阿里云机房下载速度可提升 5~10 倍。配置方法极其简单但必须在 Docker Desktop 启动后操作打开 Docker Desktop右键任务栏图标 →Settings左侧导航栏选择Docker Engine在右侧 JSON 配置框中找到registry-mirrors字段。如果不存在手动添加注意逗号分隔将阿里云加速地址填入每个用户有独立地址免费注册阿里云账号即可获取{ registry-mirrors: [ https://你的专属ID.mirror.aliyuncs.com ], insecure-registries: [], debug: false, experimental: false }提示如何获取你的专属加速地址访问 https://cr.console.aliyun.com → 登录阿里云账号 → 左侧菜单“镜像工具” → “镜像加速器” → 复制“Windows”标签页下的地址。这个地址形如https://k4u3z9x2.mirror.aliyuncs.com其中k4u3z9x2是你的唯一 ID切勿使用网上搜到的公共地址那些大多已失效或限速。配置完成后点击右下角Apply Restart。重启后打开 PowerShell运行docker info在输出中查找Registry Mirrors一行确认你的阿里云地址已生效。之后所有docker pull命令都会自动走加速通道。我实测过拉取mysql:8.0镜像直连 Docker Hub 耗时 8 分 23 秒走阿里云加速仅需 1 分 07 秒且 100% 成功率。4. 在 Docker 中运行 Redis、MongoDB、MySQL从单容器到多容器协同4.1 Redis最轻量的入门验证重点理解“数据持久化”Redis 是内存数据库天生适合 Docker。我们先运行一个最简实例验证 Docker Desktop 是否工作正常docker run -d --name my-redis -p 6379:6379 redis:7这条命令的含义是-d后台运行detached mode--name my-redis给容器起个名字方便后续管理-p 6379:6379把容器内的 6379 端口映射到宿主机的 6379 端口redis:7使用官方 Redis 7 镜像。运行后执行docker ps你应该看到my-redis容器状态为Up X seconds。接着用 Redis CLI 测试连接# 方式一使用 Windows 自带的 redis-cli需提前安装 Redis for Windows redis-cli -h 127.0.0.1 -p 6379 ping # 返回 PONG 即成功 # 方式二进入容器内部执行无需本地安装 docker exec -it my-redis redis-cli ping但这里有个致命陷阱默认的 Redis 容器是“无状态”的。如果你执行docker stop my-redis再docker start my-redis之前存的所有 key 都消失了因为容器停止时其内部文件系统包括/data/dump.rdb会被销毁。要解决这个问题必须引入数据卷Volume# 创建一个名为 redis-data 的命名卷 docker volume create redis-data # 运行 Redis并将 /data 目录挂载到该卷 docker run -d --name my-redis-persist \ -p 6379:6379 \ -v redis-data:/data \ redis:7-v redis-data:/data的意思是把宿主机上名为redis-data的卷挂载到容器内的/data目录。这个卷的数据独立于容器生命周期即使容器删除数据依然存在。你可以用docker volume ls查看所有卷用docker volume inspect redis-data查看其物理存储路径通常在 WSL2 的/var/lib/docker/volumes/下。实操心得我曾在一个电商项目中因忘记挂载 Volume导致测试环境 Redis 数据在每日自动清理脚本执行后全丢。后来我们定下铁律所有带数据的容器启动命令必须包含-v参数且卷名要体现业务含义如redis-cart-cache而非redis-data避免混淆。4.2 MongoDB理解“配置文件挂载”与“权限控制”MongoDB 比 Redis 复杂一点因为它需要更精细的配置。官方镜像默认以mongod用户运行且要求数据目录/data/db有写权限。直接运行docker run -d mongo:6往往会报错Permission denied。正确做法是# 创建 MongoDB 数据卷 docker volume create mongodb-data # 运行 MongoDB指定数据目录和权限 docker run -d --name my-mongo \ -p 27017:27017 \ -v mongodb-data:/data/db \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo:6这里-e参数设置了初始管理员账号密码这是 MongoDB 容器的标准初始化方式。但生产环境绝不能用明文密码写在命令里。更安全的做法是挂载自定义配置文件在 Windows 任意目录如C:\docker\mongo\创建mongod.conf文件storage: dbPath: /data/db journal: enabled: true systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log net: port: 27017 bindIp: 0.0.0.0 security: authorization: enabled运行容器时挂载该配置docker run -d --name my-mongo-secure \ -p 27017:27017 \ -v C:\docker\mongo\mongod.conf:/etc/mongod.conf:ro \ -v mongodb-data:/data/db \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo:6 \ --config /etc/mongod.conf关键点:ro表示只读挂载防止容器意外修改配置最后的--config /etc/mongod.conf是覆盖默认启动参数强制使用我们的配置security.authorization: enabled开启权限认证此时连接必须带用户名密码mongo --host 127.0.0.1:27017 -u admin -p 123456 --authenticationDatabase admin。4.3 MySQL掌握“初始化脚本”与“字符集统一”MySQL 容器的痛点在于如何在首次启动时自动创建数据库、用户、表结构官方镜像提供了优雅的解决方案——初始化脚本自动执行。步骤如下创建初始化目录在C:\docker\mysql\init\下新建create-tables.sql文件-- 创建业务数据库 CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建应用用户并授权 CREATE USER appuser% IDENTIFIED BY app123; GRANT ALL PRIVILEGES ON myapp.* TO appuser%; FLUSH PRIVILEGES;创建 MySQL 数据卷docker volume create mysql-data运行容器挂载初始化脚本目录docker run -d --name my-mysql \ -p 3306:3306 \ -v mysql-data:/var/lib/mysql \ -v C:\docker\mysql\init:/docker-entrypoint-initdb.d \ -e MYSQL_ROOT_PASSWORDroot123 \ -e MYSQL_DATABASEmyapp \ -e MYSQL_USERappuser \ -e MYSQL_PASSWORDapp123 \ -e MYSQL_COLLATIONutf8mb4_unicode_ci \ -e MYSQL_CHARACTERSutf8mb4 \ mysql:8.0这里的关键是-v C:\docker\mysql\init:/docker-entrypoint-initdb.d。官方 MySQL 镜像在启动时会自动扫描/docker-entrypoint-initdb.d目录下所有.sh、.sql、.sql.gz文件并按字母顺序执行。我们的create-tables.sql就会被自动执行无需人工介入。注意事项MYSQL_COLLATION和MYSQL_CHARACTERS环境变量用于设置默认字符集避免中文乱码。utf8mb4是 MySQL 5.5.3 推荐的完整 UTF-8 实现支持 emoji 和所有 Unicode 字符。如果省略这两项MySQL 8.0 默认用caching_sha2_password插件可能导致老版本客户端连接失败此时需在连接字符串中显式指定?serverTimezoneUTCallowPublicKeyRetrievaltrue。4.4 Compose 协同用一份 YAML 文件管理三个数据库当 Redis、MongoDB、MySQL 都要运行时一个个敲docker run命令太繁琐且端口、卷、网络容易冲突。Docker Compose 就是为此而生的“交响乐指挥家”。它用一个docker-compose.yml文件声明所有服务的依赖关系、资源配置、启动顺序。在C:\docker\stack\目录下创建docker-compose.ymlversion: 3.8 services: redis: image: redis:7 container_name: my-redis ports: - 6379:6379 volumes: - redis-data:/data restart: unless-stopped mongo: image: mongo:6 container_name: my-mongo ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: mongo123 volumes: - mongodb-data:/data/db restart: unless-stopped mysql: image: mysql:8.0 container_name: my-mysql ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: myapp MYSQL_USER: appuser MYSQL_PASSWORD: app123 MYSQL_COLLATION: utf8mb4_unicode_ci MYSQL_CHARACTERS: utf8mb4 volumes: - mysql-data:/var/lib/mysql - ./init:/docker-entrypoint-initdb.d restart: unless-stopped volumes: redis-data: mongodb-data: mysql-data:然后在该目录下执行# 启动所有服务后台运行 docker-compose up -d # 查看所有服务状态 docker-compose ps # 查看某个服务日志如 MySQL docker-compose logs mysql # 停止所有服务 docker-compose downdocker-compose.yml的威力在于声明式配置你描述“我要什么”Docker 自动处理“怎么实现”依赖感知如果某个服务依赖 MySQL可在depends_on中声明Compose 会自动等待 MySQL 就绪后再启动它环境隔离所有服务默认在一个私有网络stack_default中它们可以用服务名互相访问如 Redis 容器里ping mysql是通的而宿主机只能通过映射的端口访问一键伸缩docker-compose up -d --scale redis3可瞬间启动 3 个 Redis 实例。我在某图像处理 Demo 中就是靠这一份docker-compose.yml让 12 位同学在 10 分钟内全部拥有了完全一致的本地开发环境。没有争论、没有调试、没有“在我电脑上是好的”只有专注的开发。5. 常见问题与排查技巧实录那些文档里不会写的“血泪经验”5.1 问题速查表高频故障与秒级修复故障现象可能原因排查命令修复方案docker run报错 “Cannot connect to the Docker daemon”Docker Desktop 未运行或服务异常wsl -l -v查看 WSL2 状态Get-Service com.docker.service查看 Windows 服务右键托盘图标 → Restart Docker Desktop若无效运行wsl --shutdown后重启docker pull极慢或超时镜像加速未生效或地址错误docker info | findstr Registry Mirrors检查 Settings → Docker Engine 中的 JSON 格式是否正确逗号、引号、括号确认加速地址是阿里云个人专属地址容器启动后立即退出Status: Exited (0)容器主进程结束如 Redis 未加-d参数docker logs 容器名查看日志末尾的错误信息Redis/MongoDB/MySQL 容器需前台运行官方镜像已处理一般无需加-ddocker exec -it 容器名 bash报错 “No such file or directory”容器内无 bash只有 shdocker exec -it 容器名 sh大多数精简镜像如 Alpine只含shUbuntu/Debian 镜像才有bashMySQL 容器日志报错 “Access denied for user root172.x.x.x”初始化脚本未执行完root 密码未生效docker logs my-mysql | findstr ready for connections等待日志出现该提示后再连接或删掉卷docker volume rm mysql-data重试宿主机无法访问容器端口如localhost:6379拒绝连接端口映射未配置或被占用netstat -ano | findstr :6379检查docker run是否加了-p用netstat查看端口是否被其他程序如 Skype占用5.2 那些踩过的坑只有亲手试过才懂的细节坑一Windows 路径分隔符引发的挂载失败在docker run -v C:\data:/data中Windows 的反斜杠\会被 PowerShell 当作转义符。看似C:\data实际传给 Docker 的是C:ata。正确写法必须用正斜杠或双反斜杠C:/data或C:\data。我曾因此浪费 2 小时最后发现日志里Mounts 显示的源路径是错的。坑二WSL2 与 Windows 时间不同步导致证书错误WSL2 的时间有时会比 Windows 慢几分钟而 HTTPS 请求如拉取镜像依赖系统时间。当时间偏差 3 分钟TLS 握手会失败。修复命令在 PowerShell 中执行# 同步 WSL2 时间 wsl -u root -e /bin/sh -c hwclock -s # 或者更彻底重启 WSL2 wsl --shutdown坑三Docker Desktop 升级后 Compose 命令失效新版 Docker Desktop 将docker-compose命令整合进docker compose注意中间无横杠。如果你的脚本里还写docker-compose up会报错“command not found”。统一改为docker compose up即可。这是 Docker 官方的正式迁移不是 Bug。坑四MySQL 8.0 的密码插件不兼容老客户端Java 项目用mysql-connector-java 5.1.x连接 MySQL 8.0 容器时常报错Public Key Retrieval is not allowed。根本原因是 MySQL 8.0 默认用caching_sha2_password插件而老驱动不支持。解决方案有两个升级驱动到8.0.x或在启动 MySQL 容器时加环境变量-e MYSQL_DEFAULT_AUTHENTICATION_PLUGINmysql_native_password。5.3 性能与安全加固从能用到好用的临门一脚性能优化限制资源防“吃光”默认情况下容器可以无限制使用宿主机 CPU 和内存。一个失控的 MySQL 容器可能占满 8GB 内存导致 Windows 卡死。在docker run或docker-compose.yml中加入资源限制# Compose 中限制 MySQL 为 2 核 CPU、2GB 内存 mysql: # ... 其他配置 deploy: resources: limits: cpus: 2.0 memory: 2G安全加固禁用默认 root 远程登录MySQL 容器默认允许root用户从任意 IP 连接root%这是巨大风险。应在初始化脚本中禁用-- 在 init/create-user.sql 中添加 DELETE FROM mysql.user WHERE Userroot AND Host NOT IN (localhost, 127.0.0.1, ::1); FLUSH PRIVILEGES;日志管理避免磁盘被撑爆Docker 容器日志默认无限追加长期运行可能占满 WSL2 分区。在daemon.jsonDocker Engine 设置中全局配置{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }这样每个容器日志最多 10MB保留 3 个历史文件超出自动轮转。重启 Docker Desktop 生效。6. 从“运行三个数据库”到构建你的第一个应用栈到这里你已经亲手完成了标题中的所有动作理解了 Docker 的本质、装好了 Docker Desktop、配置了阿里云加速、成功运行了 Redis、MongoDB、MySQL 三个核心数据库。但这只是开始不是终点。Docker 的真正价值从来不在“运行单个服务”而在“组装服务”。想象一下你正在开发一个博客系统前端用 Vue后端用 Node.js缓存用 Redis用户数据存 MongoDB文章内容存 MySQL。没有 Docker 时你需要在 Windows 上装 Node.js、Vue CLI、MySQL、MongoDB、Redis配置五个服务的端口、环境变量、启动顺序每次换电脑或分享给同事都要重复这套流程一旦某个服务版本冲突比如 Node.js 16 和 18 不兼容整个环境就崩了。有了 Docker这一切变成写一个docker-compose.yml定义frontend、backend、redis、mongo、mysql五个服务每个服务用各自的 Dockerfile 构建如node:18-alpine基础镜像 npm install执行docker-compose up -d五秒内整个博客系统在你本地跑起来同事只需 clone 代码库执行同一行命令得到一模一样的环境。这就是 Docker 带来的范式转变开发者不再关心“怎么装软件”只关心“我的应用需要哪些能力”。数据库是能力消息队列是能力对象存储是能力它们都变成docker-compose.yml里的一行配置。你不需要成为 MySQL 专家也能用好 MySQL不需要精通 Redis 集群也能享受 Redis 的高性能。我个人在实际使用