
1. 写在前面这份笔记适合谁说实话刚开始折腾 Linux 和 Docker 那段时间我被各种报错搞得头大。Docker Desktop 启动不了、WSL 磁盘空间越用越大、tar 包解压出来一堆乱码、装好的容器重启一次数据全没了……这些问题几乎每个新手都会遇到。当时我特别希望能有一份笔记不只告诉我“敲什么命令”还能告诉我“为什么要敲这条命令”遇到报错时该从哪个方向排查。这份笔记就是从我零基础到能独立部署 MySQL、Redis、GitLab 的完整折腾过程里整理出来的。它适合完全没接触过 Linux 的人也适合已经能用虚拟机装系统、但一碰到 Docker 就发懵的人。我会把环境准备、常用命令、Docker 核心概念、真实部署案例以及高频报错排查全部串起来尽量用大白话讲清楚背后的原理。围绕 Linux 和 Docker 这两个主题,网上被搜索最多的关键词其实高度集中Linux 常用命令、Docker 安装教程、Docker Desktop 虚拟化检测失败、Windows 安装 Docker、虚拟机安装 Linux、Docker 部署 MySQL 8.0、Docker 部署 Redis 主从、Docker 安装 GitLab、WSL 磁盘空间不释放、Linux 解压乱码。我这份笔记会把这些热点全部覆盖到并且把“为什么会出问题”讲透而不是只给你一堆复制粘贴的命令。2. 环境准备虚拟机、WSL 和 Docker 的选型决策2.1 虚拟机装 Linux 还是 WSL不要急着站队新手第一次面对 Linux最纠结的就是“我该用哪种方式体验”。常见的方案有三个安装双系统、用虚拟机软件跑一个完整的 Linux、在 Windows 上装 WSL。另外如果你的目标只是练习 Linux 操作还有一堆在线终端可以临时用但不建议作为日常学习环境。我当时的选择是虚拟机。原因很实际双系统来回重启太折腾WSL 虽然启动快但它毕竟不是一个完整的 Linux 桌面环境当你后面要学 Docker、要模拟真实服务器场景时总觉得差了点意思。虚拟机里装一个 Ubuntu Server 或 CentOS Stream你就是这台机器的完全管理员折腾坏了就快照回滚成本几乎为零。如果你用的是 Windows 10/11 专业版或企业版还有一个思路开 Hyper-V然后用它来跑 Linux 虚拟机。不过 Hyper-V 和 VirtualBox 不能同时开启虚拟化嵌套这个坑我后面会细说。个人学习我更推荐 VirtualBox免费、跨平台、教程多遇到问题搜一下基本都有答案。2.2 VirtualBox 安装 Linux 的完整步骤我以 VirtualBox 加 Ubuntu Server 22.04 LTS 为例说一下完整流程CentOS 或 Rocky Linux 的步骤大同小异。第一步下载 Ubuntu Server 的 ISO 镜像建议选 LTS 长期支持版本学习周期长不折腾版本升级。第二步在 VirtualBox 里点击“新建”名称随便填类型选 Linux版本根据你下载的镜像选 64-bit。内存建议分 2GB 以上CPU 给 2 核。磁盘大小至少 20GB动态分配即可。第三步启动虚拟机选择 ISO 文件开始安装。安装过程中会有一步问你是否需要 LVM 磁盘加密学习阶段可以不用选选了后面扩容麻烦。第四步安装完成后重启用你设置的用户名密码登录。这里有个很容易忽略的点Ubuntu Server 默认不装图形界面登录后就是黑底白字的终端。很多人第一次看到这个界面会慌其实完全不用服务器环境本来就不需要桌面用命令操作更符合真实工作场景。后面所有操作包括装 Docker、跑容器都可以在这个终端里完成。如果你更习惯图形界面装系统的时候选 “Install Ubuntu Server” 之前也可以先装带桌面的 Ubuntu Desktop原理一样只是多了一个 GNOME 桌面。但做服务端练习时我强烈建议你用 Server 版习惯了纯命令操作之后你到哪台服务器上都不会露怯。2.3 Windows 装 Docker Desktop三个高频坑必须提前知道很多人在 Windows 上用 Docker不是先学 Docker 命令而是先被 Docker Desktop 安装过程折腾了一遍。搜索热词里那条很长的错误提示“virtualization support not detected docker desktop failed to start because v...”说明了这个问题的普遍性。先解释一下这个报错的本质Docker Desktop 在 Windows 上本质是靠 WSL2 或 Hyper-V 跑一个轻量级 Linux 虚拟机如果 BIOS/UEFI 里的虚拟化开关没打开它就起不来。排查步骤如下打开任务管理器切到“性能”选项卡看左下角 CPU 一栏里有没有“虚拟化已启用”。如果显示“已禁用”需要重启电脑进 BIOS/UEFI找到 Intel VT-xIntel 平台或 AMD-VAMD 平台开启后保存退出。确认 Windows 功能里“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两项均已勾选。勾选后需要重启。在管理员 PowerShell 里执行wsl --status如果提示没有已安装的分发版先执行wsl --install装一个 UbuntuDocker Desktop 依赖 WSL2 后端。另一个高频坑是 WSL 磁盘空间不释放。你在 WSL 里删了几个 GB 的文件Windows 的 C 盘空间却纹丝不动这是因为 WSL 用的是动态扩展的虚拟磁盘删了文件之后它不会自动收缩。解决办法是执行wsl --shutdown然后以管理员身份打开 PowerShell运行diskpart依次执行select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited...\LocalState\ext4.vhdx、attach vdisk readonly、compact vdisk、detach vdisk。这串命令执行完C 盘空间立马能缓过来。第三个坑是代理和网络环境导致的镜像拉取超时。Docker 默认从 Docker Hub 拉镜像国内网络环境下经常卡在 waiting 状态。这个不是彻底无解后面我会讲配置国内镜像源的方法。总之在 Windows 上先把这三件事处理好Docker 学习之路就顺了一半。3. Linux 常用命令边用边记比背手册有效一百倍3.1 文件操作目录切换、复制移动和删除Linux 命令最基础的就是文件操作这也是搜索热词里“linux常用命令大全”“linux命令大全”热度居高不下的原因。但我不建议死记硬背你把下面这几个场景练熟了再遇到不会的命令用man查一下就能上手。pwd看当前在哪个目录新手上路最容易迷路多敲这个准没错。cd切换目录cd ..回上一级cd ~回家目录。ls -lah列出当前目录所有文件-l显示详情-a包含隐藏文件-h把大小显示成人类可读的格式。cp -r 源目录 目标目录复制整个目录必须加-r否则会报错。mv移动文件也能用来重命名。rm -rf删除目录和文件-r递归删除目录-f强制删除不提示。这个命令一定要慎重很多人血泪教训都出在这里。建议学会用rm -i先确认或者干脆把关键路径备份好再删。这里多说一句rm -rf /是绝对不能执行的命令它会把整个系统文件删掉。如果你是在云服务器上操作一旦跑完这台机器基本就废了。学习和生产环境都要养成一个习惯删除前先ls确认路径再执行删除重要目录就算删也要先改名备份。3.2 用户与权限为什么新建用户之后还要改密码搜索热词里“linux新建用户”和“linux权限”经常一起出现。建用户这块很多教程一上来就让你useradd test然后切到 test 用户发现密码不对登录不上去。这里有个细节useradd只是创建用户不会设置密码你必须再执行passwd test才能给这个用户设置密码。Ubuntu 还有一个更符合直觉的命令是adduser它会交互式地让你设置密码并创建家目录。权限部分核心就是chmod和chown。chmod 755 文件表示文件所有者可读可写可执行组和其他用户只能读和执行。chown 用户名:组名 文件用于修改文件归属。我遇到过不少新手把某个目录权限直接改成chmod -R 777图省事结果带来安全隐患。正确做法是谁需要写就给谁写权限实在不确定的时候先chmod 755需要写文件再chmod 700给当前用户单独开权限。学习阶段可能觉得 777 无所谓但养成随手 777 的习惯上了生产环境就是事故隐患。3.3 系统与服务排查DNS 配置和日志查看Linux 上排查问题有一个组合拳非常好用systemctl status 服务名看服务状态journalctl -u 服务名 -n 50看最近 50 行日志ip addr看 IP 地址。这三个命令能解决一半以上的“网络不通”“服务起不来”类问题。搜索热词里有一条“linux中配置dns出现的问题”这确实是新手容易卡住的地方。Linux 的网络 DNS 配置不止一处传统方式是改/etc/resolv.conf但很多系统会被 NetworkManager 或 systemd-resolved 管理你刚改完过几分钟就被覆盖回去了。解决方法取决于你用的发行版Ubuntu 18.04 以后用 netplan配置文件在/etc/netplan/*.yaml改完执行sudo netplan apply。如果系统用的是 systemd-resolved很多人直接改/etc/resolv.conf是无效的正确做法是用systemd-resolve命令或者修改 netplan 配置里的 nameservers。遇到 DNS 解析不了先ping 8.8.8.8看网络通不通再ping 域名看是不是解析问题。网络通、域名不同那问题基本锁定在 DNS 上按上面两种方式排查即可。3.4 tar 解压乱码的解决办法“linux 解压文件乱码”这个热词我很想单独说一下因为真的太常见了。Windows 下压缩的 zip 包里面的中文文件名默认用 GBK 编码Linux 默认用 UTF-8 解码两边对不上就出现一堆乱码文件。解决办法有两个。第一个是用unzip -O GBK 文件.zip指定编码解压。但要注意unzip的老版本可能不支持-O参数此时可以装unar它自动识别编码执行unar 文件.zip就能正确解压。第二个是先在 Windows 上用 7-Zip 把压缩包转成 UTF-8 编码再传到 Linux不过这个操作比较麻烦不如直接用unar。还有一个情况是 tar 包乱码一般出现在文件名本身编码特殊时处理思路一样用lsar先列出包内文件名看看是否正常再用unar解包。遇到编码问题别硬刚换个工具往往就解决了。4. Docker 核心概念与常用操作从镜像到容器的第一公里4.1 镜像、容器、仓库到底是什么很多人学 Docker 卡在概念上因为术语太抽象。我打个比方把 Docker 镜像想象成一个“光盘安装包”它里面已经装好了操作系统、运行环境和你的应用代码是一个只读的模板。容器就是从这个镜像“运行起来”的实例类似于你把光盘放进光驱系统跑起来了这个运行中的系统就是容器。仓库则是一个存放镜像的中央仓库类似于手机应用商店Docker Hub 就是官方商店。你执行docker pull nginx就是从商店里下载了 nginx 的“安装包”下载完用docker run启动就得到一个跑着 nginx 的容器。所以 Docker 解决的核心问题就是“环境一致性”我在本机跑得好好的换台机器就崩这样的问题在容器时代会被最大程度避免。因为镜像里打包了整个运行环境到哪台机器上跑行为都一样。4.2 安装 Docker 并配置镜像加速Linux 上安装 Docker 官方有一键脚本curl -fsSL https://get.docker.com -o get-docker.sh然后sudo sh get-docker.sh。这是最省事的方式它自动检测系统架构并配置好软件源。Windows 上就是装 Docker Desktop。装完立刻要做的一件事是配置国内镜像源。编辑 Docker 配置文件/etc/docker/daemon.json内容类似{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com ] }改完执行sudo systemctl restart docker。没有这个配置拉镜像时经常卡进度条配置之后基本秒下。这里提醒一句镜像源地址在网上经常变动如果配置后拉取还是慢手动搜一下“docker 镜像加速 可用地址”换一个能用的即可。4.3 常用命令清风化run、exec、logs、rm 的精髓docker run创建并启动容器。最常用的是docker run -d --name nginx-test -p 8080:80 nginx。逐个拆开解释-d表示后台运行不加的话你会一直卡在前台CtrlC 容器就停了。--name给容器起名字方便后续管理。-p 8080:80是把宿主机的 8080 端口映射到容器的 80 端口。最后nginx是镜像名。docker ps列出正在运行的容器加-a可以看所有容器包括已退出的。docker exec -it 容器名 bash进入运行中的容器用来排查容器内部环境。-it是交互模式不加的话可能进去了没法操作。docker logs -f 容器名查看容器日志-f是持续跟踪输出。很多容器起不来的原因看日志一眼就懂。docker rm 容器ID和docker rmi 镜像ID删除容器和删除镜像要区分开。docker inspect 容器名查看容器的详细配置比如 IP、挂载路径、端口映射排查问题时非常有用。所有命令都可以执行docker 命令 --help查看帮助不用死记硬背。用多了自然就记住了。我学习前期的一个小技巧把常用命令写在一个文本文件里每次用到就翻一下大概两三周之后基本不用查了。4.4 跑通第一个 Nginx 容器我建议第一个容器不要用 hello-world那个太“素”看不到实际效果。直接拉一个 nginx 跑起来然后在浏览器里访问页面会非常有成就感。执行docker run -d --name nginx-demo -p 8080:80 nginx等它拉完镜像启动成功后浏览器打开http://localhost:8080看到 “Welcome to nginx!” 的欢迎页说明你的 Docker 环境已经通了。接下来可以练习几个操作docker stop nginx-demo停掉容器此时浏览器打不开了。docker start nginx-demo重新启动页面又恢复了。docker exec -it nginx-demo bash进入容器执行ls /usr/share/nginx/html看看默认页面文件在哪里。这个练习会让你直观理解容器的生命周期也知道容器内部其实就是一个精简的 Linux 环境。之后你再部署 MySQL、Redis思路都是一样的拉取镜像、运行容器、映射端口、进入容器或看日志排查。5. 从部署 MySQL 8.0 开始理解数据卷与容器网络5.1 部署 MySQL 8.0 并开放远程连接搜索热词里“docker安装mysql8.0并使用”热度特别高说明这是很多人真正想做的事。我以 MySQL 8.0 为例完整演示一遍带数据卷的部署方式。docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDroot123456 \ -e TZAsia/Shanghai \ -v mysql-data:/var/lib/mysql \ mysql:8.0这里有三个关键点第一-e是用来传环境变量的MySQL 镜像要求必须设置MYSQL_ROOT_PASSWORD否则容器无法初始化数据库。第二个TZ设置时区不设的话容器时间默认是 UTC和北京时间差 8 小时后面查日志会对不上。第二-v mysql-data:/var/lib/mysql是数据卷挂载。数据卷的作用是把容器内的数据目录映射到宿主机上这样即使容器删除重建数据还在。这个操作至关重要不挂载数据卷的话一旦容器删除MySQL 里的所有数据都会消失没有后悔药吃。第三默认情况下 MySQL 8.0 只允许 root 从 localhost 登录外部机器连接时或者用一些老的客户端工具连接时会报 “Authentication plugin caching_sha2_password cannot be loaded”。解决方法是登录容器内执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY root123456; GRANT ALL PRIVILEGES ON *.* TO root%; FLUSH PRIVILEGES;执行完再用 Navicat 或 DataGrip 连接宿主机 IP 的 3306 端口就能连上了。不过我建议在非学习环境下不要开放 root 远程权限创建一个普通账号并只授权对应业务库会更稳妥。5.2 数据卷、命名卷和容器生命周期很多人第一次丢数据就是在删容器的时候。Docker 容器本身是无状态的你在容器里创建的文件默认都写在容器可写层容器一删这层数据也跟着没了。所以凡是需要持久化的数据比如数据库文件、配置文件、上传的文件都要用数据卷或绑定挂载来存。数据卷分为两种命名卷-v mysql-data:/var/lib/mysql这种方式Docker 会在宿主机上自动创建一个目录来存放数据主机目录由 Docker 管理。绑定挂载-v /home/ubuntu/mysql-data:/var/lib/mysql这种方式把宿主机上已有的目录直接挂载进容器好处是你能直接看到文件备份也方便。对于数据库这类文件命名卷其实更好因为你不需要关心宿主机目录具体在哪Docker 自己管。如果需要备份可以用docker run --rm -v mysql-data:/backup ubuntu tar cvf /backup/mysql_backup.tar /var/lib/mysql这类方式把卷内容打包出来。5.3 Docker Compose 编排 MySQL 和 Redis 主从当容器变多一条条docker run命令就不够用了。这时候就可以用 Docker Compose它是 Docker 官方的容器编排工具通过一个docker-compose.yml文件把所有容器定义在一起。Redis 主从是搜索热词里的高频需求。我当时做了一个练习一个 MySQL 加一主一从两个 Redis用 Compose 一次性启动。核心配置文件长这样version: 3.8 services: mysql: image: mysql:8.0 container_name: mysql8 ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root123456 volumes: - mysql-data:/var/lib/mysql redis-master: image: redis:7 container_name: redis-master ports: - 6379:6379 command: redis-server --requirepass masterpass redis-slave: image: redis:7 container_name: redis-slave ports: - 6380:6379 depends_on: - redis-master command: redis-server --slaveof redis-master 6379 --masterauth masterpass volumes: mysql-data:执行docker compose up -d后三条命令对应的三个容器全部启动。这里值得留意的点是depends_on控制启动顺序从库要等主库先就绪。服务名redis-master在 Compose 网络里可以直接作为主机名互相访问这也是容器网络和宿主机网络的区别。用 Compose 管理多个容器后停止和清理变得非常方便docker compose down一键全停。我自己的经验是学 Compose 不用刻意找教程等你的容器数量超过三个你就自然会想去用。它解决的不是“能不能跑”而是“能不能管好”的问题。6. 进阶实战用 Docker 部署 GitLab 和其他典型应用6.1 部署 GitLab 的注意事项GitLab 是企业级代码仓库工具很多团队都用它做私有代码托管。用 Docker 部署 GitLab 其实不复杂但有几个坑必须先说第一GitLab 资源消耗大官方建议至少 4GB 内存。我用 2GB 的虚拟机试过启动后直接卡爆页面半天打不开。建议至少 4GB8GB 才比较舒服。第二端口冲突问题。GitLab 默认用 80、443 和 22 端口如果你的宿主机这些端口已经被占用需要映射到其他端口docker run -d \ --name gitlab \ --restart always \ -p 8088:80 \ -p 8443:443 \ -p 8022:22 \ -v gitlab-config:/etc/gitlab \ -v gitlab-logs:/var/log/gitlab \ -v gitlab-data:/var/opt/gitlab \ gitlab/gitlab-ce:latest第三外网地址配置。如果你想用 IP 访问修改/etc/gitlab/gitlab.rb中的external_url http://你的IP:8088然后执行docker exec gitlab gitlab-ctl reconfigure。GitLab 首次启动需要 3 到 5 分钟才能访问很多人以为卡住了就频繁重启容器反而越搞越糟。正确做法是启动后隔一两分钟执行docker logs gitlab看看日志输出看到 “GitLab is up and running” 就说明好了。6.2 定时任务类容器依赖管理是隐藏痛点搜索热词里有“docker青龙 依赖管理”这样的词我不过度展开具体某个工具但有一点值得所有 Docker 新人记住很多自动化任务、定时脚本类容器最大的痛点不是容器起不来而是容器环境里缺少 Python 包、Node 模块或系统库导致脚本跑一会就报错。遇到这类问题排查顺序是先看日志docker logs -f 容器名定位是哪个语言环境在报错。进入容器docker exec -it 容器名 bash手动执行出错的命令复现问题。安装缺失依赖Python 用 pipNode 用 npm系统库用 apkAlpine或 aptUbuntu/Debian。注意容器重启后依赖是否会丢失。如果镜像没有把这些依赖固化建议把命令写入 Dockerfile 重新构建镜像而不是每次手动装。依赖管理这件事看似简单实则是容器应用稳定运行的根基。生产环境里很多故障的根源不是应用代码而是容器环境里少了一个系统包。6.3 用 Dockerfile 构建自己的镜像学到这里你已经会拉取现成镜像、运行容器、配置数据卷下一步就是构建自己的镜像。搜索热词里“idea打包docker镜像”说明开发者想把 Java 项目一键部署成 docker 镜像。这个方向完全正确。一个最简单的 Java Spring Boot 项目 Dockerfile 长这样FROM openjdk:17-jdk-alpine WORKDIR /app COPY target/demo-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]构建命令就一句话docker build -t demo:1.0 .。这里的.表示使用当前目录下的 Dockerfile。构建完成后再用docker run -d -p 8080:8080 demo:1.0就能跑起来。如果你是 IntelliJ IDEA 用户装一个 Docker 插件右键 Dockerfile 可以直接在 IDE 里构建镜像不用切到命令行。构建成功后推到私有仓库或 Docker Hub再到服务器上拉取运行这就是现代应用最基本的交付流程。我建议你一定要手写一次 Dockerfile哪怕只是一个小脚本项目。因为这一步能帮助你真正理解“镜像层”的概念FROM拉基础镜像、COPY拷贝文件、RUN执行安装命令每一行都是一个只读层构建时按顺序叠加。理解这个模型后很多 Docker 的奇怪行为就不难解释了。6.4 多架构与国产 Linux 环境搜索热词里有“龙芯 docker”和“linux国产”的搜索记录这说明越来越多人在国产芯片和国产 Linux 发行版上使用 Docker。龙芯等平台和 x86/ARM 不同有些镜像没法直接用需要留意镜像是否提供对应架构的版本。处理方式很简单拉镜像的时候加--platform linux/loong64或查看镜像仓库的 Tags看是否有对应架构的 tag。如果没有现成镜像就需要用 Dockerfile 从源码构建但构建时间可能比较长。国产 Linux 这边现在主流发行版像 openEuler、统信 UOS、麒麟等都可以安装 Docker 或兼容的容器运行时。安装方式多数是通过官方软件源直接装或者使用二进制包安装。装完之后的docker run命令和 Ubuntu 上没有区别学习成本几乎为零。如果你工作的环境涉及国产化替换建议把跨架构部署当成一个独立技能来学。先随便找一个开源项目源码分别在自己的 x86 机器和 ARM 机器上构建镜像体会一下 Dockerfile 的跨平台能力再考虑如何在具体平台上跑起来。7. 高频报错与排查技巧实录7.1 问题速查表我把新手在 Linux 和 Docker 学习过程中最常遇到的报错整理成一个速查表方便你遇到问题时对照排查报错现象可能原因排查思路Docker Desktop 启动失败提示 virtualisation support not detectedBIOS 里虚拟化未开启任务管理器查看“虚拟化”进 BIOS 开启 VT-x/AMD-VWSL 磁盘空间不释放vhdx 虚拟磁盘未压缩wsl --shutdown用 diskpart 压缩 vhdx 文件docker pull 卡住网络原因拉镜像慢配置国内镜像源立即重启 docker容器启动后立刻退出启动命令报错或前台进程退出docker logs 容器名查看日志无法连接 MySQL/Redis端口映射错误或密码认证问题docker ps看端口映射检查-e环境变量MySQL 连接时报 caching_sha2_password 错误MySQL 8 默认认证插件不兼容老客户端改用 mysql_native_password 认证重新创建用户tar/zip 解压中文乱码Windows 和 Linux 编码不一致用unar解压替代 unzipLinux 修改 DNS 不生效systemd-resolved 覆盖配置用 netplan 或 systemd-resolve 正确配置内核模块相关错误如 file_operations 被拦截、透明加密导致读写异常某些环境安装了内核审计/加密模块用 dmesg 查内核日志和系统管理员确认模块影响7.2 排查方法论不要盲目重装遇到问题千万不要第一时间重装系统或删除容器那只会让你失去找问题根因的机会。我自己的排查流程很简单先收集信息再缩小范围第一步看日志。容器问题看docker logs系统服务问题看journalctl内核问题看dmesg。日志是错的唯一实证不看日志纯靠猜是在浪费时间。第二步确认环境。docker version看 Docker 版本uname -a看内核版本cat /etc/os-release看系统版本。有些问题是版本兼容性导致的版本一确认就能直接搜到答案。第三步搜索。把完整报错信息复制到搜索引擎注意是复制完整信息不要自己总结关键词很多时候一个人名或路径拼写错误就是查不到答案的原因。第四步最小化复现。把一个复杂场景拆到最简单比如你部署一个应用连不上数据库先用docker run只启动 MySQL再用宿主机的 mysql 客户端测试连接逐个环节确认问题就藏不住了。这套方法让我避免了很多无效操作。特别是当你在 Linux 上遇到“文件读写异常”这类模糊问题先看内核日志往往能发现是透明加密驱动或某些安全模块在拦截 read/write 系统调用。遇到这种情况和系统管理员确认模块的拦截规则比自己在应用层瞎调试要高效得多。7.3 Docker 容器清理与磁盘回收跑了一段时间 Docker你会发现磁盘越来越满这正常。镜像、容器、数据卷、构建缓存都会占用空间。清理命令要学会docker system df查看空间使用情况这个命令会按镜像、容器、卷、构建缓存分类展示。docker system prune清理已停止的容器、无用的网络、悬空镜像和构建缓存。docker system prune -a --volumes清理得更彻底会删除所有未被使用的镜像和数据卷。生产环境用这个命令要极其谨慎因为会把没有容器引用的数据卷一起删掉相当于格式化硬盘。我学习阶段每两周会手动执行一次docker system prune -f不带-a避免误删还想要的镜像又能释放不少空间。养成习惯后磁盘空间焦虑会缓解很多。7.4 Linux 面试和测试相关的一点经验搜索热词里有“linux面试题”“linux面试题测试”和“kali linux 学习笔记”顺带聊两句。面试官问 Linux 命令其实重点不是你会不会背ls的参数而是你有没有排查思路。比如部署了一个服务访问不了你会怎么排这比“tar 和 gzip 的区别”这类概念题更能反映真实水平。建议你把前面几节内容里那些“为什么”的原理记住面试时把思路讲清楚比背一百条命令都管用。至于 Kali Linux它是安全测试领域的常用发行版安装流程和 Ubuntu 一样学习时注意工具链的使用场景就行不要为了折腾而折腾。8. 收尾前的一点个人经验最后分享一个我自己的习惯我会给每次折腾的服务器建立一份“笔记快照”记下装了什么软件、改了哪些配置、跑通了哪些命令。这份活页笔记不用很正式能让自己看明白就行。因为 Linux 和 Docker 的知识点太分散不记下来三个月后回看自己当时的操作是真的会想不起来。另一个经验是学习 Linux 和 Docker 不要一上来就追求“最全命令手册”你只需要掌握 20% 的核心命令就能覆盖 80% 的日常操作。剩余查不到的用man、--help、搜索引擎补齐就好。把时间花在理解概念和排查思路上比机械复制大段命令有意义得多。希望这份笔记能帮你少走一些弯路。如果你在实践过程中遇到了哪条报错解决不了可以顺着上面的排查方法走一遍大概率能找到线索。学这个领域没有捷径但我们可以选择一条踩坑更少的路线。