低频但重要的工具
这些工具不是天天用,但关键时刻能救命,提前了解绝对值得
一、容器技术
1.1 Docker
Docker 是什么?
Docker 是一个开源的容器化平台,让你可以将应用及其依赖打包到一个可移植的容器中运行。容器比虚拟机更轻量,启动更快。
安装 Docker
# Ubuntu
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
# 或使用官方脚本
curl -fsSL https://get.docker.com | sh
# 将用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER
# 重新登录后生效
镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx
docker pull nginx:1.21
docker pull ubuntu:22.04
# 查看本地镜像
docker images
docker image ls
# 删除镜像
docker rmi nginx
docker rmi nginx:1.21
docker image prune # 删除未使用的镜像
docker image prune -a # 删除所有未使用的镜像
# 镜像详情
docker inspect nginx
# 镜像历史
docker history nginx
# 保存/加载镜像
docker save nginx > nginx.tar
docker load < nginx.tar
# 构建镜像
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .
容器管理
# 运行容器
docker run nginx # 前台运行
docker run -d nginx # 后台运行
docker run -d --name mynginx nginx # 指定名称
docker run -d -p 8080:80 nginx # 端口映射
docker run -d -p 80:80 -p 443:443 nginx # 多端口映射
docker run -d -P nginx # 自动映射端口
# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql
# 挂载卷
docker run -d -v /host/path:/container/path nginx
docker run -d -v myvolume:/data nginx # 命名卷
docker run -d -v $(pwd):/app node # 当前目录
# 资源限制
docker run -d --memory=512m --cpus=1 nginx
# 查看容器
docker ps # 运行中的容器
docker ps -a # 所有容器
docker ps -q # 只显示 ID
# 容器操作
docker start container_id
docker stop container_id
docker restart container_id
docker pause container_id
docker unpause container_id
# 删除容器
docker rm container_id
docker rm -f container_id # 强制删除运行中的
docker container prune # 删除所有停止的容器
# 查看日志
docker logs container_id
docker logs -f container_id # 实时跟踪
docker logs --tail 100 container_id # 最后100行
docker logs --since "1h" container_id
# 进入容器
docker exec -it container_id /bin/bash
docker exec -it container_id sh
docker exec container_id ls /app
# 查看容器详情
docker inspect container_id
docker stats # 实时资源使用
docker top container_id # 容器内进程
# 复制文件
docker cp file.txt container_id:/path/
docker cp container_id:/path/file.txt ./
Dockerfile 编写
# 基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制源码
COPY . .
# 暴露端口
EXPOSE 3000
# 环境变量
ENV NODE_ENV=production
# 启动命令
CMD ["node", "server.js"]
多阶段构建:
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Docker Compose
docker-compose.yml 示例:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://postgres:password@db:5432/mydb
depends_on:
- db
- redis
volumes:
- ./logs:/app/logs
restart: unless-stopped
db:
image: postgres:14
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
postgres_data:
# Docker Compose 命令
docker-compose up # 前台启动
docker-compose up -d # 后台启动
docker-compose up --build # 重新构建
docker-compose down # 停止并删除
docker-compose down -v # 同时删除卷
docker-compose ps # 查看状态
docker-compose logs # 查看日志
docker-compose logs -f web # 跟踪特定服务
docker-compose exec web bash # 进入容器
docker-compose restart web # 重启服务
docker-compose pull # 拉取最新镜像
Docker 网络
# 查看网络
docker network ls
# 创建网络
docker network create mynetwork
docker network create --driver bridge mybridge
# 连接容器到网络
docker network connect mynetwork container_id
docker network disconnect mynetwork container_id
# 运行时指定网络
docker run -d --network mynetwork nginx
# 查看网络详情
docker network inspect mynetwork
Docker 卷
# 创建卷
docker volume create myvolume
# 查看卷
docker volume ls
docker volume inspect myvolume
# 删除卷
docker volume rm myvolume
docker volume prune # 删除未使用的卷
清理 Docker
# 清理所有未使用的资源
docker system prune
docker system prune -a # 包括未使用的镜像
docker system prune --volumes # 包括卷
# 查看磁盘使用
docker system df
1.2 Podman
Podman 是 Docker 的替代品,无需守护进程,更安全:
# 安装
sudo apt install podman
# 命令与 Docker 兼容
podman run -d nginx
podman ps
podman images
# 可以设置别名
alias docker=podman
二、性能分析工具
2.1 strace - 系统调用追踪
strace 可以追踪进程的系统调用,排查程序行为问题:
# 追踪命令
strace ls
strace -o output.txt ls # 输出到文件
# 追踪运行中的进程
strace -p 1234
# 常用选项
strace -e open ls # 只追踪 open 调用
strace -e trace=file ls # 追踪文件相关调用
strace -e trace=network curl ... # 追踪网络调用
strace -e trace=process ./app # 追踪进程相关
strace -c ls # 统计系统调用
strace -T ls # 显示每个调用耗时
strace -t ls # 显示时间戳
strace -f ./app # 追踪子进程
# 追踪类别
# file: 文件操作
# network: 网络操作
# process: 进程操作
# signal: 信号
# ipc: 进程间通信
# memory: 内存映射
实际应用场景
# 1. 查找程序读取的配置文件
strace -e open,openat ./app 2>&1 | grep -E '\.(conf|cfg|ini|yaml|json)'
# 2. 排查程序为什么启动慢
strace -c -f ./app
# 3. 查看程序连接的网络地址
strace -e connect curl https://example.com 2>&1
# 4. 排查文件权限问题
strace -e access,open ./app 2>&1 | grep -i denied
2.2 ltrace - 库函数追踪
ltrace 追踪程序调用的动态库函数:
ltrace ./app
ltrace -c ./app # 统计调用
ltrace -e malloc ./app # 追踪特定函数
2.3 perf - 性能分析
perf 是 Linux 内核提供的性能分析工具:
# 安装
sudo apt install linux-tools-common linux-tools-generic
# CPU 性能分析
sudo perf top # 实时 CPU 热点
sudo perf stat ./app # 执行统计
sudo perf record ./app # 记录性能数据
sudo perf report # 查看报告
# 追踪特定事件
sudo perf record -e cpu-cycles ./app
sudo perf record -g ./app # 记录调用栈
# 火焰图
sudo perf record -g ./app
sudo perf script > out.perf
# 使用 FlameGraph 工具生成火焰图
2.4 lsof - 列出打开的文件
lsof 显示进程打开的文件、网络连接等:
# 查看所有打开的文件
lsof
# 查看特定进程
lsof -p 1234
# 查看特定用户
lsof -u username
# 查看特定文件
lsof /var/log/syslog
# 查看目录下打开的文件
lsof +D /var/log
# 查看网络连接
lsof -i # 所有网络连接
lsof -i :80 # 特定端口
lsof -i tcp # TCP 连接
lsof -i tcp:80 # TCP 80端口
lsof -i @192.168.1.100 # 特定 IP
# 查看 UNIX 套接字
lsof -U
# 查看特定命令
lsof -c nginx
# 查找被删除但仍占用的文件
lsof | grep deleted
# 组合使用
lsof -u root -i tcp:22 # root 用户的 SSH 连接
2.5 fuser - 查找使用文件的进程
# 查看谁在使用文件
fuser /var/log/syslog
# 查看端口占用
fuser 80/tcp
fuser -v 80/tcp # 详细信息
# 杀死占用进程
fuser -k 80/tcp # 杀死占用 80 端口的进程
fuser -k /mnt/data # 杀死占用挂载点的进程
2.6 pmap - 进程内存映射
pmap 1234 # 查看进程内存映射
pmap -x 1234 # 扩展信息
pmap -X 1234 # 更详细
三、安全工具
3.1 fail2ban - 防暴力破解
fail2ban 自动封禁多次失败登录的 IP:
# 安装
sudo apt install fail2ban
# 启动服务
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
# 查看状态
sudo fail2ban-client status
sudo fail2ban-client status sshd
# 查看封禁的 IP
sudo fail2ban-client status sshd
# 手动封禁/解封
sudo fail2ban-client set sshd banip 192.168.1.100
sudo fail2ban-client set sshd unbanip 192.168.1.100
配置文件 /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600 # 封禁1小时
findtime = 600 # 10分钟内
maxretry = 5 # 最多5次失败
ignoreip = 127.0.0.1/8 192.168.1.0/24
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400 # SSH 封禁24小时
3.2 SELinux (CentOS/RHEL)
SELinux 是强制访问控制系统:
# 查看状态
getenforce
sestatus
# 模式切换
sudo setenforce 0 # 临时切换到 Permissive
sudo setenforce 1 # 切换到 Enforcing
# 永久修改
# 编辑 /etc/selinux/config
SELINUX=enforcing # enforcing/permissive/disabled
# 查看文件上下文
ls -Z /var/www/html
# 修改文件上下文
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
sudo restorecon -v /var/www/html/
# 查看布尔值
getsebool -a
getsebool httpd_can_network_connect
# 修改布尔值
sudo setsebool -P httpd_can_network_connect on
# 查看审计日志
sudo ausearch -m avc -ts recent
sudo audit2why < /var/log/audit/audit.log
3.3 AppArmor (Ubuntu/Debian)
AppArmor 是 Ubuntu 默认的安全模块:
# 查看状态
sudo aa-status
sudo apparmor_status
# 查看配置
ls /etc/apparmor.d/
# 切换模式
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx # 投诉模式
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx # 强制模式
# 禁用配置
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx
# 重新加载
sudo systemctl reload apparmor
3.4 SSH 安全加固
# 编辑 /etc/ssh/sshd_config
# 禁用密码登录
PasswordAuthentication no
# 禁用 root 登录
PermitRootLogin no
# 限制用户
AllowUsers deploy admin
# 更改端口
Port 2222
# 限制登录尝试
MaxAuthTries 3
LoginGraceTime 30
# 禁用空密码
PermitEmptyPasswords no
# 使用协议 2
Protocol 2
3.5 网络安全扫描
# nmap - 端口扫描
nmap localhost # 扫描本机
nmap 192.168.1.100 # 扫描特定主机
nmap -sV 192.168.1.100 # 版本检测
nmap -O 192.168.1.100 # 操作系统检测
nmap -p 1-1000 192.168.1.100 # 指定端口范围
nmap -sU 192.168.1.100 # UDP 扫描
nmap 192.168.1.0/24 # 扫描网段
# netcat - 网络调试
nc -zv 192.168.1.100 80 # 测试端口
nc -l 8080 # 监听端口
nc 192.168.1.100 8080 # 连接端口
四、调试工具
4.1 gdb - GNU 调试器
gdb 是 Linux 下最强大的程序调试器:
# 启动调试
gdb ./program
gdb -p 1234 # 附加到进程
# 基本命令
(gdb) run # 运行程序
(gdb) run arg1 arg2 # 带参数运行
(gdb) break main # 在 main 设断点
(gdb) break file.c:20 # 在文件第20行设断点
(gdb) info breakpoints # 查看断点
(gdb) delete 1 # 删除断点1
(gdb) continue # 继续运行
(gdb) next # 单步(不进入函数)
(gdb) step # 单步(进入函数)
(gdb) print var # 打印变量
(gdb) backtrace # 调用栈
(gdb) frame 2 # 切换栈帧
(gdb) quit # 退出
# 分析 core dump
gdb ./program core # 分析崩溃转储
4.2 valgrind - 内存调试
valgrind 用于检测内存泄漏和错误:
# 内存检查
valgrind ./program
valgrind --leak-check=full ./program
valgrind --leak-check=full --show-leak-kinds=all ./program
# 性能分析
valgrind --tool=callgrind ./program
4.3 tcpdump - 网络抓包
# 基本抓包
sudo tcpdump # 抓取所有流量
sudo tcpdump -i eth0 # 指定接口
# 过滤
sudo tcpdump host 192.168.1.100 # 指定主机
sudo tcpdump port 80 # 指定端口
sudo tcpdump src 192.168.1.100 # 源地址
sudo tcpdump dst 192.168.1.100 # 目标地址
sudo tcpdump tcp # TCP 流量
sudo tcpdump udp # UDP 流量
# 组合过滤
sudo tcpdump host 192.168.1.100 and port 80
sudo tcpdump 'host 192.168.1.100 and (port 80 or port 443)'
# 输出选项
sudo tcpdump -n # 不解析域名
sudo tcpdump -nn # 不解析域名和端口
sudo tcpdump -v # 详细
sudo tcpdump -vv # 更详细
sudo tcpdump -c 100 # 抓取100个包
sudo tcpdump -A # ASCII 显示
sudo tcpdump -X # 十六进制显示
# 保存到文件
sudo tcpdump -w capture.pcap
sudo tcpdump -r capture.pcap # 读取文件
# HTTP 抓包
sudo tcpdump -i eth0 -A -s 0 'port 80 and tcp'
4.4 wireshark/tshark
# tshark - 命令行 wireshark
sudo tshark -i eth0
sudo tshark -i eth0 -f "port 80"
sudo tshark -r capture.pcap
# 过滤
sudo tshark -i eth0 -Y "http.request"
sudo tshark -i eth0 -Y "tcp.port == 80"
五、配置管理与自动化
5.1 Ansible
Ansible 是无代理的配置管理工具:
# 安装
sudo apt install ansible
# 或
pip install ansible
# 配置主机清单
# /etc/ansible/hosts 或 ./inventory
[webservers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
[dbservers]
db1 ansible_host=192.168.1.20
[all:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/deploy_key
Ad-hoc 命令
# 测试连接
ansible all -m ping
# 执行命令
ansible webservers -m shell -a "uptime"
ansible all -m shell -a "df -h"
# 复制文件
ansible webservers -m copy -a "src=./app.conf dest=/etc/app/"
# 安装软件
ansible webservers -m apt -a "name=nginx state=present" --become
# 管理服务
ansible webservers -m service -a "name=nginx state=restarted" --become
Playbook
# deploy.yml
---
- name: Deploy web application
hosts: webservers
become: yes
vars:
app_version: "1.2.0"
tasks:
- name: Install nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Copy nginx config
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: Restart nginx
- name: Deploy application
copy:
src: "{{ app_version }}/dist/"
dest: /var/www/html/
- name: Ensure nginx is running
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
# 运行 Playbook
ansible-playbook deploy.yml
ansible-playbook deploy.yml --check # 检查模式
ansible-playbook deploy.yml --diff # 显示差异
ansible-playbook deploy.yml -l webservers # 限制主机
5.2 Terraform
Terraform 用于基础设施即代码:
# 安装
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
# 基本命令
terraform init # 初始化
terraform plan # 预览变更
terraform apply # 应用变更
terraform destroy # 销毁资源
terraform show # 显示状态
terraform state list # 列出资源
示例配置:
# main.tf
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "web-server"
}
}
六、虚拟化
6.1 KVM/QEMU
# 检查虚拟化支持
egrep -c '(vmx|svm)' /proc/cpuinfo
# 安装
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
# 检查服务
sudo systemctl status libvirtd
# 管理虚拟机(virsh)
virsh list --all # 列出所有 VM
virsh start vm-name # 启动
virsh shutdown vm-name # 关机
virsh destroy vm-name # 强制关机
virsh reboot vm-name # 重启
virsh suspend vm-name # 暂停
virsh resume vm-name # 恢复
virsh undefine vm-name # 删除定义
virsh console vm-name # 控制台
virsh dominfo vm-name # VM 信息
# 快照
virsh snapshot-create-as vm-name snapshot1
virsh snapshot-list vm-name
virsh snapshot-revert vm-name snapshot1
virsh snapshot-delete vm-name snapshot1
6.2 Vagrant
Vagrant 用于管理开发环境虚拟机:
# 安装
# 从 https://www.vagrantup.com/downloads 下载
# 基本命令
vagrant init ubuntu/jammy64 # 初始化
vagrant up # 启动
vagrant ssh # SSH 连接
vagrant halt # 关机
vagrant destroy # 删除
vagrant status # 状态
vagrant reload # 重载配置
# 快照
vagrant snapshot save name
vagrant snapshot restore name
vagrant snapshot list
Vagrantfile 示例:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.hostname = "dev-server"
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end
6.3 VirtualBox
# 命令行管理
VBoxManage list vms # 列出 VM
VBoxManage list runningvms # 运行中的 VM
VBoxManage startvm "VM Name" --type headless # 无头启动
VBoxManage controlvm "VM Name" poweroff # 关机
VBoxManage snapshot "VM Name" take "snapshot1" # 快照
七、其他实用工具
7.1 screen/tmux 进阶
tmux 配置
# ~/.tmux.conf
# 修改前缀键
set -g prefix C-a
unbind C-b
# 鼠标支持
set -g mouse on
# 分屏快捷键
bind | split-window -h
bind - split-window -v
# 窗口编号从1开始
set -g base-index 1
setw -g pane-base-index 1
# 状态栏
set -g status-bg black
set -g status-fg white
set -g status-left '#[fg=green]#S '
set -g status-right '#[fg=yellow]%Y-%m-%d %H:%M'
7.2 jq - JSON 处理
# 安装
sudo apt install jq
# 基本用法
cat data.json | jq .
cat data.json | jq '.name'
cat data.json | jq '.users[0]'
cat data.json | jq '.users | length'
cat data.json | jq '.users[] | .name'
cat data.json | jq '.users | map(.name)'
# 过滤
cat data.json | jq '.users[] | select(.age > 18)'
cat data.json | jq '.users[] | select(.name | contains("John"))'
# 修改
cat data.json | jq '.name = "new name"'
cat data.json | jq '.users += [{"name": "new"}]'
# 紧凑输出
cat data.json | jq -c .
# 原始字符串输出
cat data.json | jq -r '.name'
7.3 yq - YAML 处理
# 安装
sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
# 基本用法
yq '.name' config.yaml
yq '.services.web.image' docker-compose.yml
yq '.services | keys' docker-compose.yml
# 修改
yq -i '.name = "new"' config.yaml
7.4 expect - 自动化交互
#!/usr/bin/expect
spawn ssh user@host
expect "password:"
send "mypassword\r"
expect "$ "
send "uptime\r"
expect "$ "
send "exit\r"
expect eof
7.5 parallel - 并行执行
# 安装
sudo apt install parallel
# 并行执行命令
cat hosts.txt | parallel ssh {} uptime
ls *.jpg | parallel convert {} -resize 50% small_{}
find . -name "*.log" | parallel gzip
# 指定并发数
parallel -j 4 ...
总结
本章介绍的工具虽然使用频率不高,但在特定场景下非常重要:
- Docker/容器:现代应用部署的标准方式
- 性能分析工具:排查性能问题的利器
- 安全工具:保护服务器安全
- 调试工具:定位程序问题
- 配置管理:自动化运维的基础
- 虚拟化:开发测试环境管理
建议:
- Docker 是必须掌握的
- strace 和 tcpdump 排查问题很有用
- fail2ban 生产服务器一定要装
- Ansible 自动化运维必备
下一章将介绍开发环境工具,包括编辑器、版本管理、数据库客户端等。