DevOps 实验阶段四:Infra 节点 + MySQL + Spring Boot 容器化
1. 阶段目标
新增基础设施节点:
192.168.205.146 infra
用途:MySQL 数据库 + Harbor 私有镜像仓库
最终实现:
Spring Boot Container
│
▼
192.168.205.146
MySQL 8
验证目标:
- Spring Boot 容器正常运行
- API 正常访问
- CRUD 数据正常写入 MySQL
2. 新增机器规划
| IP | 主机名 | 用途 |
|---|---|---|
| 192.168.205.146 | infra | MySQL + Harbor |
系统:Ubuntu 20.04
3. Ansible Inventory 扩展
位置
~/devops-lab/ansible/inventory/hosts.ini
增加内容
ini
[infra_servers]
infra ansible_host=192.168.205.146 ansible_user=infra
最终 Inventory
ini
[k8s_control_plane]
k8s-master ansible_host=192.168.205.141 ansible_user=master
[k8s_workers]
k8s-node1 ansible_host=192.168.205.142 ansible_user=node1
k8s-node2 ansible_host=192.168.205.143 ansible_user=node2
[devops_servers]
devops ansible_connection=local ansible_host=192.168.205.144 ansible_user=devops
[elk_servers]
elk ansible_host=192.168.205.145 ansible_user=elk
[infra_servers]
infra ansible_host=192.168.205.146 ansible_user=infra
验证
bash
ansible-inventory \
-i inventory/hosts.ini \
--graph
结果:
@infra_servers:
|--infra
4. 统一 hosts 管理
新增文件
ansible/update-hosts.yml
内容
yaml
---
- name: Update /etc/hosts for DevOps Lab
hosts: all
become: yes
tasks:
- name: Configure hosts
blockinfile:
path: /etc/hosts
marker: "# {mark} DEVOPS-LAB"
block: |
192.168.205.141 k8s-master
192.168.205.142 k8s-node1
192.168.205.143 k8s-node2
192.168.205.144 devops
192.168.205.145 elk
192.168.205.146 infra
执行
bash
ansible-playbook \
-i inventory/hosts.ini \
update-hosts.yml \
--limit infra \
-K
验证
bash
ssh infra
cat /etc/hosts
结果:
192.168.205.141 k8s-master
192.168.205.142 k8s-node1
192.168.205.143 k8s-node2
192.168.205.144 devops
192.168.205.145 elk
192.168.205.146 infra
5. 修改 init.yml 支持 infra
问题
原来:
yaml
hosts: k8s_nodes
hosts: devops_servers
hosts: elk_servers
没有 infra_servers,导致:
bash
ansible-playbook init.yml --limit infra
结果:
skipping: no hosts matched
解决
增加:
yaml
- name: Initialize Infra server
hosts: infra_servers
执行
bash
ansible-playbook \
-i inventory/hosts.ini \
init.yml \
--limit infra \
-K
完成基础初始化。
6. Docker 安装扩展
修改 docker.yml
原:
yaml
hosts: "k8s_nodes:devops_servers"
修改为:
yaml
hosts: "k8s_nodes:devops_servers:infra_servers"
效果
| 节点 | Docker |
|---|---|
| k8s-master | ✓ |
| k8s-node1 | ✓ |
| k8s-node2 | ✓ |
| devops | ✓ |
| infra | ✓ |
cri-dockerd 保持不变
不要修改:
yaml
hosts: k8s_nodes
原因:infra 不是 Kubernetes 节点。
7. Docker 源问题处理
问题
Docker 官方源 download.docker.com 访问失败:
错误:OpenSSL SSL_connect: Connection reset by peer
测试:
bash
curl -I https://download.docker.com
失败。
修改 docker-install.sh
原:
https://download.docker.com/linux/ubuntu
修改为:
https://mirrors.aliyun.com/docker-ce/linux/ubuntu
GPG 密钥地址:
原:
https://download.docker.com/linux/ubuntu/gpg
修改为:
https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
重新执行
bash
ansible-playbook \
-i inventory/hosts.ini \
docker.yml \
--limit infra \
-K
验证
bash
docker --version
结果:
Docker version 28.1.1
8. Docker Hub 访问问题处理
问题
启动 MySQL:
bash
docker compose up -d
失败:
Get "https://registry-1.docker.io/v2/": context deadline exceeded
原因:Docker Hub 访问超时。
修改 Docker daemon
文件:/etc/docker/daemon.json
json
{
"registry-mirrors": ["https://docker.m.daocloud.io"],
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2"
}
重启
bash
systemctl daemon-reload
systemctl restart docker
验证
bash
docker pull mysql:8.0
成功。
9. MySQL Docker 部署
目录结构
/opt/mysql/
├── docker-compose.yml
├── data/ ← 数据持久化
├── conf/ ← 配置文件
└── logs/ ← 日志文件
设计原则
数据存储在宿主机 /opt/mysql/data,即使删除容器:
bash
docker rm mysql8
数据仍然存在。
docker-compose.yml
yaml
services:
mysql:
image: mysql:8.0
container_name: mysql8
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: Devops@123
MYSQL_DATABASE: devops_demo
volumes:
- /opt/mysql/data:/var/lib/mysql
- /opt/mysql/conf:/etc/mysql/conf.d
- /opt/mysql/logs:/var/log/mysql
启动
bash
docker compose up -d
验证
bash
docker ps
结果:
mysql8 mysql:8.0 Up
10. Spring Boot 连接迁移
原配置
properties
jdbc:mysql://localhost:3306/devops_demo
修改后
yaml
spring:
datasource:
url: jdbc:mysql://192.168.205.146:3306/devops_demo
username: root
password: Devops@123
重新打包
bash
mvn clean package
生成:
target/devops-demo-1.0.0.jar
11. Spring Boot 镜像重新构建
构建
bash
docker build \
-t devops-demo:v2 .
运行
bash
docker run -d \
--name devops-demo \
-p 8080:8080 \
devops-demo:v2
查看
bash
docker ps
docker logs devops-demo
正常启动。
12. 功能验证
API 访问
bash
http://localhost:8080
测试:
- 新增
- 查询
- 修改
- 删除
数据库验证
bash
docker exec -it mysql8 mysql -uroot -p
进入后:
sql
use devops_demo;
show tables;
select * from xxx;
数据正常。
本阶段产出文件
新增/修改文件
ansible/
├── inventory/hosts.ini ← 新增 infra_servers
├── update-hosts.yml ← 新增
├── init.yml ← 修改:增加 infra play
├── docker.yml ← 修改:增加 infra_servers
└── scripts/
└── docker-install.sh ← 修改:阿里云镜像源
业务项目
devops-demo/
├── src/main/resources/
│ └── application.yml ← 修改:数据库连接地址
├── Dockerfile
└── target/
└── devops-demo-1.0.0.jar
基础设施
/opt/mysql/
├── docker-compose.yml
├── data/
├── conf/
└── logs/
本阶段遇到的问题总结
1. inventory 目录误判
问题:
bash
ansible-inventory -i inventory --list
报错:
Unable to parse inventory
原因: 实际路径是 inventory/hosts.ini,不是 inventory 文件。
正确:
bash
ansible-inventory \
-i inventory/hosts.ini \
--list
2. init.yml 无法匹配 infra
错误:
skipping: no hosts matched
原因: init.yml 中没有定义 hosts: infra_servers。
解决: 增加 infra 的 Play。
3. community.docker 不兼容
错误:
__spec__ is None
原因: Ansible 2.9.6 与新版 community.docker 不匹配。
解决: 放弃使用 community.docker.docker_compose_v2 模块,改为:
yaml
shell: docker compose up -d
4. Docker 官方源失败
错误:
SSL_connect: Connection reset by peer
原因: download.docker.com 访问不稳定。
解决: 改为阿里云 Docker CE 源。
5. Docker Hub 拉取超时
错误:
registry-1.docker.io: context deadline exceeded
解决: 配置 registry-mirrors 为 DaoCloud 加速器。
当前平台状态
现在已经完成:
代码
│
▼
Spring Boot
│
▼
Maven
│
▼
Docker Image
│
▼
Docker Container
│
▼
MySQL Container
│
▼
数据持久化
下一阶段
Harbor 私有镜像仓库
│
│
Jenkins CI/CD
│
│
Kubernetes Deployment
│
│
ELK 日志采集
下一步可以直接进入:部署 Harbor 到 192.168.205.146,并把 devops-demo:v2 推送进去。