WSL、Ubuntu、Docker常用命令
·
WSL
📦 安装与初始化
# 安装 WSL(默认 Ubuntu)
wsl --install
# 安装指定发行版
wsl --install -d Ubuntu-24.04
wsl --install -d Debian
wsl --install -d kali-linux
# 查看可安装的发行版
wsl --list --online
wsl -l -o
# 更新 WSL 本体
wsl --update
wsl --update --pre-release # 预发布版本
wsl --update rollback # 回滚更新
# 查看 WSL 版本信息
wsl --version
wsl --status
🖥️ 发行版管理
# 查看已安装发行版
wsl --list
wsl -l
wsl --list --verbose # 含版本和状态
wsl -l -v
# 设置默认发行版
wsl --set-default Ubuntu-24.04
wsl -s Ubuntu-24.04
# 切换发行版的 WSL 版本
wsl --set-version Ubuntu-24.04 2 # 升级到 WSL2
wsl --set-version Ubuntu-24.04 1 # 降级到 WSL1
# 设置新装发行版的默认版本
wsl --set-default-version 2
# 注销(删除)发行版
wsl --unregister Ubuntu-24.04 # 数据会丢失!
# 重命名发行版(通过导入导出实现)
wsl --export Ubuntu-24.04 ubuntu.tar
wsl --import MyUbuntu D:\WSL\MyUbuntu ubuntu.tar
wsl --unregister Ubuntu-24.04
▶️ 启动与关闭
# 启动
wsl # 启动默认发行版
wsl -d Ubuntu-24.04 # 启动指定发行版
wsl -d Ubuntu-24.04 -u root # 以 root 启动
wsl -d Ubuntu-24.04 --cd ~ # 从家目录启动
wsl -d Ubuntu-24.04 --cd /mnt/c/Users # 从指定目录启动
wsl ~ -d Ubuntu-24.04 # 简写:从家目录启动
# 在 WSL 中执行单条命令(执行完退出)
wsl -d Ubuntu-24.04 -- ls -la
wsl -d Ubuntu-24.04 -- python3 script.py
wsl -- echo "hello from WSL"
# 关闭
wsl --terminate Ubuntu-24.04 # 关闭指定发行版
wsl -t Ubuntu-24.04 # 简写
wsl --shutdown # 关闭所有 WSL 实例和虚拟机
📦 导入与导出(备份 / 迁移)
# 导出发行版为 tar 文件
wsl --export Ubuntu-24.04 D:\backup\ubuntu.tar
wsl --export Ubuntu-24.04 D:\backup\ubuntu.tar.gz # 压缩格式(WSL 2.0+)
# 导入发行版
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu D:\backup\ubuntu.tar
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu ubuntu.tar --version 2 # 指定版本
# 导入 VHD 磁盘镜像
wsl --import-in-place Ubuntu-24.04 D:\WSL\ubuntu.vhdx
# 迁移到其他盘(常用!默认装在C盘)
wsl --export Ubuntu-24.04 D:\backup\ubuntu.tar
wsl --unregister Ubuntu-24.04
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu D:\backup\ubuntu.tar --version 2
# 导入后修复默认用户(否则会变成 root)
# 在 WSL 内执行:
ubuntu2404 config --default-user 你的用户名
📁 文件路径互访
# 在 WSL 中访问 Windows 文件
/mnt/c/ # C 盘根目录
/mnt/d/ # D 盘根目录
cd /mnt/c/Users/你的用户名/Desktop
cd /mnt/d/Projects
# 在 Windows 资源管理器中访问 WSL 文件
\\wsl$\Ubuntu-24.04\ # 地址栏输入
\\wsl$\Ubuntu-24.04\home\用户名
\\wsl.localhost\Ubuntu-24.04\ # 新版 Windows 写法
# 在 WSL 中打开 Windows 应用
explorer.exe . # 用资源管理器打开当前目录
explorer.exe /mnt/c/Users # 打开指定目录
notepad.exe 文件名 # 用记事本打开
code . # 用 VS Code 打开(需安装)
cmd.exe /c start . # 另一种打开方式
# 在 Windows PowerShell 中运行 Linux 命令
wsl ls -la
wsl -e bash -c "cat /etc/os-release"
wsl pwd
# 路径转换
wslpath -w /home/user/file # Linux 路径 → Windows 路径
wslpath -u 'C:\Users\user' # Windows 路径 → Linux 路径
wslpath -a 相对路径 # 转为绝对路径
🌐 网络配置
# 查看 WSL 的 IP(WSL 内执行)
ip addr show eth0
hostname -I
# 查看 Windows 主机 IP(WSL 内执行)
cat /etc/resolv.conf | grep nameserver
ip route | grep default | awk '{print $3}'
# 从 WSL 访问 Windows 上的服务
# 使用 Windows 主机 IP(上面查到的)即可
curl http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):8080
# 从 Windows 访问 WSL 中的服务(WSL2)
# 直接用 localhost 即可(WSL2 会自动转发)
http://localhost:8080
# WSL2 端口转发到局域网(PowerShell 管理员)
netsh interface portproxy add v4tov4 `
listenport=8080 listenaddress=0.0.0.0 `
connectport=8080 connectaddress=127.0.0.1
# 查看端口转发规则
netsh interface portproxy show all
# 删除端口转发
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0
⚙️ .wslconfig 全局配置
位置:C:\Users\你的用户名\.wslconfig
[wsl2]
# 资源限制
memory=8GB # 内存上限(默认物理内存的50%)
processors=4 # CPU 核心数
swap=2GB # 交换空间大小
swapFile=D:\\WSL\\swap.vhdx # 自定义 swap 文件位置
# 网络
networkingMode=mirrored # 镜像网络(Win11 推荐)
dnsTunneling=true # DNS 隧道(配合镜像网络)
firewall=true # WSL 防火墙
autoProxy=true # 自动继承 Windows 代理
# 性能
pageReporting=true # 释放未使用内存给 Windows
vmIdleTimeout=60000 # 空闲多少毫秒后关闭虚拟机
# 其他
guiApplications=true # 启用 GUI 应用(WSLg)
debugConsole=false
nestedVirtualization=true # 嵌套虚拟化
[experimental]
autoMemoryReclaim=gradual # 自动回收内存(gradual/dropcache)
sparseVhd=true # 自动压缩 VHD 减少占用
⚙️ wsl.conf 发行版配置
位置:WSL 内 /etc/wsl.conf
[boot]
systemd=true # 启用 systemd(强烈推荐)
command="service docker start" # 启动时执行命令
[automount]
enabled=true # 自动挂载 Windows 盘
root=/mnt/ # 挂载根路径
options="metadata,umask=22,fmask=11" # 挂载选项(修复权限问题)
mountFsTab=true # 挂载 /etc/fstab
[network]
hostname=myWSL # 自定义主机名
generateResolvConf=true # 自动生成 DNS 配置
[user]
default=你的用户名 # 默认登录用户
[interop]
enabled=true # 允许运行 Windows 程序
appendWindowsPath=true # PATH 中包含 Windows 路径
🎮 GPU 与 CUDA 支持
# 前提:Windows 上安装 NVIDIA 驱动(WSL 内不需要装驱动)
# 验证 GPU 是否识别(WSL 内)
nvidia-smi
# 安装 CUDA Toolkit(WSL 内,可选)
# 推荐直接用 pip 安装 PyTorch,无需单独装 CUDA
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
# 验证
python3 -c "import torch; print(torch.cuda.is_available())"
# Docker + GPU(WSL 内)
docker run --gpus all nvidia/cuda:12.0-base nvidia-smi
🖼️ GUI 应用(WSLg)
# Windows 11 / 较新的 Windows 10 已内置 WSLg
# 无需额外配置,直接运行 Linux GUI 程序
# 安装并运行 GUI 应用示例
sudo apt install gedit -y && gedit # 文本编辑器
sudo apt install nautilus -y && nautilus # 文件管理器
sudo apt install x11-apps -y && xclock # 测试 GUI 是否正常
# 查看 WSLg 版本
wsl --version | grep WSLg
# 如果 GUI 不显示,检查 DISPLAY 变量
echo $DISPLAY
export DISPLAY=:0 # 手动设置(一般不需要)
🔄 与 Windows 互操作
# WSL 内调用 Windows 命令
explorer.exe .
notepad.exe
powershell.exe -Command "Get-Date"
cmd.exe /c dir
wslview URL # 用默认浏览器打开(需安装 wslu)
# 安装 wslu 工具集(增强互操作)
sudo apt install wslu -y
wslview https://google.com # 打开浏览器
wslvar USERPROFILE # 获取 Windows 环境变量
wslsys # 查看系统信息
# PowerShell 中操作 WSL
wsl -d Ubuntu-24.04 -- apt update # 执行命令
wsl --export Ubuntu-24.04 backup.tar # 备份
(wsl -d Ubuntu-24.04 -- cat /etc/os-release) # 获取输出
# 共享 SSH 密钥(Windows → WSL)
cp /mnt/c/Users/用户名/.ssh/id_ed25519 ~/.ssh/
chmod 600 ~/.ssh/id_ed25519
🧹 维护与清理
# 收缩 VHD 虚拟磁盘(释放 Windows 磁盘空间)
# 先在 WSL 内清理
sudo apt clean && sudo apt autoremove -y
docker system prune -af # 清理 Docker
# 关闭 WSL 后在 PowerShell(管理员)执行
wsl --shutdown
diskpart
# diskpart 内:
select vdisk file="C:\Users\用户名\AppData\Local\Packages\...\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
# 或使用 WSL 自带命令(较新版本)
wsl --manage Ubuntu-24.04 --set-sparse true # 开启稀疏 VHD(自动收缩)
# 查看 VHD 文件位置
# 通常在:
# C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited...\LocalState\ext4.vhdx
# 重置发行版(慎用!数据会清空)
wsl --unregister Ubuntu-24.04
wsl --install -d Ubuntu-24.04
🚀 常用开发场景
# 用 VS Code 打开 WSL 项目(WSL 内执行)
code . # 需安装 VS Code + Remote WSL 插件
# 设置 Windows Terminal 默认打开 WSL
# 在 Windows Terminal 设置中,将默认配置改为 Ubuntu
# 代理设置(如果 Windows 用了代理)
# 在 .wslconfig 中开启 autoProxy=true
# 或手动设置(WSL 内)
export http_proxy=http://$(ip route | grep default | awk '{print $3}'):7890
export https_proxy=$http_proxy
export all_proxy=socks5://$(ip route | grep default | awk '{print $3}'):7890
# 让代理永久生效
echo 'export http_proxy=http://$(ip route | grep default | awk '"'"'{print $3}'"'"'):7890' >> ~/.bashrc
echo 'export https_proxy=$http_proxy' >> ~/.bashrc
source ~/.bashrc
# 固定 WSL2 的 IP(hosts 方式)
# 在 PowerShell 中获取 WSL IP 并写入 hosts
wsl hostname -I | ForEach-Object { Add-Content C:\Windows\System32\drivers\etc\hosts "$_ wsl.local" }
Ubuntu
📦 软件包管理
# 更新
sudo apt update # 更新包列表
sudo apt upgrade -y # 升级所有包
sudo apt full-upgrade -y # 升级(含依赖变更)
sudo apt update && sudo apt upgrade -y # 一步完成
# 安装 / 卸载
sudo apt install 包名
sudo apt install 包名 -y # 自动确认
sudo apt install 包名=版本号 # 安装指定版本
sudo apt reinstall 包名 # 重新安装
sudo apt remove 包名 # 卸载(保留配置)
sudo apt purge 包名 # 卸载(删配置)
sudo apt autoremove -y # 删除不再需要的依赖
# 查询
apt search 关键词
apt show 包名 # 查看包详情
apt list --installed # 已安装的包
apt list --upgradable # 可升级的包
dpkg -l # 所有已安装包
dpkg -l | grep 包名 # 查找指定包
dpkg -L 包名 # 查看包安装的文件
which 命令名 # 查找命令路径
whereis 命令名 # 查找命令及相关文件
# 清理
sudo apt clean # 清理下载缓存
sudo apt autoclean # 清理旧版本缓存
sudo apt autoremove --purge -y # 彻底清理无用包
📁 文件与目录
# 查看
ls # 列出文件
ls -l # 详细列表
ls -la # 含隐藏文件
ls -lh # 人性化大小
ls -lt # 按时间排序
ls -lS # 按大小排序
ls -R # 递归列出
tree # 树状结构(需安装)
tree -L 2 # 只显示2层
# 切换目录
cd /路径
cd ~ # 家目录
cd - # 上次目录
cd .. # 上一级
pwd # 显示当前路径
# 创建
mkdir 目录名
mkdir -p a/b/c # 递归创建
touch 文件名 # 创建空文件
touch -t 202401011200 文件名 # 指定时间戳
# 复制
cp 源 目标
cp -r 源目录 目标目录 # 递归复制
cp -p 源 目标 # 保留权限和时间戳
cp -a 源 目标 # 完整归档复制
cp -u 源 目标 # 只复制更新的文件
cp -v 源 目标 # 显示进度
# 移动 / 重命名
mv 源 目标
mv -i 源 目标 # 覆盖前确认
mv -n 源 目标 # 不覆盖已有文件
mv -v 源 目标 # 显示操作
# 删除
rm 文件名
rm -r 目录名 # 递归删除
rm -f 文件名 # 强制删除
rm -rf 目录名 # 强制递归删除(慎用!)
rm -i 文件名 # 删除前确认
# 链接
ln -s 源 软链接名 # 创建软链接
ln 源 硬链接名 # 创建硬链接
readlink -f 软链接 # 查看链接指向
🔍 文件查找与搜索
# find 查找文件
find / -name "文件名" # 全盘查找
find . -name "*.py" # 当前目录找 py 文件
find . -type f # 只找文件
find . -type d # 只找目录
find . -size +100M # 大于100MB
find . -size -1k # 小于1KB
find . -mtime -7 # 7天内修改
find . -newer 参考文件 # 比某文件新
find . -name "*.log" -delete # 找到并删除
find . -name "*.py" -exec wc -l {} \; # 找到并执行命令
find . -perm 755 # 按权限查找
find . -user 用户名 # 按用户查找
# grep 搜索内容
grep "关键词" 文件名
grep -r "关键词" 目录 # 递归搜索
grep -i "关键词" 文件 # 忽略大小写
grep -n "关键词" 文件 # 显示行号
grep -v "关键词" 文件 # 反向匹配(不含)
grep -l "关键词" *.txt # 只显示文件名
grep -c "关键词" 文件 # 统计匹配行数
grep -A 3 "关键词" 文件 # 显示匹配后3行
grep -B 3 "关键词" 文件 # 显示匹配前3行
grep -E "正则表达式" 文件 # 扩展正则
grep --include="*.py" -r "关键词" . # 只搜索指定类型
# locate(更快,基于索引)
sudo updatedb # 更新索引
locate 文件名
locate -i 文件名 # 忽略大小写
📄 文件查看与编辑
# 查看内容
cat 文件名 # 全部输出
cat -n 文件名 # 显示行号
cat -A 文件名 # 显示特殊字符
less 文件名 # 分页查看(q退出)
more 文件名 # 分页查看
head 文件名 # 前10行
head -n 20 文件名 # 前20行
tail 文件名 # 后10行
tail -n 20 文件名 # 后20行
tail -f 文件名 # 实时追踪(看日志)
tail -f -n 100 文件名 # 实时追踪后100行
# 文件比较
diff 文件1 文件2
diff -u 文件1 文件2 # unified 格式
diff -r 目录1 目录2 # 比较目录
# 文本处理
wc 文件名 # 统计行/字/字节
wc -l 文件名 # 只统计行数
wc -w 文件名 # 只统计字数
sort 文件名 # 排序
sort -r 文件名 # 逆序
sort -n 文件名 # 按数值排序
sort -k 2 文件名 # 按第2列排序
sort -u 文件名 # 排序并去重
uniq 文件名 # 去除连续重复行
uniq -c 文件名 # 统计重复次数
cut -d ',' -f 1 文件名 # 按分隔符取列
awk '{print $1}' 文件名 # 取第1列
sed 's/旧/新/g' 文件名 # 替换内容
sed -i 's/旧/新/g' 文件名 # 原地替换
tr 'a-z' 'A-Z' < 文件名 # 转换大小写
# 编辑器
nano 文件名 # 新手友好
# Ctrl+O 保存 Ctrl+X 退出 Ctrl+K 剪切行
vim 文件名
# i 插入 Esc 退出编辑 :wq 保存退出 :q! 强制退出
# dd 删除行 yy 复制行 p 粘贴 /关键词 搜索
🔐 权限管理
# chmod 修改权限
chmod 755 文件名 # rwxr-xr-x
chmod 644 文件名 # rw-r--r--
chmod +x 文件名 # 添加执行权限
chmod -x 文件名 # 移除执行权限
chmod -R 755 目录 # 递归修改
chmod u+x 文件名 # 只给所有者加执行
chmod go-w 文件名 # 组和其他人移除写权限
# chown 修改所有者
chown 用户名 文件名
chown 用户名:组名 文件名
chown -R 用户名:组名 目录 # 递归修改
chgrp 组名 文件名 # 只改组
# 查看权限
ls -l 文件名
stat 文件名 # 详细权限和时间信息
getfacl 文件名 # ACL 权限
# sudo 相关
sudo 命令 # 以管理员执行
sudo -i # 切换到 root shell
sudo -u 用户名 命令 # 以指定用户执行
sudo -l # 查看当前用户 sudo 权限
visudo # 安全编辑 sudoers
👤 用户与组管理
# 用户操作
sudo adduser 用户名 # 创建用户(交互式)
sudo useradd -m -s /bin/bash 用户名 # 创建用户(非交互式)
sudo userdel 用户名 # 删除用户
sudo userdel -r 用户名 # 删除用户及家目录
sudo usermod -aG sudo 用户名 # 加入 sudo 组
sudo usermod -aG docker 用户名 # 加入 docker 组
sudo usermod -l 新名 旧名 # 改用户名
sudo usermod -d /新路径 用户名 # 改家目录
sudo usermod -s /bin/zsh 用户名 # 改默认 shell
# 密码
passwd # 修改当前用户密码
sudo passwd 用户名 # 修改指定用户密码
sudo passwd -l 用户名 # 锁定账户
sudo passwd -u 用户名 # 解锁账户
# 组操作
sudo groupadd 组名
sudo groupdel 组名
sudo gpasswd -a 用户名 组名 # 加入组
sudo gpasswd -d 用户名 组名 # 移出组
groups 用户名 # 查看用户所属组
# 查看
whoami # 当前用户
id # 当前用户 UID/GID
id 用户名 # 指定用户信息
who # 登录用户
w # 登录用户及活动
last # 登录历史
cat /etc/passwd # 所有用户
cat /etc/group # 所有组
# 切换
su 用户名 # 切换用户
su - 用户名 # 切换并加载环境
⚙️ 进程管理
# 查看进程
ps aux # 所有进程详情
ps aux | grep 进程名 # 查找指定进程
ps -ef # 完整格式
pstree # 树状显示
pgrep 进程名 # 查找进程 PID
pgrep -u 用户名 # 指定用户的进程
# 实时监控
top
top -u 用户名 # 指定用户
top -p PID # 指定进程
htop # 更好用(需安装)
# 结束进程
kill PID
kill -9 PID # 强制结束(SIGKILL)
kill -15 PID # 优雅结束(SIGTERM)
killall 进程名 # 按名称结束
killall -9 进程名
pkill 进程名 # 按名称结束(支持正则)
pkill -u 用户名 # 结束指定用户进程
# 后台与任务
命令 & # 后台运行
Ctrl + Z # 挂起当前进程
jobs # 查看后台任务
fg %1 # 调回前台
bg %1 # 后台继续运行
disown %1 # 从 jobs 中移除(不挂断)
nohup 命令 & # 断开 SSH 后继续运行
nohup 命令 > output.log 2>&1 & # 同时记录日志
# 进程优先级
nice -n 10 命令 # 以低优先级启动
renice -n 5 -p PID # 修改运行中进程优先级
💻 系统信息
# 系统版本
uname -a # 内核信息
uname -r # 内核版本
lsb_release -a # 发行版信息
cat /etc/os-release
# CPU
lscpu # CPU 详细信息
nproc # CPU 核心数
cat /proc/cpuinfo
# 内存
free -h # 内存使用
vmstat # 虚拟内存统计
vmstat -s # 内存统计摘要
cat /proc/meminfo
# GPU
nvidia-smi # GPU 状态(需驱动)
nvidia-smi -l 1 # 每秒刷新
nvidia-smi --query-gpu=name,memory.used,memory.free --format=csv
# 运行时间 / 负载
uptime
uptime -p # 人性化显示
w # 负载 + 登录用户
# 硬件
lshw # 所有硬件信息
lshw -short # 简要
lspci # PCI 设备(显卡/网卡)
lspci -v # 详细
lsusb # USB 设备
dmidecode -t memory # 内存硬件信息
💾 磁盘与存储
# 使用情况
df -h # 各分区使用率
df -hT # 含文件系统类型
df -i # inode 使用情况
du -sh 目录名 # 目录总大小
du -sh * # 当前目录各项大小
du -sh * | sort -rh # 按大小排序
du -ah --max-depth=1 目录 # 限制深度
# 分区信息
lsblk # 块设备列表
lsblk -f # 含文件系统信息
sudo fdisk -l # 分区详情
sudo blkid # 设备 UUID
# 挂载
sudo mount /dev/sdb1 /mnt/disk
sudo mount -t ntfs /dev/sdb1 /mnt # 指定文件系统
sudo umount /mnt/disk
sudo umount -l /mnt/disk # 强制卸载(懒卸载)
cat /etc/fstab # 开机自动挂载配置
# 磁盘健康
sudo smartctl -a /dev/sda # SMART 信息(需安装)
sudo badblocks -v /dev/sdb # 坏块检测
🌐 网络
# IP 与接口
ip addr # 查看所有接口 IP
ip addr show eth0 # 指定接口
hostname -I # 只显示 IP
ip link show # 网络接口状态
ip link set eth0 up/down # 启用/禁用接口
# 路由
ip route # 路由表
ip route add default via 192.168.1.1 # 添加默认路由
# 连通性测试
ping google.com
ping -c 4 google.com # 只 ping 4次
ping -i 0.5 google.com # 间隔0.5秒
traceroute google.com # 路由追踪
mtr google.com # 实时路由追踪
# 端口与连接
ss -tulnp # 监听端口
ss -tulnp | grep :80 # 查找指定端口
ss -antp # 所有 TCP 连接
netstat -tulnp # 同上(需装 net-tools)
lsof -i :8080 # 占用端口的进程
lsof -i -n -P # 所有网络连接
# 下载
wget URL
wget -O 文件名 URL # 保存为指定文件名
wget -c URL # 断点续传
wget -b URL # 后台下载
curl -O URL # 下载文件
curl -L URL # 跟随重定向
curl -u 用户:密码 URL # 带认证
curl -X POST -d '{}' URL # POST 请求
curl -H "Content-Type: application/json" URL
# SSH
ssh 用户@IP
ssh -p 2222 用户@IP # 指定端口
ssh -i 密钥文件 用户@IP # 指定密钥
ssh -L 本地端口:目标IP:目标端口 用户@跳板机 # 本地端口转发
# SCP 传输
scp 文件 用户@IP:/路径 # 上传
scp 用户@IP:/路径 本地 # 下载
scp -r 目录 用户@IP:/路径 # 递归上传
scp -P 2222 文件 用户@IP:/路径 # 指定端口
# DNS
cat /etc/resolv.conf # DNS 配置
nslookup 域名 # DNS 查询
dig 域名 # 详细 DNS 查询
dig +short 域名 # 只显示 IP
# 防火墙(ufw)
sudo ufw status # 查看状态
sudo ufw status verbose # 详细状态
sudo ufw enable / disable
sudo ufw allow 22 # 开放端口
sudo ufw allow 80/tcp
sudo ufw deny 3306
sudo ufw allow from 192.168.1.0/24 # 允许指定网段
sudo ufw delete allow 80 # 删除规则
sudo ufw reset # 重置所有规则
🔧 服务管理(systemd)
# 服务操作
sudo systemctl start 服务名
sudo systemctl stop 服务名
sudo systemctl restart 服务名
sudo systemctl reload 服务名 # 重新加载配置(不重启)
sudo systemctl status 服务名
# 开机自启
sudo systemctl enable 服务名
sudo systemctl disable 服务名
sudo systemctl enable --now 服务名 # 启用并立即启动
sudo systemctl is-enabled 服务名 # 查看是否自启
# 查看服务
systemctl list-units --type=service
systemctl list-units --type=service --state=running # 运行中
systemctl list-unit-files --type=service # 所有服务文件
# 日志(journalctl)
journalctl -u 服务名 # 指定服务日志
journalctl -u 服务名 -f # 实时追踪
journalctl -u 服务名 -n 100 # 最后100行
journalctl -b # 本次启动日志
journalctl -b -1 # 上次启动日志
journalctl --since "1 hour ago"
journalctl -p err # 只看错误
journalctl -xe # 详细错误日志
🗜️ 压缩与解压
# tar.gz
tar -czvf 压缩包.tar.gz 目录/文件 # 压缩
tar -xzvf 压缩包.tar.gz # 解压到当前目录
tar -xzvf 压缩包.tar.gz -C /路径 # 解压到指定目录
tar -tzvf 压缩包.tar.gz # 查看内容(不解压)
# tar.xz(压缩率更高)
tar -cJvf 压缩包.tar.xz 目录
tar -xJvf 压缩包.tar.xz
# tar.bz2
tar -cjvf 压缩包.tar.bz2 目录
tar -xjvf 压缩包.tar.bz2
# zip
zip -r 压缩包.zip 目录
zip -r 压缩包.zip 目录 -x "*.pyc" # 排除文件
unzip 压缩包.zip
unzip 压缩包.zip -d /路径 # 解压到指定目录
unzip -l 压缩包.zip # 查看内容
# gzip(单文件)
gzip 文件名 # 压缩(原文件消失)
gzip -k 文件名 # 保留原文件
gunzip 文件名.gz
🌍 环境变量
# 查看
env # 所有环境变量
printenv PATH # 指定变量
echo $PATH
echo $HOME
echo $USER
echo $SHELL
# 临时设置(当前会话有效)
export 变量名=值
export PATH=$PATH:/新路径
# 永久设置
# 当前用户
echo 'export PATH=$PATH:/新路径' >> ~/.bashrc
echo 'export PATH=$PATH:/新路径' >> ~/.profile
source ~/.bashrc # 立即生效
# 所有用户
sudo nano /etc/environment # 系统级
sudo nano /etc/profile.d/myenv.sh # 脚本方式
# 取消变量
unset 变量名
⏰ 定时任务
# crontab
crontab -e # 编辑当前用户定时任务
crontab -l # 查看当前用户任务
crontab -r # 删除所有任务
sudo crontab -u 用户名 -e # 编辑指定用户
# 格式:分 时 日 月 周 命令
# * * * * * 命令
# 0 2 * * * 每天凌晨2点
# */5 * * * * 每5分钟
# 0 9 * * 1 每周一9点
# 系统定时任务目录
/etc/cron.daily/ # 每天执行
/etc/cron.weekly/ # 每周执行
/etc/cron.monthly/ # 每月执行
🖥️ 终端多窗口(tmux / screen)
# tmux(推荐)
tmux # 启动
tmux new -s 会话名 # 创建命名会话
tmux ls # 列出会话
tmux attach -t 会话名 # 重新连接
tmux kill-session -t 会话名 # 删除会话
# tmux 快捷键(前缀键 Ctrl+B)
Ctrl+B c # 新建窗口
Ctrl+B n / p # 下/上一个窗口
Ctrl+B % # 左右分屏
Ctrl+B " # 上下分屏
Ctrl+B 方向键 # 切换面板
Ctrl+B d # 分离会话(后台保留)
Ctrl+B [ # 进入滚动模式(q退出)
# screen
screen # 启动
screen -S 会话名 # 创建命名会话
screen -ls # 列出会话
screen -r 会话名 # 重新连接
Ctrl+A d # 分离会话
🔑 SSH 密钥管理
# 生成密钥对
ssh-keygen -t ed25519 -C "备注" # 推荐(ed25519)
ssh-keygen -t rsa -b 4096 -C "备注" # RSA 4096
# 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户@IP
ssh-copy-id -p 2222 用户@IP
# 配置文件(~/.ssh/config)
Host myserver
HostName 192.168.1.100
User ubuntu
Port 2222
IdentityFile ~/.ssh/id_ed25519
# 之后直接 ssh myserver 即可
# SSH Agent
eval "$(ssh-agent -s)" # 启动 agent
ssh-add ~/.ssh/id_ed25519 # 添加密钥
ssh-add -l # 查看已加载密钥
📊 系统日志
# 主要日志文件
/var/log/syslog # 系统日志
/var/log/auth.log # 认证日志(登录/sudo)
/var/log/kern.log # 内核日志
/var/log/dpkg.log # 包安装日志
/var/log/apt/history.log # apt 操作历史
/var/log/nginx/ # Nginx 日志
/var/log/mysql/ # MySQL 日志
# 查看日志
sudo tail -f /var/log/syslog
sudo grep "error" /var/log/syslog
sudo journalctl -xe # 系统错误日志
sudo dmesg # 内核环形缓冲区
sudo dmesg | tail -50
sudo dmesg | grep -i error
Docker
🖥️ 容器生命周期
# 创建并启动
docker run -it --rm --name 容器名 镜像名 bash
-i / -t / -it # 交互式终端
-d # 后台运行
--rm # 退出后自动删除
--name 容器名 # 指定名称
--restart unless-stopped # 重启策略(no/always/on-failure/unless-stopped)
--entrypoint bash # 覆盖默认入口
# 启动 / 停止 / 重启
docker start 容器名
docker stop 容器名
docker stop -t 30 容器名 # 等待30秒后强制停止
docker restart 容器名
docker kill 容器名 # 强制停止
docker kill -s SIGTERM 容器名 # 发送指定信号
# 暂停 / 恢复
docker pause 容器名
docker unpause 容器名
# 删除
docker rm 容器名
docker rm -f 容器名 # 强制删除运行中的容器
docker rm -v 容器名 # 同时删除关联匿名卷
docker container prune -f # 清理所有停止的容器
🔍 容器查看与监控
# 列出容器
docker ps # 运行中
docker ps -a # 所有
docker ps -q # 只显示 ID
docker ps -s # 显示占用大小
docker ps --filter status=exited # 按状态过滤
docker ps --filter name=myapp # 按名称过滤
docker ps --filter ancestor=nginx # 按镜像过滤
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" # 自定义格式
# 日志
docker logs 容器名
docker logs -f 容器名 # 实时追踪
docker logs -t 容器名 # 显示时间戳
docker logs --tail 100 容器名 # 最后100行
docker logs --since 30m 容器名 # 最近30分钟
docker logs --since 2024-01-01 --until 2024-01-02 容器名
# 资源监控
docker stats # 所有容器实时资源
docker stats 容器名 # 指定容器
docker stats --no-stream # 只显示一次(不刷新)
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 详细信息
docker inspect 容器名
docker inspect -f '{{.State.Status}}' 容器名 # 运行状态
docker inspect -f '{{.NetworkSettings.IPAddress}}' 容器名 # IP地址
docker inspect -f '{{json .HostConfig.Binds}}' 容器名 # 挂载信息
docker inspect -f '{{json .Config.Env}}' 容器名 # 环境变量
# 进程 / 变更
docker top 容器名 # 查看容器内进程
docker diff 容器名 # 查看文件系统变更
⚙️ 容器交互与操作
# 进入运行中的容器
docker exec -it 容器名 bash
docker exec -it -u root 容器名 bash # 以 root 进入
docker exec -w /workspace 容器名 bash # 指定工作目录
docker exec -e DEBUG=1 容器名 python app.py # 传入环境变量
docker exec -d 容器名 命令 # 后台执行
# 文件传输
docker cp 本地文件 容器名:/容器路径 # 宿主机 → 容器
docker cp 容器名:/容器路径 本地路径 # 容器 → 宿主机
docker cp -a 容器名:/logs/ ./backup/ # 保留权限和时间戳
# 提交容器为镜像(快照)
docker commit 容器名 新镜像名:tag
docker commit -m "说明" -a "作者" 容器名 镜像名:tag
🗂️ 资源限制
docker run \
--memory=4g # 内存上限
--memory-swap=8g # 内存+swap 总上限
--cpus=2 # CPU 核数
--cpu-shares=512 # CPU 相对权重(默认1024)
--shm-size=2g # 共享内存(PyTorch 多进程必备)
--ulimit nofile=65535 # 文件描述符限制
镜像名
🖼️ 镜像管理
# 拉取
docker pull ubuntu:22.04
docker pull --platform linux/arm64 镜像名 # 指定平台
docker pull -a 镜像名 # 拉取所有 tag
# 查看
docker images
docker images -a # 含中间层
docker images -q # 只显示 ID
docker images --filter dangling=true # 悬空镜像
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 删除
docker rmi 镜像名:tag
docker rmi -f 镜像名 # 强制删除
docker image prune # 删除悬空镜像
docker image prune -a -f # 删除所有未使用镜像
# 标签
docker tag 源镜像:tag 新镜像名:tag
# 详情
docker inspect 镜像名
docker history 镜像名 # 查看镜像层历史
docker history --no-trunc 镜像名 # 完整显示
🔨 镜像构建
docker build -t 镜像名:tag .
-f Dockerfile路径 # 指定 Dockerfile
--no-cache # 不使用缓存
--pull # 始终拉取最新基础镜像
--build-arg KEY=VALUE # 传入构建参数
--target 阶段名 # 多阶段构建指定目标
--platform linux/amd64 # 跨架构构建
--progress plain # 显示详细日志
--squash # 合并所有层(减小体积)
--label key=value # 添加镜像标签
-q # 安静模式
# 常用组合
docker build -t myapp:v1 .
docker build -t myapp:v1 -f docker/Dockerfile --no-cache .
docker build --target builder --build-arg ENV=prod -t myapp .
📦 镜像导入导出
# 镜像存档(含完整历史层,用于迁移)
docker save -o 镜像.tar 镜像名:tag
docker save 镜像名 | gzip > 镜像.tar.gz # 压缩保存
docker load -i 镜像.tar
docker load < 镜像.tar.gz
# 容器文件系统导出(不含历史层,体积更小)
docker export -o 容器快照.tar 容器名
docker import 容器快照.tar 新镜像名:tag
docker import -c "CMD bash" 容器快照.tar 新镜像名 # 指定启动命令
🌐 网络管理
# 运行时网络设置
docker run \
--network bridge # 指定网络
--network host # 使用宿主机网络
-p 8080:80 # 端口映射
-p 127.0.0.1:8080:80 # 绑定本地 IP
-P # 随机映射所有暴露端口
--hostname myhost # 设置 hostname
--ip 172.18.0.10 # 指定容器 IP
--add-host db:1.2.3.4 # 添加 hosts 记录
--dns 8.8.8.8 # 指定 DNS
镜像名
# 网络管理
docker network ls
docker network create 网络名
docker network create -d bridge 网络名
docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 网络名
docker network inspect 网络名
docker network connect --ip 172.20.0.10 网络名 容器名
docker network connect --alias db 网络名 容器名 # 添加别名
docker network disconnect 网络名 容器名
docker network rm 网络名
docker network prune -f # 清理未使用网络
💾 数据卷管理
# 运行时挂载
docker run \
-v /宿主机路径:/容器路径 # bind mount
-v 卷名:/容器路径 # named volume
-v /容器路径 # 匿名 volume
--mount type=bind,source=$(pwd),target=/app # 显式写法
--volumes-from 其他容器名 # 共享其他容器的卷
镜像名
# 卷管理
docker volume create 卷名
docker volume create -d local 卷名
docker volume ls
docker volume ls -f dangling=true # 未挂载的卷
docker volume inspect 卷名
docker volume rm 卷名
docker volume prune -f # 清理未使用卷
🔑 权限与用户
docker run \
-u 用户名 # 指定运行用户
-u 1000:1000 # UID:GID
--privileged # 特权模式(慎用)
--cap-add SYS_PTRACE # 添加 capability
--cap-drop ALL # 删除所有 capability
--security-opt no-new-privileges # 禁止提权
--read-only # 只读文件系统
镜像名
🎮 GPU 支持
# 安装 nvidia-container-toolkit 后
docker run \
--gpus all # 使用所有 GPU
--gpus 1 # 使用1块 GPU
--gpus '"device=0,1"' # 指定编号
--gpus '"device=GPU-uuid"' # 指定 UUID
--shm-size=2g # 共享内存(多进程训练必备)
镜像名
# 验证
docker run --gpus all nvidia/cuda:12.0-base nvidia-smi
🐙 Docker Compose
# 启动
docker compose up -d
docker compose up --build # 重新构建后启动
docker compose up --force-recreate # 强制重建容器
docker compose up --scale web=3 # 扩容
docker compose up 服务名 # 只启动指定服务
docker compose -f docker-compose.prod.yml up -d # 指定文件
docker compose -p 项目名 up -d # 指定项目名
# 停止
docker compose down
docker compose down -v # 同时删除 volume
docker compose down --rmi all # 同时删除镜像
docker compose down --remove-orphans # 删除孤立容器
# 查看
docker compose ps
docker compose ps -a
docker compose logs -f
docker compose logs -f --tail=50 服务名
docker compose top # 查看进程
docker compose config # 验证配置
# 操作
docker compose exec -it 服务名 bash
docker compose exec -u root 服务名 bash
docker compose restart 服务名
docker compose pull 服务名
docker compose build --no-cache 服务名
🏭 镜像仓库
# 登录 / 登出
docker login
docker login registry.example.com -u 用户名
docker logout
# 推送 / 拉取
docker push 镜像名:tag
docker push -a 镜像名 # 推送所有 tag
docker pull 镜像名:tag
# 搜索
docker search nginx
docker search --filter stars=100 nginx # 按星数过滤
docker search --limit 5 nginx
🧹 系统清理
# 查看占用
docker system df # 汇总
docker system df -v # 详细
# 清理(由小到大)
docker container prune -f # 停止的容器
docker image prune -f # 悬空镜像
docker image prune -a -f # 所有未使用镜像
docker volume prune -f # 未使用卷
docker network prune -f # 未使用网络
docker system prune -a --volumes -f # 全部清理(慎用)
# 按条件清理
docker image prune --filter "until=24h" # 24小时前的镜像
docker container prune --filter "until=24h"
docker image prune --filter "label=env=dev"
更多推荐
所有评论(0)