2025年1月

1. Nginx 简介

Nginx 是一个高性能、轻量级的 HTTP 服务器和反向代理服务器,常用于静态文件服务、负载均衡、反向代理、SSL/TLS 加密等场景。它支持高并发,具有模块化设计和灵活的配置。


2. 通过 Docker-Compose 启动 Nginx

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/logs:/var/log/nginx:rw
      - ./nginx/cert:/etc/nginx/cert:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:rw
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

3. Nginx 配置详解

主配置文件(nginx.conf)

# 全局配置
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 日志配置
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;


    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # 压缩与缓存
    gzip on;
    gzip_types text/plain application/json;

    # 包含子配置文件
    include /etc/nginx/conf.d/*.conf;
}

子配置文件(conf.d/*.conf)

http {
    server {
        listen 443 ssl;
            server_name _;
    }

    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    location / {
        proxy_pass http://backend;
    }
}
# Stream 转发(TCP/UDP)
stream {
    upstream db_backend {
        server db1.example.com:3306;
        server db2.example.com:3306;
    }

    server {
        listen 3306;
        proxy_pass db_backend;
    }
}

常见的HTTP模块配置

# 传递请求头和用户信息
proxy_set_header Host $host;  # 保留原始 Host 请求头
proxy_set_header X-Real-IP $remote_addr;  # 保留客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 保留转发链
proxy_set_header X-Forwarded-Proto $scheme;  # 保留请求协议 (http/https)

# 支持 WebSocket 等长连接
proxy_http_version 1.1;  # 使用 HTTP/1.1 支持长连接
proxy_set_header Upgrade $http_upgrade;  # 支持 WebSocket 升级
proxy_set_header Connection "upgrade";  # 保持长连接

# 配置传递下划线 Header
underscores_in_headers on;  # 允许传递下划线头部

# 增加连接和读写超时 (HTTP CODE 504)
proxy_connect_timeout 120s;  # 设置连接超时
proxy_read_timeout 120s;     # 设置读取超时
proxy_send_timeout 120s;     # 设置发送超时

client_max_body_size 1m;  # 限制客户端请求体最大为 1MB (HTTP CODE 413)

# 增加缓冲区大小
proxy_buffer_size 128k;  # 设置初始缓冲区大小
proxy_buffers 4 256k;  # 设置缓冲区数量和大小
proxy_busy_buffers_size 256k;  # 设置繁忙时的缓冲区大小

动态限流

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
    server {
        location /api/ {
            limit_req zone=api_limit burst=10 nodelay;
            proxy_pass http://backend_service;
        }
    }
}

HTTP301/HTTPS配置示例

server {
    listen       80;
    server_name  _;
    server_tokens off; # 关闭版本信息返回
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name example.com;

    # 指定 SSL 证书和密钥路径
    ssl_certificate     /etc/nginx/cert/example.crt;
    ssl_certificate_key /etc/nginx/cert/example.key;

    # SSL 会话和协议配置
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols       TLSv1.2 TLSv1.3;

    # 加密套件和优先级配置
    ssl_ciphers         'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4';
    ssl_prefer_server_ciphers on;

    # 启用 HSTS(仅在 HTTPS 完全启用后使用)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}

在 Nginx 配置中,location 块用于定义 URL 路径和请求的匹配规则。以下是一些常见的 location 配置示例,包括重写、正则匹配和静态资源配置。

Location 配置示例

1. 基本重定向配置

# 将所有 http 请求重定向到 https
server {
    listen 80;
    server_name example.com;
    
    location / {
        return 301 https://$host$request_uri;
    }
}

用途:将所有 HTTP 请求重定向到 HTTPS。

2. 静态文件服务配置

server {
    listen 80;
    server_name example.com;

    # 为所有以 /static/ 开头的请求提供静态文件
    location /static/ {
        root /var/www/html;  # 静态文件目录
        try_files $uri $uri/ =404;  # 尝试查找文件,不存在返回 404
    }
}

用途:为特定路径(如 /static/)提供静态资源服务。

3. 正则匹配和动态路由

server {
    listen 80;
    server_name example.com;

    # 匹配以 /user/ 开头且后面跟着数字的请求
    location ~ ^/user/(\d+)$ {
        # 捕获正则匹配的数字并通过变量传递
        set $user_id $1;
        # 转发请求到后端服务器
        proxy_pass http://backend_servers/$user_id;
    }
}

用途:使用正则表达式匹配路径并将捕获的内容传递到后端。比如 /user/123 会被转发到 http://backend_servers/123

4. 禁止访问某些文件类型

server {
    listen 80;
    server_name example.com;

    # 禁止访问 .bak 文件
    location ~* \.bak$ {
        deny all;  # 拒绝所有访问
    }
}

用途:禁止访问特定类型的文件,如 .bak 文件。

5. 静态文件 + 动态请求

server {
    listen 80;
    server_name example.com;

    # 提供静态文件
    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.html;  # 尝试找到文件,找不到时返回 index.html
    }

    # 处理 PHP 请求(假设 Nginx 已配置 PHP-FPM)
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }
}

用途:同时提供静态文件服务和处理动态请求(如 PHP)。

6. 使用正则匹配重写 URL

server {
    listen 80;
    server_name example.com;

    # 将 /product/123 重写为 /product?id=123
    location ~ ^/product/(\d+)$ {
        rewrite ^/product/(\d+)$ /product?id=$1 last;
    }
}

用途:使用正则表达式匹配 URL 并进行重写,将 /product/123 重写为 /product?id=123

7. 使用 try_files 优雅处理 404

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.php?$query_string;  # 尝试静态文件,如果不存在则转到 PHP 处理
    }
}

用途try_files 用来优雅地处理文件不存在的情况,如果文件不存在,则转发给 PHP 或其他处理程序。

8. 根据请求类型返回不同响应

server {
    listen 80;
    server_name example.com;

    # 只允许 GET 和 POST 请求
    location /api/ {
        if ($request_method !~ ^(GET|POST)$) {
            return 405;  # 其他方法返回 405 Method Not Allowed
        }
    }
}

用途:根据请求方法返回不同的响应,例如只允许 GETPOST 请求。

9. 缓存配置

server {
    listen 80;
    server_name example.com;

    # 缓存图片文件
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        expires 30d;  # 设置缓存过期时间为 30 天
        add_header Cache-Control "public";
    }
}

用途:为特定类型的静态文件设置缓存头部,指定缓存时间。

10. 转发到不同的后端

server {
    listen 80;
    server_name example.com;

    # 转发到后端1
    location /api/v1/ {
        proxy_pass http://backend_v1;
    }

    # 转发到后端2
    location /api/v2/ {
        proxy_pass http://backend_v2;
    }
}

用途:根据路径前缀将请求转发到不同的后端服务器。


总结:

  • 静态资源location /static/ {} 用于服务静态文件。
  • 重写规则location ~ ^/old/ { rewrite /new; } 用于 URL 重写。
  • 正则匹配location ~ 用于路径的正则匹配和处理。
  • 请求过滤location /api/ { if ... } 用于限制请求类型或 IP。
  • 反向代理location /api/ { proxy_pass ... } 用于请求转发到后端服务器。

这些配置可以灵活地结合使用,以满足不同的请求路由、重定向、反向代理、缓存等需求。

常见 Linux 命令详细解释

以下是常见 Linux 命令及其参数的详细解释,按照使用频率排序,并附带了使用示例。

1. scp(安全复制)

scp(Secure Copy Protocol)用于在本地和远程主机之间进行加密传输文件。它基于 SSH 协议,因此数据传输过程中是安全的,适合在不安全的网络中传输敏感文件。

语法

scp [选项] 源文件 目标文件

常用选项

  • -r:递归复制整个目录。使用时,源文件应为目录。
  • -P:指定远程主机的端口号(注意是大写 P)。例如,远程主机使用 2222 端口时,使用 -P 2222
  • -i:指定用于身份验证的私钥文件。例如,-i /path/to/private_key
  • -v:启用详细模式,显示 SCP 执行过程的详细信息。
  • -C:启用压缩,在传输大量数据时有助于提高传输效率。
  • -q:启用静默模式,不显示任何输出。
  • -l:限制传输的带宽,单位为 Kbit/s。例如,-l 500 限制带宽为 500 Kbit/s。
  • -B:禁止启用密码验证,强制使用密钥认证。
  • -o:传递 SSH 配置选项,如 -o StrictHostKeyChecking=no 可以跳过 SSH 主机密钥检查。

示例

scp -v -P 2222 -l 500 -i ~/.ssh/id_rsa -r ./myfolder deployer@127.0.0.1:/data

使用 -l 选项限制传输带宽为 500 Kbit/s。

注意事项

  • 权限问题:如果目标路径的权限不足,可以通过 sudo 来提升权限,但是需要确保自己有远程 sudo 权限。
  • 密钥认证:使用 -i 选项时,确保私钥文件的权限是 600,否则 SSH 会拒绝使用该密钥进行连接。

2. sshpass(自动输入密码的 SSH)

sshpass -p "password" ssh -o StrictHostKeyChecking=no root@127.0.0.1 sh /data/custom.sh

使用 sshpass 自动输入密码,登录并执行远程脚本。


3. ssh(连接服务器/开启隧道-端口转发)

常用选项:

  • -L:本地端口转发。
  • -i:指定私钥文件。
ssh -L 0:3307:remote_ip:3306 user@host

通过 SSH 创建本地端口转发。


4. vim(文本编辑器)

vim 是 Linux 系统中功能强大的文本编辑器,广泛用于文件编辑、编程和系统管理。其分为三种模式:

  1. 普通模式:启动后默认进入普通模式,执行导航、删除、复制等操作。
  2. 插入模式:用于文本输入,按 i 进入,按 Esc 退出。
  3. 命令行模式:执行保存、退出、查找替换等命令,按 : 进入。

插入模式

  • i:在当前光标前插入。
  • a:在当前光标后插入。
  • o:在当前行下方新建一行并进入插入模式。

保存和退出

  • :w:保存文件。
  • :q:退出 Vim。
  • :wqZZ:保存并退出。
  • :q!:强制退出(不保存修改)。
  • :x:保存并退出(等价于 :wq)。

文本操作

  1. 复制、粘贴

    • yy:复制当前行。
    • nyy:复制当前行及其后 n 行。
    • p:在光标后粘贴。
    • P:在光标前粘贴。
  2. 删除

    • dd:删除当前行。
    • ndd:删除当前行及其后 n 行。
    • x:删除光标所在的字符。
  3. 撤销和重做

    • u:撤销上一步操作。
    • Ctrl + r:重做上一步撤销。
  4. 查找

    • /pattern:向下查找 pattern
    • ?pattern:向上查找 pattern
    • n:重复上一次查找(同方向)。
    • N:反向重复上一次查找。
  5. 替换

    • :%s/old/new/g:将文件中所有的 old 替换为 new
    • :n,m s/old/new/g:将第 n 到第 m 行的 old 替换为 new
    • :%s/old/new/gc:替换时逐个确认。

窗口操作

  1. 分屏

    • :split:sp:水平分屏。
    • :vsplit:vsp:垂直分屏。
    • Ctrl + w + w:在分屏间切换。
    • Ctrl + w + h/j/k/l:移动到左/下/上/右的窗口。
  2. 关闭窗口

    • :q:关闭当前窗口。
    • :only:关闭其他窗口,保留当前窗口。

代码编辑功能

  1. 缩进

    • >>:将当前行向右缩进。
    • <<:将当前行向左缩进。
    • n>>n<<:缩进当前行及其后 n 行。
  2. 高亮匹配括号

    将光标放在括号上,按 % 可跳转到匹配的括号。

  3. 代码折叠

    • zf:根据选定范围折叠。
    • zo:打开折叠。
    • zc:关闭折叠。

配置文件

Vim 的行为可以通过配置文件 .vimrc 进行定制。以下是一个简单示例:

set number          " 显示行号
syntax on           " 开启语法高亮
set tabstop=4       " 设置制表符宽度为 4 个空格
set expandtab       " 使用空格替代 Tab
set autoindent      " 自动缩进

高级用法

  1. 打开多个文件
vim file1 file2

使用 :n 切换到下一个文件,:prev 切换到上一个文件。

  1. 宏操作

    • q<register>:开始录制宏,<register> 可以是任意字母。
    • 执行一系列操作后,按 q 停止录制。
    • @<register>:执行宏。
    • n@<register>:重复执行宏 n 次。
  2. 多行注释

    • 选中多行:按 Ctrl + v 进入列模式,选择需要注释的行。
    • 插入注释符:按 Shift + i,输入注释符(如 #),然后按 Esc

示例

  1. 替换文件中的字符串
:%s/foo/bar/g

将文件中所有的 foo 替换为 bar

  1. 删除空行
:g/^$/d
  1. 批量修改代码缩进
:%!indent -kr

5. xargs(构建和执行命令行)

xargs 是一个用于构建并执行命令行的工具,通常结合管道使用。它从标准输入中读取数据(如文件列表、参数等),并将其转换为适合命令行的格式,接着执行指定的命令。

xargs [选项] [命令]
  • xargs 会从标准输入中读取数据并将其转化为命令行参数,然后执行指定的命令。

常用选项

  • -n:指定每次执行命令时使用的参数个数。

    例如,xargs -n 2 表示每次使用两个参数来执行命令。

  • -I:指定替换字符串。此选项允许你在命令中指定一个占位符(如 {}),并用输入数据替换该占位符。

    例如,xargs -I {} echo Hello, {} 会将标准输入的每一项替换 {},并执行命令 echo Hello, <item>

  • -d:指定输入分隔符。

    默认情况下,xargs 使用空白字符(空格、制表符、换行符)作为分隔符,使用 -d 可以指定其他字符作为输入分隔符。

  • -p:提示用户在执行每个命令前进行确认。

    例如,xargs -p rm 在执行每个 rm 命令之前都会要求用户确认。

  • -0:与 find 命令结合使用时,使用空字符(而不是换行符)作为分隔符,以正确处理文件名中包含空格和特殊字符的情况。

    例如,find . -name "*.txt" -print0 | xargs -0 rm 用于删除所有 .txt 文件,正确处理文件名中包含空格的情况。

示例

  1. 基本用法

    echo "file1 file2 file3" | xargs rm

    这个命令会删除 file1file2file3 文件。xargs 会将输入的数据(文件名)传递给 rm 命令。

  2. 使用 -n 每次传递指定数量的参数

    echo "file1 file2 file3 file4" | xargs -n 2 rm

    该命令每次将两个文件作为参数传递给 rm 命令,执行 rm file1 file2rm file3 file4

  3. 使用 -I 指定替换字符串

    echo "file1 file2 file3" | xargs -I {} mv {} /path/to/destination/

    该命令将每个文件移动到 /path/to/destination/ 目录中。{} 是占位符,表示每次传递给 mv 命令的文件名。

  4. find 命令结合使用

    find . -name "*.txt" | xargs rm

    find 命令查找当前目录及其子目录下所有 .txt 文件,并将它们传递给 xargs rm 命令进行删除。

  5. 处理包含空格的文件名(使用 -0

    find . -name "*.txt" -print0 | xargs -0 rm

    这个命令使用 -print0-0 选项,确保即使文件名中包含空格或其他特殊字符,xargs 仍能正确处理文件。


6. awk(文本处理工具)

awk 是一种强大的文本处理工具,特别擅长按行、按字段处理文本数据。awk 可以用于筛选、格式化、统计和生成报告等任务。

awk '条件 { 动作 }' 文件
  • 条件:指定处理文本的条件。
  • 动作:当条件满足时执行的操作,通常用于输出、修改或其他文本处理。

常用选项

  • -F:指定输入字段分隔符,默认情况下是空白字符(空格或制表符)。例如,awk -F ',' 用于处理以逗号为分隔符的 CSV 文件。
  • -v:定义变量,例如,awk -v var=value '...' 用于在 awk 脚本中传递外部变量。
  • print:打印指定的内容或字段。
  • NF:表示当前行的字段数。
  • $1, $2, ... $n:表示当前行的第 1、第 2、...、第 n 个字段。

示例

  1. 打印每一行的第一个字段

    echo "apple orange banana" | awk '{print $1}'
  2. 打印文件的第 1 和第 3 个字段

    awk '{print $1, $3}' file.txt
  3. 使用分隔符

    echo "apple,orange,banana" | awk -F ',' '{print $2}'
  4. 筛选满足条件的行

    awk '$2 > 50 {print $1, $2}' file.txt
  5. 计算总和

    awk '{sum += $1} END {print sum}' file.txt

    计算文件中所有第一列的数字之和。


7. grep(文本搜索)

常用选项:

  • -E:启用扩展正则表达式。
  • -r:递归搜索目录。
  • -i:忽略大小写。
  • -v:反向匹配,显示不匹配的行。
  • -l:只显示匹配的文件名。
grep -i "pattern" file.txt

8. sort(排序)

常用选项:

  • -n:按数字排序。
  • -r:逆序排序。
  • -u:去除重复的行。 也可使用uniq
sort -n file.txt

9. comm(比较文件)

用于比较两个排序过的文件,显示它们的共同部分和差异部分。

常用选项:

  • -1:不显示文件 1 中独有的部分。
  • -2:不显示文件 2 中独有的部分。
  • -3:不显示两个文件共有的部分。
comm file1.txt file2.txt

10. tr(字符转换)

常用选项:

  • -d:删除字符。
  • -s:压缩字符。
tr 'a-z' 'A-Z' # 将小写字母转换为大写字母
tr -s '[[:space:]]' '\n' # 根据空白字符分词
#[[:space:]]:一个 POSIX 字符类,匹配所有空白字符(如空格、制表符、换行符等)。

11. tar(打包与压缩)

常用选项:

  • -c:创建一个新的 tar 包。
  • -x:解包。
  • -v:显示处理过程。
  • -f:指定目标文件。
  • -z:通过 gzip 压缩或解压。
  • -j:通过 bzip2 压缩或解压。
tar -cvf 1101_log.tar 1101_log/*
tar -zxvf file.tar.gz

12. gzip(压缩)

gzip 是一个用于压缩单个文件的工具,会删除原始文件并生成 .gz 压缩文件

常用选项:

  • -d:解压文件
  • -r:递归压缩目录中的所有文件(每个文件单独生成 .gz 文件)
  • -v:显示压缩过程
gzip -d /tmp/test.gz

13. zipunzip(压缩和解压 .zip 文件)

zip:用于压缩文件和目录。

zip [选项] 压缩包 文件/目录

常用选项

  • -r:递归压缩
  • -m:不保留原文件
  • -v:显示过程
zip -r /tmp/test.zip /tmp/testdir

unzip:用于解压 .zip 文件。

常用选项**:

  • -d:指定解压目录
  • -v:显示解压过程
unzip /tmp/test.zip -d ./tmp/test

14. split(文件拆分)

用于将大文件拆分为小文件。

语法

split [选项] 文件 前缀

常用选项:

  • -a: 指定生成的小文件后缀的长度,默认为2
  • -b: 指定每个拆分文件的大小。单位可为 b(字节)、k(千字节)、m(兆字节)。
  • -d: 使用数字作为小文件的后缀,而不是字母,默认为字母
  • -l: 指定每个小文件的行数,默认为1000行
  • -n: 指定生成的小文件的数量,默认为2
  • --verbose: 显示拆分过程的详细信息
split -b 35m -d /path/to/bigfile bigfile_

bigfile 拆分为多个 35MB 的文件。


15. nohup(后台运行)**

挂起信号简介

挂起信号(SIGHUP, Signal Hang Up)是当用户注销或关闭终端时,系统发送给与该终端相关进程的信号。默认情况下,进程会因接收到挂起信号而终止。

nohup 命令会忽略挂起信号,使进程在终端关闭后仍然继续运行。

nohup 命令 [参数] &

常用选项

  • &:将命令放入后台运行,配合 nohup 使用。
  • nohup.out:如果未指定输出文件,命令的标准输出和错误输出会默认重定向到 nohup.out 文件中。
nohup python3 script.py > output.log 2>&1 &

16. ps(进程状态)**

ps 命令用于查看当前系统的进程信息,包括正在运行的程序及其状态。

常用选项**:

  • -e:显示所有进程(相当于 ps -A)。
  • -f:显示完整格式的信息,包括 UID、PPID、C、STIME 等。
  • -ef:组合选项,显示所有进程的详细信息。

- `a`:显示与终端相关的所有进程。
- `u`:以用户为中心的格式显示。
ps -u $(whoami) # 查看当前用户的进程
ps -ejH # 查看进程的层级关系(父子关系)

17. kill(终止进程)**

kill 命令用于向指定进程发送信号,常用于终止进程。

kill [选项] 进程ID

常用选项

  • -9(SIGKILL):强制终止进程,不会保存数据或进行清理操作。
  • -15(SIGTERM):默认信号,优雅地终止进程,允许进程进行清理工作后退出。
信号编号信号名称说明
1SIGHUP重新加载进程配置(常用于守护进程)。
2SIGINT中断进程(相当于 Ctrl+C)。
9SIGKILL强制终止进程。
15SIGTERM优雅地终止进程(默认)。
kill -15 1234 # 优雅地终止进程
kill -9 1234 # 发送 `SIGKILL` 信号强制终止进程 ID 为 `1234` 的进程。
ps -ef | grep python | awk '{print $2}' | xargs kill -9 # 查找运行的 Python 进程并强制终止。

18. tcpdump(抓包)

用于网络数据包的捕获和分析。可以使用Wireshark图形化分析抓包文件。

tcpdump [选项] [表达式]

常用选项:

  • -i:指定网络接口。
  • -w:将输出保存到文件。
  • -nn:禁用域名解析。
  • -v:显示详细输出。
  • -s0:捕获完整的数据包。
tcpdump -w tcpdump.pcap -i docker0 # 在 `docker0` 网络接口上抓取数据包,并将其保存到 `tcpdump.pcap` 文件中。
tcpdump -i en0 host 127.0.0.1 -nnv -s0 -c 50 # 捕获到 `127.0.0.1` 主机的 50 个数据包,并显示详细信息。

19. top(实时进程监控)

top 命令用于实时显示系统的进程信息,包括每个进程的 CPU 和内存使用情况,帮助用户了解系统资源的分配情况。

常用选项

  • -u:显示某个用户的进程。
  • -p:监控特定的进程ID。
  • -d:设置更新频率(秒)。
  • -n:指定更新次数。

快捷键操作(在 top 命令运行时,你可以使用以下快捷键操作):

  • P:按 CPU 使用率排序进程。
  • M:按内存使用率排序进程。
  • T:按时间/累计时间排序进程。
  • q:退出 top 命令。
  • h:显示 top 的帮助信息。
  • k:终止(kill)一个进程,输入进程的 PID。
  • r:改变进程的优先级(即调整 nice 值)。
  • u:只显示某个用户的进程。
  • n:设置刷新间隔时间(默认是 3 秒)。
  • c:切换显示命令行或程序名称。

20. uptime(系统运行时间)

uptime 命令显示系统的运行时间、当前时间、登录用户数量以及负载信息,是系统管理员常用的查看系统健康状况的工具。

21. w(查看当前登录用户和系统活动)

w 命令用于显示当前系统登录用户的信息以及他们正在执行的活动。它可以提供有关每个用户的详细信息,如登录时间、正在运行的进程、终端等

22. sync(同步磁盘)

sync 命令用于将文件系统的缓存数据写入磁盘,确保数据的持久性。该命令常用于系统关闭前,或者需要手动同步的场景。
sync; echo 3 > /proc/sys/vm/drop_caches # 同步缓存并清空缓存,包括 swap 空间。

25. du(磁盘使用情况)

du 命令用于显示文件和目录的磁盘使用情况,可以帮助用户查看目录或文件占用的磁盘空间。

du [选项] [文件/目录]

常用选项

  • -h:以易读的格式显示(例如 KB、MB)。
  • -s:显示总计,即只显示目录的总大小。
  • -a:显示所有文件和目录的使用情况。
  • --max-depth=N:只显示到指定深度的目录信息。
du -sh /home/user/
du -ah # 显示当前目录及其所有子目录和文件的磁盘使用情况。
du -h --max-depth=2 /home/user/ # 显示目录的前两级使用情况

26. df(文件系统磁盘空间)

df 命令用于查看文件系统的磁盘空间使用情况,帮助了解磁盘空间的分配与使用情况。

常用选项**:

  • -h:以易读格式显示(例如 KB、MB)。
  • -T:显示文件系统类型。
  • -a:包括所有文件系统(即使它们的使用空间为 0)。
  • -i:显示 inode 的使用情况(文件系统中的索引节点)。
df -hT # 除了显示空间使用情况,还显示文件系统的类型(例如 ext4、xfs)。
df -hi # 显示所有文件系统的 inode 使用情况,帮助判断是否达到 inode 限制。

27. rpm(RPM 包管理器)

用于安装和管理 RPM 包。

常用选项:

  • -i:安装包。
  • -v:显示详细信息。
  • -h:显示安装进度。
rpm -ivh package.rpm # 安装名为 `package.rpm` 的软件包。

28. systemctl(系统控制)

用于管理系统服务。

常用选项:

  • status:查看服务状态。
  • start:启动服务。
  • stop:停止服务。
  • enable:设置服务开机自启动。
  • disable:禁用服务开机自启动。
systemctl start firewalld
systemctl stop firewalld
systemctl enable firewalld
systemctl disable firewalld

29. firewall-cmd(Firewalld 管理)

用于管理 firewalld 防火墙。

常用选项:

  • --get-active-zones:查看当前激活的防火墙区域。
  • --add-port:开放端口。
  • --remove-port:关闭端口。
  • --set-default-zone:设置默认区域。
  • --add-rich-rule:添加高级规则。
firewall-cmd --get-active-zones                           # 查看激活的域
firewall-cmd --get-default-zones                            # 查看默认的域
firewall-cmd --zone=public --list-ports              # 查看开放的端口
firewall-cmd --zone=public --list-rich-rules  # 查看添加的规则
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放 80 端口并设置为永久生效,
firewall-cmd --zone=trusted --remove-port=9201 # 关闭 9201 端口。

30. iptables(防火墙规则管理)

管理 IP 防火墙规则。

常用选项:

  • -I:插入新规则。
  • -D:删除规则。
  • -L:列出当前规则。
  • -p:指定协议。
  • --dport:指定目标端口。
iptables -I INPUT -s 10.150.3.11 -p tcp --dport 9201 -j ACCEPT
iptables -D INPUT -s 10.150.3.11 -p tcp --dport 9201 -j ACCEPT
#  -m multiport --dport 9201,8500,15672

Docker 使用手册

Docker 基础命令

镜像管理

查找镜像

docker search image_name
  • --filter / -f:按条件过滤(如 stars=100)。
  • --limit:限制返回结果数量。

拉取镜像

docker pull image_name:tag
  • --all-tags / -a:拉取镜像的所有标签。

查看本地镜像

docker images
  • --all / -a:列出所有镜像,包括中间层。
  • --digests:显示镜像摘要信息。
  • --filter / -f:按条件过滤。

删除镜像

docker rmi image_name:tag
  • --force / -f:强制删除。
  • docker image prune -a:删除未使用的镜像。

保存与加载镜像

docker save image_name:tag | gzip > image.tar.gz
gunzip -c image.tar.gz | docker load

查看镜像历史

docker history image_name:tag
  • --no-trunc:显示完整信息。
  • --quiet / -q:只显示层 ID。

根据容器提交镜像

docker commit -a "nathan" -m "create new img" <container_id> image_name:tag
  • -a:设置作者信息。
  • -m:描述信息。
  • --change / -c:对镜像进行配置更改。

重命名镜像

docker tag old-repo/myimage:tag new-repo/myimage:new-tag

容器管理

运行容器

docker run -it --entrypoint sh image_name:tag
  • -i:保持标准输入打开。
  • -t:分配伪终端。
  • --name:为容器命名。
  • -d:后台运行。
  • --rm:退出后自动删除。
  • -p:端口映射(如 8080:80)。
  • -v:挂载数据卷(如 /host/path:/container/path)。

查看容器日志

docker logs <container_id>
docker logs --since 10m container_id
  • -f:实时查看日志。
  • --tail:显示最新日志行数(如 100)。
  • --since:从指定时间开始显示日志(支持 10m1h、具体时间戳等)。
  • --until:设置日志显示结束时间。

查看容器状态

docker ps
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
  • -a / --all:列出所有容器。
  • -q:只显示容器 ID。
  • --filter / -f:按条件过滤。
  • --format:以指定格式显示容器信息,可用占位符包括:

    • {{.ID}}:容器 ID
    • {{.Names}}:容器名称
    • {{.Status}}:容器状态
    • {{.Ports}}:容器端口
  • --latest / -l:只显示最近创建的容器。
  • --size / -s:显示容器的文件大小。

删除容器

docker rm $(docker ps -aq)
  • -f / --force:强制删除。
  • -v:同时删除挂载的卷。

停止/启动/重启容器

docker stop/start/restart container_id
  • --time / -t:设置停止超时时间(默认 10 秒)。

检查容器信息

docker inspect container_id
docker inspect --format='{{.State.Running}}' container_id
  • 使用 --format 提取特定信息:

    • {{.State.Status}}:容器状态
    • {{.Config.Image}}:镜像名称

进入容器

docker exec -it container_id /bin/bash

网络管理

查看网络

docker network ls
  • --filter / -f:按条件过滤。

创建网络

docker network create my-network
  • --driver:指定网络驱动类型(如 bridgehost)。
  • --subnet:指定子网(如 192.168.1.0/24)。

指定网络运行容器

docker run --network my-network --name nginx -d nginx

删除网络

docker network rm network_name

查看详细信息

docker network inspect network_name

创建带驱动配置的网络

docker network create \
  --driver bridge \
  --subnet=192.168.1.0/24 \
  custom-network

删除未使用的网络

docker network prune

清理无用资源

清理未使用镜像和容器

docker image prune -a
docker system prune -a
  • -a:删除所有未使用资源。
  • --force / -f:跳过确认提示。

性能监控

查看资源使用情况

docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

查看容器进程

docker top container_id

查看系统事件

docker events

挂载管理

查看数据卷

docker volume ls
  • 列出使用中的数据docker volume ls --filter dangling=false

检查数据卷信息

docker volume inspect <volume_name>

删除数据卷

docker volume rm volume_name

清理未使用的卷

docker volume prune --force

系统信息

查看版本

docker version

查看系统信息

docker info

导出与导入

导出容器

docker export container_id > container.tar

导入容器

cat container.tar | docker import - new_image_name:tag

文件复制

从主机复制到容器

docker cp local_path container_id:container_path

从容器复制到主机

docker cp container_id:container_path local_path

登录与登出

登录 Docker 仓库

docker login
  • --username / -u:指定用户名。
  • --password / -p:指定密码(不推荐明文)。

登出 Docker 仓库

docker logout

Dockerfile 使用指南

1. 常用指令

基础设置

  • FROM:指定基础镜像,通常是第一行。

    FROM ubuntu:20.04
  • LABEL:添加元数据。

    LABEL maintainer="your-email@example.com" version="1.0"

文件与目录操作

  • WORKDIR:设置工作目录。

    WORKDIR /app
  • COPYADD:复制文件到镜像中。

    COPY . /app
    ADD http://example.com/file.tar.gz /app # 支持远程 URL 下载与解压
  • VOLUME:声明挂载点。

    VOLUME ["/data"]

软件安装与命令执行

  • RUN:执行命令安装依赖或配置环境。

    RUN apt-get update && apt-get install -y python3
  • USER:设置后续命令的执行用户。

    USER nonroot

容器启动行为

  • CMD:设置容器启动时的默认命令(可被 docker run 覆盖)。

    CMD ["python3", "app.py"]
  • ENTRYPOINT:设置不可覆盖的默认命令。

    ENTRYPOINT ["python3", "app.py"]
  • EXPOSE:声明容器监听的端口(仅文档作用)。

    EXPOSE 8080

2. 分阶段构建

分阶段构建用于优化镜像大小。以下是示例:

# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
  • 构建阶段中安装依赖和生成构建产物。
  • 运行阶段中仅包含运行所需的文件。

3. docker build 命令

docker build 用于根据 Dockerfile 构建镜像。

基本语法

docker build [OPTIONS] PATH

常用选项

  • -t:为镜像命名和标记版本。

    docker build -t myapp:1.0 .
  • -f:指定 Dockerfile 文件路径。

    docker build -f /path/to/Dockerfile .
  • --no-cache:禁用构建缓存,强制执行所有步骤。

    docker build --no-cache -t myapp .
  • --build-arg:传递构建时参数。

    docker build --build-arg VERSION=1.0 -t myapp .
    ARG VERSION
    ENV APP_VERSION=$VERSION
  • -q:仅返回镜像 ID,隐藏构建日志。

    docker build -q -t myapp .
  • --target:指定目标构建阶段,在多阶段构建中,仅构建指定阶段:

    docker build --target builder -t app-builder .
  • 导出缓存将构建缓存保存到目录:

    docker build --cache-to=type=local,dest=./cache .
  • 启用并行构建使用 --progress

    docker build --progress=plain .

示例

  • 构建镜像:

    docker build -t myapp .
  • 带参数构建:

    docker build --build-arg ENV=production -t myapp:prod .

4. 优化建议

  • 多阶段构建:减少最终镜像大小。
  • 缓存利用:将变化较小的命令置于 Dockerfile 顶部。
  • 精简基础镜像:选择 alpine 等轻量级镜像。
  • 合并 RUN 命令:减少镜像层数。

    RUN apt-get update && apt-get install -y python3 && apt-get clean

总结

通过合理使用 Dockerfile 指令及优化构建过程,可以高效生成体积小、性能优的镜像。docker build 提供了丰富的选项以支持复杂需求,结合分阶段构建,可满足不同场景的性能和管理需求。


Docker Compose 使用指南

常用命令

  1. 启动服务

    docker-compose up -d
    • -d:后台运行。
  2. 停止并移除服务

    docker-compose down
    • 默认会移除容器及相关网络,但不会删除卷。
    • 使用 --volumes 删除所有关联卷。
       docker-compose down --volumes
    • 使用 --remove-orphans 删除未定义的容器。

      docker-compose down --remove-orphans
  3. 查看状态

    docker-compose ps
  4. 指定配置文件启动

    docker-compose -f custom-compose.yml up -d
  5. 重启服务

    docker-compose restart
  6. 查看实时日志

    docker-compose logs -f
    • 可指定服务名查看:

      docker-compose logs -f service_name
  7. 清理无用卷

    docker volume prune

docker-compose.yaml 书写规范

结构

  1. 顶层字段

    • version:指定 Compose 文件版本。
    • services:定义服务。
    • volumes:定义数据卷。
    • networks:定义网络。
  2. 缩进:使用两个空格,保持层级清晰。

示例

version: "3.9"

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - web-data:/usr/share/nginx/html
    networks:
      - webnet

  app:
    build:
      context: ./app
    environment:
      - NODE_ENV=production
    depends_on:
      - db
    networks:
      - appnet

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - appnet

volumes:
  web-data:
  db-data:

networks:
  webnet:
  appnet:

网络配置

  1. 自定义网络

    networks:
      custom-network:
        name: my-custom-network
        driver: bridge
  2. 使用外部网络

    networks:
      existing-network:
        external: true
  3. 子网和网关

    networks:
      custom-network:
        driver: bridge
        ipam:
          config:
            - subnet: 192.168.1.0/24
              gateway: 192.168.1.1

卷配置

  1. 命名卷

    volumes:
      app-data:
  2. 挂载主机目录

    services:
      app:
        volumes:
          - /host/path:/container/path
  3. 驱动与选项

    volumes:
      my-volume:
        driver: local
        driver_opts:
          type: nfs
          o: addr=192.168.1.100,rw
          device: ":/path/to/dir"

Docker Compose 的 build 配置

build 配置支持更多高级功能,例如缓存、构建参数、挂载等。

完整配置示例

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        APP_ENV: "production"
      cache_from:
        - app-cache
      target: builder
      network: host
      extra_hosts:
        - "local.test:127.0.0.1"

字段说明

  • context:指定构建上下文目录(通常是包含 Dockerfile 的路径)。
  • dockerfile:自定义 Dockerfile 路径。
  • args:传递构建参数(在 Dockerfile 中使用 ARG 声明)。
  • cache_from:使用指定镜像作为构建缓存源,减少重复构建时间。
  • target:指定构建阶段的目标,仅构建多阶段镜像中的某一阶段。
  • network:设置构建时使用的网络模式(如 host)。
  • extra_hosts:在构建时定义额外的主机解析(类似 /etc/hosts)。

更多高级用法

  1. 挂载构建时的卷(Docker BuildKit 支持)

    • 用于在构建时临时挂载额外数据,例如私有依赖库。

      services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
          secrets:
            - my_secret
      secrets:
      my_secret:
        file: ./secrets.txt
  2. 使用 BuildKit 的缓存挂载

    services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
          cache_from:
            - type=local,src=./cache
          cache_to:
            - type=local,dest=./cache

实用技巧

  1. depends_on 限制

    • 定义依赖关系,但不会保证服务完全启动:

      depends_on:
        - db
  2. 扩展字段
    使用 x- 前缀定义共享配置:

    x-shared-config:
      environment:
        - LOG_LEVEL=debug
    
    services:
      service1:
        <<: *x-shared-config
        image: app1
    
      service2:
        <<: *x-shared-config
        image: app2
  3. 动态扩展配置
    配合环境变量使用:

    services:
      app:
        image: "${APP_IMAGE:-default-app}:latest"

综合示例

以下是一个完整的 Compose 配置文件示例:

version: "3.9"

services:
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"
    networks:
      - frontend-backend

  backend:
    build:
      context: ./backend
    environment:
      - APP_ENV=production
    depends_on:
      - db
    networks:
      - frontend-backend
      - backend-db

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend-db

volumes:
  db-data:

networks:
  frontend-backend:
  backend-db:

总结

通过合理配置 docker-compose.yaml 文件并利用 Compose 命令,可以轻松管理复杂的容器服务。配合网络和卷配置,能进一步优化服务间的交互与数据持久化。

4. 常用脚本示例

检查容器内文件

#!/bin/bash
if [ -z "$1" ]; then
  echo "请传入要搜索的文件名"
  exit 1
fi
RUNNING_CONTAINERS="$(docker ps --format '{{.Names}}')"
for CONTAINER in $RUNNING_CONTAINERS; do
  if docker exec -it $CONTAINER sh -c 'test -e $1'; then
    echo "Found $1 in container: $CONTAINER"
  fi
done

5. 常见问题与注意事项

  1. 镜像源加速配置
# apk镜像源加速
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main" > /etc/apk/repositories && \
    echo "https://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories && \
    apk update --allow-untrusted && \
    apk add --allow-untrusted --clean-protected --no-cache bash && \
    rm -rf /var/cache/apk/*
# apt镜像源加速
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && apt-get update
  1. 删除未使用的镜像
comm -23 <(docker images --format "{{.Repository}}:{{.Tag}}" | sort) <(kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort) | grep emotibot | grep -v infra | xargs docker rmi