尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

学生服务器从零到一实战指南:Docker部署Spring Boot与Halo博客

学生服务器从零到一实战指南:Docker部署Spring Boot与Halo博客 之前看到不少同学趁着活动入手了1.99元/月的学生服务器配置通常是四核四G性价比确实很高。但服务器到手后很多人除了登录看一眼就不知道还能做什么了最终只能无奈“吃灰”。其实这样一台配置尚可的服务器是学习后端开发、部署个人项目、搭建技术栈的绝佳“练手场”。本文将从零开始为你规划一套完整的服务器“榨干”方案涵盖环境搭建、项目部署、运维监控和实用工具链让你手中的学生机真正物尽其用成为你技术成长路上的得力助手。1. 服务器能做什么从“吃灰”到“高利用率”的思维转变一台四核四G的云服务器其计算能力远超我们日常的开发笔记本。让它“吃灰”本质上是没有找到合适的应用场景。我们先来梳理一下它的能力边界和典型用途。1.1 能力评估与场景定位计算能力四核CPU足以流畅运行多个Docker容器、中型Java应用如Spring Boot、Python数据分析脚本或作为小型的GitLab CI/CD Runner。内存4G内存是关键资源。可以同时运行一个数据库如MySQL/Redis占用约500MB-1G、一个后端应用占用1G-2G以及一些必要的系统进程和监控组件。网络与存储学生服务器通常有1M-5M的公网带宽和40G-100G的系统盘。这决定了它适合个人博客/网站使用WordPress、Halo、Hexo等搭建。API服务与后端项目部署自己开发的Spring Boot、Django、Flask、Node.js等项目供前端或小程序调用。学习中间件搭建Redis、RabbitMQ、Nacos、Elasticsearch单节点轻量模式等用于理解和测试。自动化与工具部署Jenkins/GitLab Runner实现自动化构建搭建Alist做个人网盘或运行爬虫、定时任务脚本。内网穿透与跳板机作为frps服务端实现家庭NAS等设备的内网穿透。核心原则对于学生机切忌部署重度消耗资源的应用如大型游戏服务端、视频转码。我们的目标是轻量、高效、学习价值高。1.2 基础环境准备以CentOS 7.x/8.x或Ubuntu 20.04/22.04为例拿到服务器第一步不是盲目安装软件而是做好基础安全和优化。1. 更新系统与安装常用工具# 对于Ubuntu/Debian sudo apt update sudo apt upgrade -y sudo apt install -y vim wget curl git net-tools htop # 对于CentOS/Rocky Linux sudo yum update -y sudo yum install -y vim wget curl git net-tools epel-release sudo yum install -y htop2. 创建日常使用的普通用户避免直接使用root# 添加用户例如名为 devuser sudo adduser devuser # 为用户设置密码 sudo passwd devuser # 将用户加入sudo组使其拥有管理权限 sudo usermod -aG sudo devuser # Ubuntu # 或者 sudo usermod -aG wheel devuser # CentOS3. 配置SSH密钥登录提升安全性在你的本地电脑生成密钥对如果已有~/.ssh/id_rsa.pub可跳过ssh-keygen -t rsa -b 4096 -C “your_emailexample.com” # 一路回车将公钥上传到服务器# 在本地终端执行 ssh-copy-id devuser你的服务器IP之后可以修改服务器SSH配置禁用密码登录谨慎操作确保密钥登录成功后再进行sudo vim /etc/ssh/sshd_config找到并修改PasswordAuthentication no PubkeyAuthentication yes重启SSH服务sudo systemctl restart sshd2. 核心软件栈部署为项目运行铺平道路一个高效、隔离的运行环境是基础。我们优先选择Docker容器化部署它比直接安装更干净也更容易迁移和管理。2.1 安装Docker与Docker ComposeDocker是现代化部署的基石。# 1. 卸载旧版本如有 sudo yum remove docker* || sudo apt remove docker.io docker-compose # 2. 安装Docker官方源和依赖 (以CentOS为例其他系统请参考官方文档) sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io # 3. 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 4. 将当前用户加入docker组避免每次使用sudo sudo usermod -aG docker $USER # 退出SSH重新登录生效 # 5. 安装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 # 6. 验证安装 docker --version docker-compose --version2.2 使用Docker Compose部署基础服务我们通过一个docker-compose.yml文件来定义和运行多个容器。示例部署MySQL Redis Nginx在服务器上创建一个目录例如~/docker-services然后创建docker-compose.ymlversion: ‘3.8’ services: mysql: image: mysql:8.0 container_name: my-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: your_strong_root_password # 务必修改 MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: your_app_user_password # 务必修改 ports: - “3306:3306” volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d networks: - app-network redis: image: redis:7-alpine container_name: my-redis restart: unless-stopped command: redis-server --appendonly yes --requirepass your_redis_password # 务必修改 ports: - “6379:6379” volumes: - ./redis/data:/data networks: - app-network nginx: image: nginx:alpine container_name: my-nginx restart: unless-stopped ports: - “80:80” - “443:443” volumes: - ./nginx/html:/usr/share/nginx/html - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/logs:/var/log/nginx networks: - app-network networks: app-network: driver: bridge启动服务cd ~/docker-services docker-compose up -d使用docker-compose ps查看状态docker-compose logs -f [service_name]查看日志。关键点务必修改默认密码your_strong_root_password和your_redis_password必须改为强密码这是安全底线。数据持久化通过volumes将容器内的数据目录映射到宿主机即使容器删除数据也不会丢失。网络隔离所有服务在自定义的app-network内可以通过服务名如mysql相互访问无需使用IP。3. 实战项目一部署Spring Boot后端应用假设你已有一个简单的Spring Boot项目例如一个用户管理API并打包成了Jar文件demo-app-0.0.1.jar。3.1 传统方式部署直接运行Jar上传文件使用scp或SFTP工具将Jar包上传到服务器例如/home/devuser/app/。编写启动脚本创建start.sh方便管理。#!/bin/bash APP_NAMEdemo-app-0.0.1.jar # 使用生产环境配置并指定JVM参数根据4G内存合理分配 nohup java -Xms512m -Xmx1024m -jar $APP_NAME --spring.profiles.activeprod app.log 21 echo “$APP_NAME 启动中日志查看tail -f app.log”给脚本执行权限chmod x start.sh运行与检查./start.sh tail -f app.log # 查看启动日志 ps -ef | grep java # 查看进程3.2 容器化部署更推荐创建Dockerfile和新的docker-compose-app.yml。Dockerfile:FROM openjdk:11-jre-slim VOLUME /tmp COPY demo-app-0.0.1.jar app.jar ENTRYPOINT [“java”, “-jar”, “/app.jar”] # 如果需要指定JVM参数或Profile可以在这里添加 # ENTRYPOINT [“java”, “-Xms512m”, “-Xmx1024m”, “-jar”, “/app.jar”, “--spring.profiles.activeprod”]docker-compose-app.yml:version: ‘3.8’ services: demo-app: build: . # 使用当前目录的Dockerfile构建镜像 container_name: springboot-demo restart: unless-stopped environment: - SPRING_PROFILES_ACTIVEprod - SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/app_db?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai - SPRING_DATASOURCE_USERNAMEapp_user - SPRING_DATASOURCE_PASSWORDyour_app_user_password - SPRING_REDIS_HOSTredis - SPRING_REDIS_PASSWORDyour_redis_password ports: - “8080:8080” depends_on: - mysql - redis networks: - app-network # 与基础服务在同一个网络可以直接用服务名访问 networks: app-network: external: true # 使用之前创建的外部网络运行步骤将demo-app-0.0.1.jar、Dockerfile、docker-compose-app.yml放在同一目录。确保基础服务网络已存在docker network ls | grep app-network。启动应用docker-compose -f docker-compose-app.yml up -d。优势环境隔离依赖清晰与宿主机解耦一键启停。4. 实战项目二搭建个人博客Halo示例Halo是一个现代化的Java博客系统对资源要求友好非常适合学生机。使用Docker Compose一键部署创建docker-compose-halo.ymlversion: ‘3’ services: halo: image: halohub/halo:2.10 container_name: halo restart: on-failure:3 networks: - halo-network volumes: - ./halo2:/root/.halo2 ports: - “8090:8090” environment: - HALO_EXTERNAL_URLhttp://你的服务器IP:8090/ - HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAMEadmin # 初始化管理员用户名 - HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORDyour_strong_admin_password # 初始化管理员密码务必修改 # 可选如果你有自己的域名并配置了SSL可以搭配Nginx反代 nginx: image: nginx:alpine container_name: halo-nginx restart: unless-stopped networks: - halo-network volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/logs:/var/log/nginx ports: - “80:80” - “443:443” depends_on: - halo networks: halo-network: driver: bridge启动docker-compose -f docker-compose-halo.yml up -d。访问http://你的服务器IP:8090即可进行初始化安装。5. 运维与监控让服务器健康运行部署只是开始运维保障稳定。5.1 基础资源监控htop交互式进程查看器实时查看CPU、内存、负载。htopdf / du查看磁盘使用情况。df -h # 查看各分区使用情况 du -sh /path/to/dir # 查看指定目录大小5.2 日志查看与管理查看实时日志docker-compose logs -f [服务名]查看系统日志journalctl -u docker.service -f(查看Docker服务日志)日志轮转对于直接输出的应用日志如app.log可以配置logrotate防止撑满磁盘。创建/etc/logrotate.d/my-app/home/devuser/app/app.log { daily rotate 7 compress delaycompress missingok notifempty create 644 devuser devuser }5.3 使用Portainer进行可视化容器管理可选但推荐Portainer是一个轻量的Docker UI管理工具。docker run -d -p 9000:9000 --name portainer --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest访问http://你的服务器IP:9000首次访问创建管理员账户之后就可以在网页上管理容器、镜像、网络和卷了非常适合新手。5.4 设置防火墙非常重要只开放必要的端口关闭其他所有入口。# 对于CentOS 7 (firewalld) sudo firewall-cmd --permanent --add-port22/tcp # SSH sudo firewall-cmd --permanent --add-port80/tcp # HTTP (如果部署网站) sudo firewall-cmd --permanent --add-port443/tcp # HTTPS sudo firewall-cmd --permanent --add-port8080/tcp # 你的应用端口 sudo firewall-cmd --permanent --add-port8090/tcp # Halo博客端口 sudo firewall-cmd --reload sudo firewall-cmd --list-all # 查看规则 # 对于Ubuntu (ufw) sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 8080/tcp sudo ufw allow 8090/tcp sudo ufw enable sudo ufw status verbose6. 常见问题与排查思路服务器运维过程中难免会遇到各种问题。这里提供一个快速排查清单。问题现象可能原因排查步骤应用无法访问1. 应用未启动2. 端口未开放3. 防火墙阻止4. 应用内部错误1.docker ps或ps -ef | grep java检查进程。2.netstat -tlnp查看端口监听状态。3. 检查云服务器控制台的安全组/防火墙规则。4.docker logs [容器名]或查看应用日志文件。磁盘空间不足1. 日志文件过大2. Docker镜像/容器缓存过多3. 应用生成大量临时文件1.df -h定位满的分区。2.du -sh /* | sort -rh | head -10找大文件/目录。3. 清理Dockerdocker system prune -a(谨慎会删除未使用的镜像、容器、网络)。4. 配置日志轮转。服务器连接超时/卡顿1. 带宽跑满2. CPU/内存耗尽3. 被攻击或异常进程1.htop查看实时资源。2.iftop(需安装) 查看网络流量。3.ss -s查看连接数是否异常。4. 检查/var/log/secure是否有大量失败登录尝试。Docker容器启动失败1. 端口冲突2. 镜像拉取失败3. 环境变量或卷配置错误4. 内存不足1.docker-compose logs -f查看详细错误日志。2.docker run测试简化命令。3. 检查docker-compose.yml语法和缩进。4.docker stats查看容器资源使用。数据库连接失败1. 数据库服务未运行2. 网络不通容器间3. 用户名/密码错误4. 权限不足1.docker-compose ps确认数据库容器状态。2. 进入应用容器docker exec -it [app_container] bash尝试telnet mysql 3306。3. 确认连接字符串中的主机名容器内用服务名、端口、数据库名。4. 直接登录数据库验证账号密码。7. 进阶玩法与最佳实践当基础服务稳定运行后可以尝试更进阶的用法提升开发效率和系统可靠性。7.1 使用Nginx作为反向代理为什么用Nginx它可以实现一个端口代理多个应用都用80/443端口通过不同域名或路径区分。负载均衡虽然单机意义不大但可学习。静态文件服务。配置SSL证书实现HTTPS。示例配置 (~/docker-services/nginx/conf.d/demo.conf)server { listen 80; server_name api.yourdomain.com; # 你的域名或服务器IP location / { proxy_pass http://springboot-demo:8080; # 指向Spring Boot容器名和端口 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; } } server { listen 80; server_name blog.yourdomain.com; location / { proxy_pass http://halo:8090; 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; } }修改后重启Nginx容器docker-compose restart nginx。7.2 配置简单的CI/CD基于Git Webhook目标本地推送代码到Git仓库如Gitee服务器自动拉取并重启应用。在服务器安装Git。在应用目录初始化Git并配置远程仓库。编写一个部署脚本deploy.sh包含拉取代码、构建如果是源码、重启容器的逻辑。在Gitee/GitLab仓库配置Webhook指向服务器上一个特定的HTTP接口可以用一个简单的Python Flask/Node.js服务来接收请求并执行deploy.sh。这是一个简化的学习思路实际生产需要更完善的错误处理和认证。7.3 资源限制与优化限制容器资源在docker-compose.yml中为服务添加资源限制防止单个容器拖垮整个服务器。services: my-app: image: my-image deploy: resources: limits: cpus: ‘1.5’ # 限制使用1.5个CPU核心 memory: 1G # 限制使用1G内存JVM调优对于Java应用根据4G总内存合理设置-Xms和-Xmx通常为总内存的50%-70%留出足够空间给系统和其他容器。使用Alpine基础镜像构建Docker镜像时选择alpine、slim等变体可以显著减小镜像体积加快拉取和部署速度。7.4 备份备份备份学生机也可能宕机、数据可能误删。定期备份是必须养成的习惯。数据库备份编写脚本定时导出SQL并上传到其他存储如对象存储、另一台机器。# 示例每日备份MySQL docker exec my-mysql mysqldump -u root -p密码 数据库名 /backup/mysql_$(date %Y%m%d).sql重要文件备份将docker-compose.yml、应用配置文件、上传的文件目录等打包备份。使用版本控制所有配置文件、脚本都应放入Git仓库管理。别再让你1.99元/月的学生服务器继续“吃灰”了。从今天起把它当作你专属的云端实验室。按照本文的步骤从基础安全设置到Docker环境搭建从部署第一个Spring Boot应用到搭建个人博客再到学习运维监控和进阶玩法每一步都是宝贵的实战经验。过程中遇到的每一个错误解决的每一个问题都会让你的技术功底更加扎实。动手试试吧你会发现这台小小的服务器能为你打开一扇通往云原生和后端开发的大门。如果在实践中有新的发现或问题欢迎在评论区交流分享。
返回列表