Docker 入门:镜像、容器和数据卷
这周把 Docker 的基本概念过了一遍,用一个比喻记住:镜像是安装包,容器是装好后正在运行的程序,数据卷是程序外挂的硬盘。
- 镜像只读:容器在镜像上加了一层可写层,容器删掉,这层改动也就没了。
- 数据要持久化:数据库这类容器一定要挂载数据卷,否则重建容器数据全丢。
- 端口映射:
-p 宿主机端口:容器端口,顺序别写反。
docker run -d --name mysql8 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=your_password \
mysql:8.0
HTTP 状态码,常见的这些要背熟
- 2xx 成功:200 正常,201 已创建,204 成功但无返回内容。
- 3xx 重定向:301 永久跳转(会被缓存),302 临时跳转,304 资源未修改走缓存。
- 4xx 客户端问题:400 参数错误,401 未登录,403 无权限,404 不存在,429 请求太频繁。
- 5xx 服务端问题:500 程序报错,502 网关拿不到上游响应,504 上游超时。
排查经验:看到 502 先查后端进程是不是挂了,看到 504 先查是不是有慢查询。
MySQL 索引为什么会"失效"
建了索引但查询还是很慢,用 EXPLAIN 一看是全表扫描。整理了几种常见原因:
- 对索引列做运算或函数:
WHERE YEAR(created_at) = 2026用不上索引,改成范围查询。 - 隐式类型转换:字符串字段用数字去比较,会触发转换导致失效。
- 违反最左前缀:联合索引 (a, b, c),只查 b、c 用不上。
- 前置模糊匹配:
LIKE '%abc'无法走索引,LIKE 'abc%'可以。
-- 不推荐
SELECT * FROM orders WHERE YEAR(created_at) = 2026;
-- 推荐
SELECT * FROM orders
WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01';
Python 虚拟环境:为什么每个项目都该有一个
之前所有包都装在全局,结果两个项目要的库版本冲突。现在养成习惯:新项目第一件事建虚拟环境。
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pip freeze > requirements.txt # 导出依赖
记得把 .venv/ 加进 .gitignore,不要提交到仓库。
服务器磁盘满了怎么查
网站突然打不开,最后发现是日志把磁盘写满了。排查步骤记一下:
- 先看整体:
df -h找到哪个分区满了。 - 再找大目录:
du -sh /* | sort -rh | head一层层往下钻。 - 删了空间没释放:文件还被进程占用,用
lsof | grep deleted找到并重启对应进程。
长期方案:给日志配 logrotate,按天切割、保留最近 7 天。
列表推导式和生成器表达式的区别
- 写法:方括号是列表推导式,圆括号是生成器表达式。
- 内存:列表一次性把结果全放进内存;生成器用一个算一个,处理大文件时省很多内存。
- 只能遍历一次:生成器迭代完就空了,需要多次使用就转成列表。
squares = [x * x for x in range(10)] # list
total = sum(x * x for x in range(10_000_000)) # generator,几乎不占内存
Linux 文件权限:rwx 和 755 是怎么对应的
- 三组身份:所有者、所属组、其他人,各自有读(r)、写(w)、执行(x)三种权限。
- 数字表示:r=4,w=2,x=1,相加得到每组的数字。755 就是 rwx r-x r-x。
- 目录的 x:对目录来说 x 表示"能进入",没有它连
cd都不行。
chmod 755 deploy.sh
chown -R www:www /www/wwwroot/site # 递归修改所有者
开篇:为什么开始写学习笔记
学了好几个月,回头发现很多东西学过就忘,遇到同样的问题还要重新搜一遍。于是决定搭个小站,把每次学到的、踩过的坑都写下来。
给自己定的规矩:不追求多,追求写清楚;每篇都要有自己动手验证过的例子。
第一条记录:git commit -m "init: 学习笔记站上线"