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-x(Intel 平台)或 AMD-V(AMD 平台),开启后保存退出。
- 确认 Windows 功能里“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两项均已勾选。勾选后需要重启。
- 在管理员 PowerShell 里执行
wsl --status,如果提示没有已安装的分发版,先执行wsl --install装一个 Ubuntu,Docker Desktop 依赖 WSL2 后端。
另一个高频坑是 WSL 磁盘空间不释放。你在 WSL 里删了几个 GB 的文件,Windows 的 C 盘空间却纹丝不动,这是因为 WSL 用的是动态扩展的虚拟磁盘,删了文件之后它不会自动收缩。解决办法是执行wsl --shutdown,然后以管理员身份打开 PowerShell,运行diskpart,依次执行select vdisk file="C:\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表示后台运行,不加的话你会一直卡在前台,Ctrl+C 容器就停了。--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_PASSWORD=root123456 \ -e TZ=Asia/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 的虚拟机试过,启动后直接卡爆,页面半天打不开。建议至少 4GB,8GB 才比较舒服。
第二,端口冲突问题。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 用 pip,Node 用 npm,系统库用 apk(Alpine)或 apt(Ubuntu/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 detected | BIOS 里虚拟化未开启 | 任务管理器查看“虚拟化”,进 BIOS 开启 VT-x/AMD-V |
| WSL 磁盘空间不释放 | 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解压,替代 unzip |
| Linux 修改 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、搜索引擎补齐就好。把时间花在理解概念和排查思路上,比机械复制大段命令有意义得多。
希望这份笔记能帮你少走一些弯路。如果你在实践过程中遇到了哪条报错解决不了,可以顺着上面的排查方法走一遍,大概率能找到线索。学这个领域没有捷径,但我们可以选择一条踩坑更少的路线。