从零到一:CentOS7与Docker的奇幻漂流——一个开发者的环境搭建心路历程
从零到一: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像个沉默的武士,黑底白字的终端是唯一的对话窗口。为了让这个武士开口说话,我不得不直面三个灵魂拷问:
-
网络连接问题:
nmcli d查看网卡状态时,那个刺眼的"unavailable"让人绝望。解决方案藏在/etc/sysconfig/network-scripts/目录里,手动配置BOOTPROTO=dhcp后,systemctl restart network的提示符终于变绿了。 -
软件源困境:默认的国外源速度堪比蜗牛,换成阿里云镜像源后,下载速度直接从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-* -
基础工具缺失: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成了我的救星,但安装过程堪称渡劫:
-
目录权限问题:Jenkins用户对
/var/jenkins_home没有写权限,导致插件安装失败。最终用这个命令解决:sudo chown -R 1000:1000 /opt/jenkins -
时区设置:构建时间总是差8小时,在Docker启动时加入
-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai才解决。 -
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. 从实验室到生产:那些决定性的细节
当第一个外部用户访问我的服务时,才发现开发环境和生产环境完全是两回事:
-
日志收集:原来
docker logs只是开始,ELK栈才是终极解决方案。现在使用Filebeat收集日志已成标配。 -
监控告警:Prometheus+Grafana看板让系统状态一目了然,设置的内存阈值告警已经救了三次线上事故。
-
安全加固:经历了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的奇幻漂流,最大的感悟是:最好的学习方式,就是亲手把系统搞崩几次再修好。
更多推荐



所有评论(0)