从零到一:CentOS7与Docker的奇幻漂流——一个开发者的环境搭建心路历程

1. 启程:当代码遇见虚拟机

记得第一次在本地跑通SpringBoot项目时,那种成就感让我兴奋了好几天。但很快我就意识到,如果想让别人也能访问我的"杰作",就得面对服务器部署这个新课题。作为学生党,云服务器动辄上千的年费让我望而却步,直到发现了VMware+CentOS7这个黄金组合。

选择CentOS7并非偶然。这个被无数企业采用的Linux发行版,以稳定性著称,特别适合作为生产环境的基础。而VMware Workstation Pro提供的快照功能,简直就是新手救星——每次重大操作前拍个快照,翻车了也能秒回滚。

关键准备清单:

  • VMware Workstation 17(学生可申请免费许可证)
  • CentOS7 Minimal ISO镜像(约900MB)
  • 至少2核4G的宿主机配置
  • 一颗不怕报错的心

安装过程比想象中顺利,直到那个经典的网络配置问题出现——ifconfig命令居然"找不到"!原来CentOS7默认最小化安装不包含网络工具包,这个下马威让我第一次体会到Linux世界的"骨感"。

2. 驯服CentOS:从命令行开始的修行

刚装好的CentOS7像个沉默的武士,黑底白字的终端是唯一的对话窗口。为了让这个武士开口说话,我不得不直面三个灵魂拷问:

  1. 网络连接问题nmcli d查看网卡状态时,那个刺眼的"unavailable"让人绝望。解决方案藏在/etc/sysconfig/network-scripts/目录里,手动配置BOOTPROTO=dhcp后,systemctl restart network的提示符终于变绿了。

  2. 软件源困境:默认的国外源速度堪比蜗牛,换成阿里云镜像源后,下载速度直接从KB/s飙到MB/s。记得执行这个魔法命令:

    sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
    sudo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-*
    
  3. 基础工具缺失:vim?没有。wget?不存在。通过yum install -y vim wget net-tools装齐装备后,这个沉默的武士终于愿意跟我正常交流了。

当固定IP配置成功,SSH远程连接稳定的那一刻,我对着闪烁的光标傻笑了五分钟——这大概就是极客的快乐吧。

3. Docker登场:容器化魔法初体验

第一次听说Docker时,我以为是某种新型存储设备。当了解到它可以通过容器实现"一次构建,到处运行"时,立刻被这种优雅的解决方案吸引了。但现实很快给了我一记重拳——官方安装文档里的命令居然报404错误!

经过三小时排查,发现是证书过期问题。最终这个组合拳解决了问题:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo rpm --import https://download.docker.com/linux/centos/gpg
sudo yum install docker-ce docker-ce-cli containerd.io

启动Docker时又遇到经典的"Permission denied"。原来需要把用户加入docker组:

sudo usermod -aG docker $USER
newgrp docker

docker run hello-world弹出那只熟悉的鲸鱼时,我差点从椅子上跳起来——原来这就是让无数开发者着迷的容器魔法!

4. 构建生产环境:数据库与中间件的交响乐

真正的挑战从部署MySQL开始。直接docker pull mysql后,发现容器秒退。日志显示"需要指定MYSQL_ROOT_PASSWORD",这才明白无状态容器的设计哲学。最终的启动命令像一首严谨的奏鸣曲:

docker run -d \
  --name mysql_dev \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=ComplexP@ssw0rd \
  -v /opt/mysql/data:/var/lib/mysql \
  mysql:5.7 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

Redis的部署看似简单,直到发现数据没持久化。研究后采用了混合持久化方案:

mkdir -p /opt/redis/{data,conf}
cat > /opt/redis/conf/redis.conf << EOF
save 900 1
save 300 10
save 60 10000
appendonly yes
EOF

docker run -d \
  --name redis_cache \
  -p 6379:6379 \
  -v /opt/redis/data:/data \
  -v /opt/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  redis redis-server /usr/local/etc/redis/redis.conf

当SpringBoot应用成功连上容器化的MySQL和Redis时,那种系统各部件完美协作的美感,让我想起了第一次组装电脑点亮主机的感动。

5. Jenkins:自动化部署的终极武器

本以为手动部署已经够用,直到连续三次深夜被上线问题叫醒。Jenkins的蓝海豚logo成了我的救星,但安装过程堪称渡劫:

  1. 目录权限问题:Jenkins用户对/var/jenkins_home没有写权限,导致插件安装失败。最终用这个命令解决:

    sudo chown -R 1000:1000 /opt/jenkins
    
  2. 时区设置:构建时间总是差8小时,在Docker启动时加入-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai才解决。

  3. Pipeline配置:第一次看到Groovy脚本时一脸懵,直到发现可以录制操作生成脚本,这个功能简直是人类福音。

当Jenkins自动完成从代码拉取到服务重启的全流程时,我盯着那个蓝色进度条看了整整十分钟——这就是现代开发者的"流水线魔法"啊。

6. 踩坑实录:那些教科书不会教的事

  • 网络冲突:Docker的172.17.0.0/16网段居然和公司VPN冲突,修改/etc/docker/daemon.json添加"bip": "192.168.5.1/24"才解决。

  • 存储爆炸:没清理的Docker镜像很快吃光了磁盘空间,现在定期执行docker system prune已成习惯。

  • 内存泄漏:某次Java应用OOM导致宿主机崩溃,后来学会了用-m 512m限制容器内存。

最惊险的一次是误删了数据库容器,幸好有每日备份脚本。现在我的终端里永远开着这个监控:

watch -n 60 'df -h; docker stats --no-stream'

7. 从实验室到生产:那些决定性的细节

当第一个外部用户访问我的服务时,才发现开发环境和生产环境完全是两回事:

  1. 日志收集:原来docker logs只是开始,ELK栈才是终极解决方案。现在使用Filebeat收集日志已成标配。

  2. 监控告警:Prometheus+Grafana看板让系统状态一目了然,设置的内存阈值告警已经救了三次线上事故。

  3. 安全加固:经历了SSH暴力破解攻击后,现在所有服务都配置了fail2ban和防火墙规则。

记得第一次用Docker Compose编排多容器服务时,那个docker-compose.yml文件就像交响乐总谱:

version: '3'
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
  
  redis:
    image: redis:alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

volumes:
  mysql_data:
  redis_data:

这个文件现在已经成为我所有项目的标准模板,就像一位老友,见证着我从部署菜鸟到能设计高可用架构的成长历程。每次回看这段CentOS7与Docker的奇幻漂流,最大的感悟是:最好的学习方式,就是亲手把系统搞崩几次再修好。

更多推荐