> 技术文档 > 运维小白逆袭:从 Linux 命令到 Docker 容器的零基础成长笔记

运维小白逆袭:从 Linux 命令到 Docker 容器的零基础成长笔记


🤵‍♂️ 个人主页:布说再见
✍🏻作者简介:
🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏📂加关注+

目录

  • 运维需要了解
  • 你天天用的网络,底层原理居然这么酷?
    • 1.请解释一下 Linux 和 Windows 系统的区别?
    • 2. 如何查看系统的硬件资源使用情况?
    • 3.网络基础 “TCP/IP 协议如何工作?
    • 传输层(Transport Layer)
  • Bash 日志监控脚本
      • Python 定时文件清理脚本
      • Ansible 系统巡检 Playbook
      • PowerShell 服务监控脚本
  • 如何管理和优化 Docker 容器?
      • 镜像优化
      • 资源限制
      • 存储优化
      • 网络优化
  • 总结

运维需要了解

网络基础tcp/ip 、dns、http
运维工具 Docker
脚本能力Shell
监控工具Zabbix、prometheus
了解数据库基础mysql、redis
了解自动化工具,如Ansible、Puppet、Chef、SaltStack等。

你天天用的网络,底层原理居然这么酷?

1.请解释一下 Linux 和 Windows 系统的区别?

内核与架构差异 Linux 基于开源内核(如 Linux Kernel),支持模块化设计,允许用户自定义内核组件。Windows使用闭源的 NT 内核,强调统一性和商业兼容性。Linux 通常运行于更广泛的硬件架构(如 ARM、RISC-V),而 Windows主要支持 x86/64 架构。

2. 如何查看系统的硬件资源使用情况?

在Windows系统中,Ctrl+Shift+Esc
运维小白逆袭:从 Linux 命令到 Docker 容器的零基础成长笔记
Linux用户

可通过终端命令top或htop查看CPU负载,或使用mpstat命令获取详细统计信息。

查看内存使用

通过free-h命令查看内存和交换分区(Swap)使用情况,-h参数会自动转换为易读单位(GB/MB)。

查看磁盘空间

df -h

使用系统监控工具

pip install glances
glances

3.网络基础 “TCP/IP 协议如何工作?

TCP/IP协议是互联网通信的基础,分为四层结构:应用层、传输层、网络层和链路层。传输控制协议(TCP)位于传输层,负责可靠的数据传输,确保数据包有序、无差错地到达目的地。TCP 通过连接建立、数据传输和连接终止三个阶段完成通信。

4.常见应用层协议有哪些?各自的作用是什么?

HTTP/HTTPS:超文本传输协议,用于 Web 页面传输(HTTPS 通过 TLS 加密)。
FTP:文件传输协议,用于文件上传下载(基于 TCP,分控制连接和数据连接)。
SMTP/POP3/IMAP:邮件传输协议(SMTP 发信,POP3/IMAP 收信)。
DNS:域名系统将域名解析为 IP 地址(www.baidu.com→IP)。
DHCP:动态主机配置协议,自动分配 IP 地址及网络参数。

了解4和5

5.HTTP 与 HTTPS 的区别是什么?HTTPS 如何保证安全?

区别:HTTPS 通过 TLS/SSL 加密数据,端口为 443(HTTP 为 80)。
安全原理:
客户端服务器协商加密算法(如 RSA),生成会话密钥。
服务器通过 CA 证书验证身份,防止中间人攻击。
数据传输时用对称加密(如 AES)提高效率,用非对称加密保护会话密钥。
DNS 解析的过程是怎样的?
客户端先查本地 DNS 缓存,若没有则向本地域名服务器查询。
本地服务器依次向根域名服务器、顶级域名服务器(.com/.cn 等)、权威域名服务器递归查询,最终返回 IP 地址。
为什么 FTP 需要两个连接(控制连接和数据连接)?
控制连接(TCP 21):持续传输命令(如登录、文件操作)。
数据连接(TCP 20):传输实际文件数据(主动模式由服务器发起,被动模式由客户端发起)。

传输层(Transport Layer)

1.TCP 和 UDP 的区别是什么?各自的应用场景有哪些?

特性 TCP UDP 连接性 面向连接(三次握手建立连接) 无连接(直接发送数据包) 可靠性 可靠传输(确认、重传、排序) 不可靠传输(无确认机制) 传输效率 效率低(头部开销大) 效率高(头部仅 8 字节) 应用场景 HTTP、FTP、SMTP 视频流、DNS、SNMP、游戏通信

2.TCP 如何实现可靠传输?
确认机制:接收方返回 ACK 确认报文,发送方超时未收到则重传。
序列号(Sequence Number):标记数据顺序,确保接收方按序组装。
流量控制:通过滑动窗口(Window Size)告知发送方当前接收缓冲区大小,避免溢出。
拥塞控制:慢开始(Slow Start)、拥塞避免(Congestion Avoidance)、快重传(Fast Retransmit)、快恢复(Fast Recovery)。

3.TCP 三次握手的过程是怎样的?为什么需要三次?
过程:
客户端发送 SYN 包(seq=x),请求建立连接。
服务器回复 SYN+ACK 包(seq=y,ack=x+1)。
客户端回复 ACK 包(seq=x+1,ack=y+1),连接建立。
原因:防止失效的连接请求报文段被服务器接收,避免资源浪费(如客户端旧 SYN 延迟到达,服务器若仅两次握手会误判为新连接)。

4.TCP 四次挥手的过程是怎样的?为什么挥手需要四次?
过程:

