DevOps 实验阶段四:Infra 节点 + MySQL + Spring Boot 容器化

DevOps 实验阶段四:Infra 节点 + MySQL + Spring Boot 容器化

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 推送进去。

相关推荐
咖啡八杯1 小时前
统一返回对象设计:AjaxResult 与 R 的取舍
java·spring boot·框架·若依·返回值
是枚小菜鸡儿吖4 小时前
把视频教程变成可复习的笔记:Docker 部署 BiliNote,自动转写与总结
笔记·docker·容器
运维全栈笔记4 小时前
Vue + Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2)
运维·服务器·vue.js·spring boot·笔记·开源·开源软件
ICollection5 小时前
4060笔记本用Docker部署ComfyUI绘图
docker·comfyui
凤山老林11 小时前
Spring Boot 3.x AOT 编译实战:从原理、踩坑到生产落地
java·spring boot·后端
呆呆小孩12 小时前
零基础学 MySQL(上):从建库建表到增删改查,一篇搭好 SQL 基础
android·sql·mysql
摇滚侠12 小时前
《SpringBoot 3:入门与应用实战》第 5 章 使用 Spring Boot 阅读笔记 9
java·spring boot·笔记
淼澄研学12 小时前
Proliferate开源框架技术解析与Docker部署实操
docker·容器·开源
浪兎兎13 小时前
Docker 容器技术笔记
笔记·docker·容器