很多刚入行或者想转行运维的朋友常常会感到迷茫运维到底要学什么Linux命令、网络、脚本、Docker、监控……知识点又多又杂网上教程要么太浅要么太散很难形成体系更别提直接上手部署一个真实的企业级应用了。本文旨在解决这个痛点。我们将用一周的时间系统性地串联起云计算运维的核心实战技能从零基础直达企业级应用部署。整个过程将围绕一个具体的、可复现的实战项目展开涵盖Linux基础、服务管理、Docker容器化、Web服务部署、负载均衡配置以及基础监控告警。学完后你不仅能理解各环节的原理更能亲手搭建一个高可用的微服务演示环境这份完整的项目经验足以写进你的简历。1. 云计算运维核心技能全景与学习路径在开始动手之前我们需要对“云计算运维”这个岗位所需的核心技能有一个宏观的认识。它不再是传统的“网管”而是涵盖了从底层基础设施到上层应用交付的整个生命周期管理。1.1 现代运维的技能栈演变传统的运维可能更侧重于服务器硬件的维护和基础服务的搭建。而在云原生时代运维的职责发生了深刻变化基础设施即代码 (IaC)服务器、网络、存储等资源通过代码如Terraform, Ansible来定义和创建强调可重复性和版本控制。容器化与编排Docker 已成为应用打包和分发的标准Kubernetes (K8s) 则是容器编排的事实标准负责应用的部署、伸缩和管理。持续集成/持续部署 (CI/CD)自动化代码构建、测试和部署流程是保障快速、高质量交付的关键。可观测性包括监控Metrics、日志Logging和追踪Tracing用于洞察系统运行状态快速定位问题。云平台精通熟悉至少一家主流云服务商如阿里云、AWS、腾讯云的产品和服务能够高效利用云资源。对于初学者或希望快速就业的求职者而言一口吃不成胖子。一个务实的学习路径应该是先掌握能让项目“跑起来”的核心技能再逐步深入高级主题。1.2 本周实战学习路径设计我们设计了一周7天的高强度、闭环学习路径每天聚焦一个核心主题最终完成一个企业级应用的部署。Day 1: Linux 基础与 Shell 编程– 运维的基石所有操作的起点。Day 2: 网络基础与服务管理– 理解应用如何被访问如何管理后台服务。Day 3: Docker 入门与容器化实践– 学会用容器打包和运行应用解决环境一致性问题。Day 4: 使用 Docker Compose 编排多容器应用– 学习如何定义和运行由多个容器组成的复杂应用。Day 5: 部署企业级 Web 应用 (Nginx Tomcat)– 实战经典架构理解前后端分离部署。Day 6: 实现负载均衡与高可用 (Nginx LB)– 让应用具备处理高并发和容错的能力。Day 7: 基础监控与告警搭建 (cAdvisor Prometheus Grafana)– 为系统装上“眼睛”学会查看运行状态和设置报警。这个路径覆盖了从单机到集群从部署到监控的完整流程每一个环节都是面试和工作中高频出现的技能点。2. 环境准备构建你的实验平台工欲善其事必先利其器。一个稳定、隔离的实验环境是高效学习的前提。我们推荐以下两种方式请根据自身情况选择一种即可。2.1 方案一使用虚拟机 (推荐给初学者)在个人电脑Windows/Mac上安装虚拟机软件然后创建Linux虚拟机。虚拟机软件推荐使用VirtualBox(免费) 或VMware Workstation Player(个人免费)。Linux 发行版推荐CentOS 7.x或Ubuntu 20.04/22.04 LTS。本文示例将以CentOS 7.9为主但大部分命令在Ubuntu上也通用包管理命令不同如yum和apt。虚拟机配置建议分配至少2核CPU、4GB内存、40GB硬盘。网络模式选择“桥接网卡”或“NAT”确保虚拟机可以访问互联网。2.2 方案二使用云服务器 (最接近生产环境)购买一台按量付费的云服务器ECS例如阿里云、腾讯云的入门配置1核2G即可通常新用户成本极低。优点环境纯净网络稳定完全模拟线上操作体验最好。注意操作前务必做好快照备份并谨慎执行rm -rf等危险命令。2.3 基础环境配置无论选择哪种方案首次登录系统后请先执行以下基础配置# 1. 更新系统包CentOS sudo yum update -y # 如果是 Ubuntu则使用 # sudo apt update sudo apt upgrade -y # 2. 安装常用的基础工具 sudo yum install -y vim wget curl net-tools lsof telnet tree # 3. 关闭防火墙和SELinux仅用于实验环境生产环境需按需配置 sudo systemctl stop firewalld sudo systemctl disable firewalld sudo setenforce 0 sudo sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 4. 配置主机名可选方便识别 sudo hostnamectl set-hostname ops-lab完成上述步骤后你的实验环境就准备好了。请确保可以通过ping www.baidu.com测试网络连通性。3. Day 1: Linux 基础与 Shell 编程实战Linux是运维的“母语”。今天的目标是熟悉最常用的命令并能够编写简单的自动化脚本。3.1 必须掌握的 Linux 核心命令以下命令请务必在终端中亲手敲一遍理解其输出。文件与目录操作# 查看当前目录 pwd # 列出目录内容-l显示详情-a显示隐藏文件 ls -la # 切换目录 cd /var/log cd ~ # 回到家目录 # 创建目录/文件 mkdir -p /opt/myapp/{config,logs,data} # 递归创建多级目录 touch test.txt # 复制、移动、删除 cp source.txt dest/ mv oldname.txt newname.txt rm -rf /opt/myapp/data/* # 谨慎使用删除目录下所有文件文件查看与编辑# 查看文件内容 cat /etc/hostname # 实时查看日志文件尾部故障排查神器 tail -f /var/log/messages # 分页查看 less /var/log/secure # 使用vim编辑文件需要安装 vim test.sh # vim基础按 i 进入插入模式编辑后按 Esc输入 :wq 保存退出:q! 强制退出。系统信息与进程管理# 查看系统负载、内存、进程 top # 动态查看进程类似top但更友好 htop # 需额外安装: yum install htop -y # 查看指定进程 ps -ef | grep nginx # 强制终止进程 kill -9 PID # 查看磁盘使用情况 df -h # 查看内存使用情况 free -h网络与权限# 查看IP地址 ip addr show # 测试网络连通性 ping -c 4 8.8.8.8 # 查看端口监听状态 netstat -tlnp # 或使用更现代的 ss 命令 ss -tlnp # 修改文件权限经典755 chmod 755 my_script.sh # 修改文件所有者 chown root:root my_script.sh3.2 Shell 脚本编程入门脚本是自动化运维的利器。创建一个简单的系统健康检查脚本。# 1. 创建脚本文件 vim /opt/scripts/health_check.sh将以下内容写入脚本#!/bin/bash # 文件名health_check.sh # 描述简单的系统健康检查脚本 echo 系统健康检查报告 echo 检查时间$(date %Y-%m-%d %H:%M:%S) echo -------------------------------------- # 1. 检查系统负载 echo 1. 系统负载 (1, 5, 15分钟): uptime | awk -Fload average: {print $2} # 2. 检查内存使用率 echo -e \n2. 内存使用情况: free -h | awk NR2{printf 已用/总量: %s/%s (%.2f%%)\n, $3, $2, $3/$2*100} # 3. 检查磁盘使用率根分区 echo -e \n3. 磁盘使用情况(根分区): df -h / | awk NR2{printf 已用/总量: %s/%s (使用率%s)\n, $3, $2, $5} # 4. 检查关键进程是否存在以sshd和crond为例 echo -e \n4. 关键进程检查: for process in sshd crond; do if pgrep -x $process /dev/null; then echo [OK] 进程 $process 正在运行. else echo [FAIL] 进程 $process 未运行 fi done echo -e \n 检查完成 保存退出后赋予执行权限并运行chmod x /opt/scripts/health_check.sh /opt/scripts/health_check.sh你应该能看到一个格式化的系统状态报告。这个脚本虽然简单但包含了变量、命令替换、条件判断和循环等核心概念。4. Day 2: 网络基础与服务管理今天聚焦于让服务在网络上“可见”和“可控”这是部署任何应用的前提。4.1 TCP/IP 基础与端口IP地址服务器的门牌号。使用ip addr查看。端口 (Port)服务器上具体服务的门牌号。例如SSH默认22HTTP默认80HTTPS默认443。监听服务启动后会在某个端口上等待连接。使用netstat -tlnp或ss -tlnp查看监听端口。4.2 使用 systemd 管理服务现代Linux发行版大多使用systemd作为初始化系统和服务管理器。# 查看服务状态 systemctl status sshd # 启动/停止/重启服务 sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx # 设置开机自启/禁止自启 sudo systemctl enable nginx sudo systemctl disable nginx # 重新加载服务配置文件不重启服务 sudo systemctl reload nginx4.3 实战安装并配置 Nginx Web 服务器Nginx 是一个高性能的HTTP和反向代理服务器我们将用它来提供Web服务。# 1. 安装 Nginx (CentOS 7) sudo yum install -y epel-release sudo yum install -y nginx # 2. 启动并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginx # 3. 检查服务状态和监听端口 systemctl status nginx ss -tlnp | grep :80此时在浏览器中输入你的服务器IP地址如http://你的服务器IP应该能看到Nginx的欢迎页面。配置一个简单的虚拟主机# 4. 创建自定义网站目录和测试页面 sudo mkdir -p /var/www/mysite echo h1Hello from MySite!/h1pThis is a test page./p | sudo tee /var/www/mysite/index.html # 5. 创建配置文件 sudo vim /etc/nginx/conf.d/mysite.conf在配置文件中输入server { listen 8080; # 监听8080端口 server_name _; # 匹配所有域名生产环境应填写具体域名 root /var/www/mysite; # 网站根目录 index index.html; location / { try_files $uri $uri/ 404; } }# 6. 测试配置文件语法并重新加载Nginx sudo nginx -t sudo systemctl reload nginx现在访问http://你的服务器IP:8080就能看到自定义的页面了。通过这个练习你理解了服务安装、配置、端口监听和访问的全过程。5. Day 3: Docker 入门与容器化实践Docker 通过容器技术将应用及其依赖环境打包在一起实现了“一次构建处处运行”。5.1 Docker 核心概念镜像 (Image)只读的模板包含了运行应用所需的代码、库、环境变量和配置文件。例如nginx:latest,mysql:8.0。容器 (Container)镜像的运行实例。容器可以被创建、启动、停止、删除。每个容器都是相互隔离的。仓库 (Registry)存放镜像的地方。Docker Hub 是官方的公共仓库企业也会搭建私有仓库。5.2 安装 Docker在CentOS 7上安装Docker CE社区版# 1. 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 2. 安装依赖包和设置仓库 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 3. 安装 Docker Engine sudo yum install -y docker-ce docker-ce-cli containerd.io # 4. 启动Docker并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 5. 验证安装 sudo docker --version sudo docker run hello-world # 运行测试镜像5.3 Docker 基础命令实战# 镜像相关 docker images # 查看本地镜像 docker pull nginx:alpine # 拉取镜像轻量版nginx docker rmi 镜像ID # 删除本地镜像 # 容器生命周期 docker run -d --name my-nginx -p 8080:80 nginx:alpine # 后台运行容器映射主机8080端口到容器80端口 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器包括已停止的 docker stop my-nginx # 停止容器 docker start my-nginx # 启动已停止的容器 docker rm my-nginx # 删除容器需先停止 docker logs -f my-nginx # 查看容器日志 # 进入容器内部调试用 docker exec -it my-nginx /bin/sh # 在容器内部可以执行命令如 ls, cat /etc/nginx/nginx.conf # 输入 exit 退出容器5.4 实战容器化一个简单的 Python Web 应用创建应用代码mkdir ~/python-app cd ~/python-app vim app.py写入以下Python代码使用Flask框架from flask import Flask import os app Flask(__name__) app.route(/) def hello(): hostname os.uname().nodename return fh1Hello from Containerized App!/h1pHostname: {hostname}/p if __name__ __main__: app.run(host0.0.0.0, port5000)创建依赖文件vim requirements.txt写入Flask2.3.2创建 Dockerfile构建镜像的蓝图vim Dockerfile写入# 使用官方Python轻量级镜像 FROM python:3.9-alpine # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 声明容器运行时暴露的端口 EXPOSE 5000 # 定义启动命令 CMD [python, app.py]构建镜像并运行容器# 构建镜像-t 指定标签名 docker build -t my-python-app:1.0 . # 运行容器映射主机5000端口 docker run -d --name my-app -p 5000:5000 my-python-app:1.0访问测试打开浏览器访问http://你的服务器IP:5000你将看到来自容器的问候信息。通过这个练习你完成了从编写应用、定义依赖、编写Dockerfile到构建和运行容器的完整流程这是现代应用部署的基础单元。6. Day 4: 使用 Docker Compose 编排多容器应用现实中的应用往往由多个服务组成如Web服务器、数据库、缓存等。Docker Compose 允许你使用一个YAML文件来定义和运行多个容器。6.1 安装 Docker Compose# 下载最新稳定版的Docker Compose二进制文件 sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version6.2 编写 docker-compose.yml我们将编排一个经典的“WordPress MySQL”应用。mkdir ~/wordpress cd ~/wordpress vim docker-compose.yml写入以下内容version: 3.8 services: # MySQL 数据库服务 db: image: mysql:8.0 container_name: wp_db restart: always environment: MYSQL_ROOT_PASSWORD: your_strong_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: your_strong_wordpress_password volumes: - db_data:/var/lib/mysql # 数据持久化卷 networks: - wp-network # WordPress 应用服务 wordpress: image: wordpress:latest container_name: wp_app restart: always depends_on: - db # 依赖db服务先启动 ports: - 8080:80 # 映射主机8080端口 environment: WORDPRESS_DB_HOST: db:3306 # 使用服务名db作为主机名 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: your_strong_wordpress_password WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html # 主题、插件等数据持久化 networks: - wp-network # 定义网络让两个容器在同一个网络内可以通过服务名通信 networks: wp-network: driver: bridge # 定义数据卷实现数据持久化避免容器删除后数据丢失 volumes: db_data: wp_data:6.3 启动与管理多服务应用# 1. 在后台启动所有服务-d 参数 docker-compose up -d # 2. 查看运行状态 docker-compose ps # 3. 查看所有容器的日志 docker-compose logs -f # 4. 停止所有服务 docker-compose down # 5. 停止服务并删除数据卷谨慎会丢失数据 # docker-compose down -v启动后访问http://你的服务器IP:8080你将进入WordPress的安装界面。这演示了如何用一份配置文件一键启动一个包含数据库和Web应用的完整环境。7. Day 5 6: 部署企业级 Web 应用与负载均衡现在我们将综合运用前几天的知识部署一个更贴近企业实战的架构Nginx (反向代理/负载均衡) 多个 Tomcat (应用服务器)。7.1 架构说明用户访问 Nginx端口80。Nginx作为反向代理将请求转发到后端的多个 Tomcat 容器。Tomcat运行实际的 Java Web 应用我们用一个简单的WAR包演示。通过部署多个 Tomcat 实例并使用 Nginx 的负载均衡策略实现应用的水平扩展和高可用。7.2 准备应用和配置创建项目目录结构mkdir -p ~/enterprise-app/{nginx, tomcat1, tomcat2, app} cd ~/enterprise-app准备一个简单的 Web 应用 (WAR包) 我们可以使用一个简单的index.jsp来区分不同的Tomcat实例。在app目录下创建cd app cat index.jsp EOF % page contentTypetext/html; charsetUTF-8 % html headtitleEnterprise App/title/head body h1Welcome to Enterprise Application!/h1 pServer Hostname: % java.net.InetAddress.getLocalHost().getHostName() %/p pServer IP: % java.net.InetAddress.getLocalHost().getHostAddress() %/p pCurrent Time: % new java.util.Date() %/p hr pbThis request is served by Tomcat Instance: ${instance.id}/b/p /body /html EOF我们需要将其打包成WAR。为了简化我们直接使用一个预编译的简单WAR或者使用Docker来构建。这里我们选择编写一个Dockerfile来创建包含此应用的Tomcat镜像。7.3 编写 Dockerfile 构建自定义 Tomcat 镜像在app目录下创建DockerfileFROM tomcat:9.0-jre11 # 移除Tomcat默认的ROOT应用 RUN rm -rf /usr/local/tomcat/webapps/ROOT # 将我们的index.jsp复制到ROOT应用下 COPY index.jsp /usr/local/tomcat/webapps/ROOT/ # 创建一个环境变量文件用于标识实例ID在docker-compose中注入 RUN echo instance.iddefault /usr/local/tomcat/instance.properties CMD [catalina.sh, run]7.4 编写 docker-compose.yml 编排整个集群在~/enterprise-app目录下创建docker-compose.ymlversion: 3.8 services: # Tomcat 实例 1 tomcat1: build: ./app # 使用app目录下的Dockerfile构建镜像 container_name: tomcat-1 hostname: tomcat-1 environment: - INSTANCE_IDTomcat-Node-1 # 将实例ID写入文件供JSP读取这里用了一个启动脚本技巧 command: sh -c echo \instance.id$$INSTANCE_ID\ /usr/local/tomcat/instance.properties catalina.sh run networks: - app-network # Tomcat 实例 2 tomcat2: build: ./app container_name: tomcat-2 hostname: tomcat-2 environment: - INSTANCE_IDTomcat-Node-2 command: sh -c echo \instance.id$$INSTANCE_ID\ /usr/local/tomcat/instance.properties catalina.sh run networks: - app-network # Nginx 负载均衡器 nginx-lb: image: nginx:alpine container_name: nginx-lb ports: - 80:80 # 对外暴露80端口 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # 挂载自定义配置 depends_on: - tomcat1 - tomcat2 networks: - app-network networks: app-network: driver: bridge7.5 配置 Nginx 负载均衡在~/enterprise-app/nginx目录下创建nginx.confevents { worker_connections 1024; } http { # 定义上游服务器组名为 backend_servers upstream backend_servers { # 使用服务名docker-compose中定义进行负载均衡 server tomcat1:8080; server tomcat2:8080; # 可以配置权重等策略如server tomcat1:8080 weight3; } server { listen 80; server_name _; location / { # 将请求代理到上游服务器组 proxy_pass http://backend_servers; # 添加一些有用的请求头便于后端识别 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }7.6 启动集群并测试# 1. 在 ~/enterprise-app 目录下启动所有服务 docker-compose up -d --build # --build 会重新构建自定义镜像 # 2. 查看服务状态 docker-compose ps # 3. 查看Nginx和Tomcat日志 docker-compose logs -f nginx-lb # 或 docker-compose logs -f tomcat1 # 4. 访问测试 curl http://localhost多刷新几次浏览器页面你会看到This request is served by Tomcat Instance:后面的值在Tomcat-Node-1和Tomcat-Node-2之间轮换。这说明Nginx的负载均衡策略默认轮询生效了7.7 模拟节点故障体验高可用# 模拟 tomcat1 宕机 docker-compose stop tomcat1此时再多次访问http://你的服务器IP你会发现所有请求都由Tomcat-Node-2处理服务没有中断虽然整体处理能力下降。这就是最基本的高可用体现。启动tomcat1后流量会自动恢复分配。docker-compose start tomcat18. Day 7: 基础监控与告警搭建“可观测性”是运维的千里眼和顺风耳。今天我们将搭建一个经典的监控栈cAdvisor (容器监控) Prometheus (指标收集与存储) Grafana (数据可视化)。8.1 监控架构简介cAdvisor: 由Google开发用于收集、聚合、处理和导出运行中容器的资源使用和性能数据。它本身也是一个容器。Prometheus: 开源的系统监控和告警工具包。它会定期从配置好的目标如cAdvisor拉取Pull指标数据并存储在自己的时间序列数据库中。Grafana: 功能强大的指标数据可视化工具可以从Prometheus等数据源读取数据绘制成精美的图表和仪表盘。8.2 使用 Docker Compose 部署监控栈创建监控项目目录mkdir ~/monitoring cd ~/monitoring vim docker-compose.yml写入以下配置version: 3.8 services: # cAdvisor - 容器监控代理 cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: cadvisor restart: unless-stopped privileged: true # 需要特权模式访问主机资源 devices: - /dev/kmsg:/dev/kmsg volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro - /dev/disk/:/dev/disk:ro ports: - 8081:8080 # 暴露cAdvisor自身的UI networks: - monitor-net command: - -housekeeping_interval10s - -docker_onlytrue # 仅监控Docker容器 # Prometheus - 监控服务器 prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro # 挂载配置文件 - prometheus_data:/prometheus # 数据持久化卷 ports: - 9090:9090 networks: - monitor-net command: - --config.file/etc/prometheus/prometheus.yml - --storage.tsdb.path/prometheus - --web.console.libraries/etc/prometheus/console_libraries - --web.console.templates/etc/prometheus/consoles - --storage.tsdb.retention.time200h - --web.enable-lifecycle # Grafana - 数据可视化 grafana: image: grafana/grafana:latest container_name: grafana restart: unless-stopped environment: - GF_SECURITY_ADMIN_PASSWORDadmin123 # 设置初始管理员密码 volumes: - grafana_data:/var/lib/grafana ports: - 3000:3000 networks: - monitor-net networks: monitor-net: driver: bridge volumes: prometheus_data: grafana_data:8.3 配置 Prometheus 抓取目标在~/monitoring目录下创建prometheus.yml配置文件global: scrape_interval: 15s # 每15秒抓取一次数据 evaluation_interval: 15s # 每15秒评估一次告警规则 # 告警规则配置暂不启用 # rule_files: # - alert.rules scrape_configs: # 监控 Prometheus 自身 - job_name: prometheus static_configs: - targets: [localhost:9090] # 监控 cAdvisor - job_name: cadvisor static_configs: - targets: [cadvisor:8080] # 使用Docker服务名8.4 启动监控栈并配置 Grafana# 1. 启动服务 docker-compose up -d # 2. 检查服务状态 docker-compose ps # 3. 访问各个组件 # cAdvisor UI: http://你的服务器IP:8081 (查看单个容器资源) # Prometheus UI: http://你的服务器IP:9090 (查看指标、执行查询) # Grafana: http://你的服务器IP:3000 (用户名admin密码admin123)配置 Grafana 数据源和仪表盘登录 Grafana (admin/admin123)。点击左侧齿轮图标Configuration-Data Sources-Add data source。选择Prometheus。URL 填写http://prometheus:9090注意这里用的是Docker内部服务名因为Grafana和Prometheus在同一个Docker网络中。点击Save Test应显示“Data source is working”。导入官方仪表盘。点击左侧号 -Import。在Import via grafana.com输入框中输入193这是Docker容器监控的流行仪表盘ID然后点击Load。选择Prometheus数据源点击Import。现在你就能在 Grafana 上看到一个丰富的仪表盘展示了所有Docker容器的CPU、内存、网络、磁盘IO等详细指标。你可以看到之前部署的tomcat-1,tomcat-2,nginx-lb等容器的运行状态。8.5 设置基础告警示例在 Prometheus 中配置告警规则比较复杂我们可以先在 Grafana 中设置简单的可视化告警。在刚才导入的仪表盘上找到某个图表例如“Memory Usage”。点击图表标题 -Edit。在查询编辑器下方切换到Alert选项卡。点击Create Alert。设置规则例如Whenlast()of(A)is above500for1m 当内存使用率超过500MB持续1分钟。设置通知渠道需要先配置Email、钉钉、Webhook等这里可以先保存不配置。至此一个基础的、可视化的监控告警系统就搭建完成了。9. 常见问题与故障排查思路在学习和实践过程中你一定会遇到各种问题。以下是高频问题及排查思路。问题现象可能原因排查步骤与解决方案Docker 命令报Permission denied当前用户不在docker用户组1.sudo usermod -aG docker $USER2. 退出终端重新登录或执行newgrp dockerdocker-compose up报网络错误镜像拉取失败网络问题1. 检查主机网络ping www.baidu.com2. 配置 Docker 国内镜像加速器3. 手动拉取镜像docker pull image:tag服务启动后无法通过IP访问防火墙未开放端口容器端口映射错误服务未监听正确端口1.sudo firewall-cmd --list-ports(CentOS) 或检查云服务器安全组2.docker ps查看端口映射0.0.0.0:80-80/tcp3. 进入容器docker exec检查服务进程和监听端口netstat -tlnpNginx 502 Bad Gateway后端服务如Tomcat未启动或崩溃网络不通1.docker-compose logs 后端服务名查看后端日志2.docker-compose ps确认后端服务状态为Up3. 在Nginx容器内curl后端服务地址测试连通性Prometheus Targets 显示 DOWNPrometheus 配置中的目标地址错误目标服务未启动网络策略限制1. 检查prometheus.yml中targets的IP和端口2. 确保被监控服务如cAdvisor已启动且端口可访问3. 确认所有服务在同一个Docker网络内或使用正确的主机名/IP磁盘空间不足镜像、容器、数据卷占用过多空间1.docker system df查看Docker磁盘使用2. 清理无用镜像、停止的容器docker system prune -a(谨慎)3. 清理数据卷docker volume prune容器内应用日志不输出应用日志未打印到标准输出(stdout/stderr)1. 确保应用配置将日志输出到控制台而不是文件2. 对于文件日志可以通过docker cp命令复制出来或使用volumes挂载到宿主机通用排查命令链看状态docker-compose ps/docker ps看日志docker-compose logs -f [服务名]/docker logs -f [容器名]进容器docker exec -it [容器名] /bin/sh(检查配置文件、进程、网络)查网络docker network inspect [网络名](查看容器IP和连通性)查宿主机netstat -tlnp | grep [端口]/curl -I http://localhost:[端口]10. 最佳实践与进阶学习建议通过一周的实战你已经走完了从单机命令到集群部署、再到监控的完整闭环。以下是巩固成果和继续进阶的建议10.1 环境与配置管理最佳实践版本化一切将你的Dockerfile、docker-compose.yml、应用代码、配置文件全部纳入 Git 版本控制。使用.env文件管理变量在docker-compose.yml中将密码、密钥等敏感信息或可变配置提取到.env文件并通过environment部分引用。切记将.env加入.gitignore。数据持久化务必为数据库、上传文件等有状态服务配置volumes避免容器重建后数据丢失。资源限制在生产环境中为容器设置 CPU 和内存限制 (deploy.resources.limits)防止单个容器耗尽主机资源。10.2 安全注意事项不要使用默认密码上述示例中的密码均为弱密码生产环境必须使用强密码并通过 secrets 管理工具如 Docker Swarm/ K8s Secrets或环境变量文件传递。最小权限原则避免容器使用privileged: true和--privileged标志除非绝对必要。以非 root 用户运行容器进程。镜像安全使用官方镜像或可信来源的镜像定期扫描镜像漏洞。尽量使用特定版本标签如nginx:1.24-alpine而非latest。10.3 从 Docker Compose 到 KubernetesDocker Compose 非常适合单机开发和测试环境。当应用需要跨多台服务器部署、管理更复杂的生命周期滚动更新、自愈、服务发现时Kubernetes (K8s)是工业标准。下一步学习在掌握本教程内容后可以尝试使用minikube或kubeadm搭建一个单节点 K8s 集群学习Pod,Deployment,Service,Ingress等核心概念将本教程中的docker-compose.yml翻译成 K8s 的deployment.yaml和service.yaml。10.4 完善你的技能栈CI/CD学习使用 Jenkins、GitLab CI 或 GitHub Actions实现代码提交后自动构建 Docker 镜像并部署。配置管理学习 Ansible实现服务器环境的批量、自动化配置。日志集中管理搭建 ELK Stack (Elasticsearch, Logstash, Kibana) 或 Loki集中收集和分析所有容器和服务的日志。更强大的监控深入学习 Prometheus 的告警规则 (Alertmanager)并配置电话、短信、钉钉/企业微信等告警通知。这一周的密集学习只是一个开始但它为你构建了一个坚实、可扩展的实战技能框架。建议你将这个实验环境保存下来制作虚拟机快照或保存所有配置文件作为你未来学习更高级技术的沙盒。运维之路道阻且长但行则将至。最重要的不是记住所有命令而是建立起“遇到问题如何排查、如何设计架构、如何利用工具自动化”的系统性思维。