客户端发送 FIN 包(seq=a),请求关闭连接。
服务器回复 ACK 包(ack=a+1),此时服务器仍可发送数据。
服务器发送 FIN 包(seq=b),请求关闭服务器到客户端的连接。
客户端回复 ACK 包(ack=b+1),等待 2MSL 后关闭连接。
原因:服务器收到 FIN 后,可能还有未发送完的数据,需先回复 ACK 确认,再发送 FIN 关闭连接,因此挥手需要四次。

5.什么是三次握手和四次挥手?,如果服务器无法连接到外网,如何排查?

三次握手是TCP协议建立连接的过程,确保双方具备发送和接收数据的能力。

客户端发送SYN报文:客户端向服务器发送一个SYN(同步序列编号)包,初始序列号为x,状态变为SYN-SENT

服务器响应SYN-ACK报文:服务器收到SYN包后,发送一个SYN-ACK包,确认号为x+1,同时设置自己的初始序列号为y,状态变为SYN-RECEIVED

客户端发送ACK报文:客户端收到SYN-ACK包后,发送一个ACK包,确认号为y+1,序列号为x+1,状态变为ESTABLISHED。服务器收到后同样进入ESTABLISHED状态,连接建立完成。

四次挥手是TCP协议断开连接的过程,确保双方数据完全传输完毕。

客户端发送FIN报文:客户端主动关闭连接时,发送FIN包,序列号为u,状态变为FIN-WAIT-1

服务器响应ACK报文:服务器收到FIN包后,发送ACK包,确认号为u+1,状态变为CLOSE-WAIT。客户端收到ACK后进入FIN-WAIT-2状态。

服务器发送FIN报文:服务器准备好关闭连接时,发送FIN包,序列号为v,状态变为LAST-ACK

客户端响应ACK报文:客户端收到FIN包后,发送ACK包,确认号为v+1,状态变为TIME-WAIT。服务器收到ACK后关闭连接。客户端等待2MSL(报文最大生存时间)后也关闭连接。


“你有使用过哪些自动化工具或脚本语言?比如 Bash、Python 或 Ansible?”

Bash 日志监控脚本

#!/bin/bashLOG_FILE=\"/var/log/nginx/error.log\"ALERT_EMAIL=\"admin@example.com\"ERROR_THRESHOLD=10error_count=$(grep -c \"ERROR\" \"$LOG_FILE\")if [ \"$error_count\" -gt \"$ERROR_THRESHOLD\" ]; then mail -s \"High Error Rate Detected in Nginx Log\" \"$ALERT_EMAIL\" <<EOFWarning: $error_count errors found in $LOG_FILE.Please check the server immediately.EOFfi

Python 定时文件清理脚本

import osimport timefrom datetime import datetime, timedeltadef clean_old_files(directory, days_threshold): cutoff = datetime.now() - timedelta(days=days_threshold) for filename in os.listdir(directory): filepath = os.path.join(directory, filename) if os.path.isfile(filepath): mod_time = datetime.fromtimestamp(os.path.getmtime(filepath)) if mod_time < cutoff: os.remove(filepath) print(f\"Removed: {filepath}\")clean_old_files(\'/tmp/backups\', 30)

Ansible 系统巡检 Playbook

---- name: System Health Check hosts: all tasks: - name: Check disk usage command: df -h register: disk_usage - name: Check memory usage command: free -m register: memory_usage - name: Save report copy: content: | Disk Usage: {{ disk_usage.stdout_lines | join(\'\\n\') }} Memory Usage: {{ memory_usage.stdout_lines | join(\'\\n\') }} dest: /var/log/system_check.log

PowerShell 服务监控脚本

$services = @(\"WinRM\", \"Spooler\", \"EventLog\")$output = \"\"foreach ($service in $services) { $status = Get-Service -Name $service | Select-Object Status $output += \"$service Status: $($status.Status)`n\"}if ($output -match \"Stopped\") { Send-MailMessage -From \"monitor@domain.com\" -To \"admin@domain.com\" -Subject \"Service Alert\" -Body $output -SmtpServer \"smtp.domain.com\"}

对于日志脚本我应该下个月开始学习,并深入了解。

如何管理和优化 Docker 容器?

镜像优化

  • 使用多阶段构建减少镜像层数和体积,例如合并 RUN 指令。
  • 选择 Alpine 等轻量级基础镜像,避免包含冗余依赖。
  • 定期清理无用镜像:docker image prune -a

资源限制

  • 通过 --memory--cpu 参数限制容器资源,防止单容器耗尽主机资源:
    docker run --memory=512m --cpus=1.5 my_app
  • 使用 docker stats 实时监控资源使用情况。

性能调优技巧

存储优化

  • 避免容器存储驱动(如 overlay2)成为瓶颈,对于高 I/O 场景,挂载卷(Volume)替代容器层写入:
    docker run -v /host/path:/container/path my_app
  • 考虑使用 tmpfs mounts 加速临时文件读写。

网络优化

  • 选择适当的网络模式(如 host 模式避免 NAT 开销,但牺牲隔离性)。
  • 自定义桥接网络优化容器间通信。

编排工具实践
Kubernetes 优化

  • 配置 Horizontal Pod Autoscaler(HPA)自动伸缩 Pod 数量。
  • 使用 Resource Quotas 和 Limit Ranges 管理命名空间资源。
  • 通过 kubectl top 和 Prometheus 监控集群状态。

日志与调试

  • 集中日志管理:Fluentd 或 Loki 收集容器日志。
  • 使用 kubectl describe pod 排查部署问题。

总结

运维知识体系庞大,需从基础协议(如 TCP/IP、HTTP)、系统操作(Linux/Windows)、自动化工具(Shell/Python/Ansible)到容器技术(Docker/K8s)逐步深入。建议结合实践(如部署简单服务、编写监控脚本)巩固理论,同时关注性能优化与故障排查(如网络连接问题、资源瓶颈),逐步提升运维能力。