前置
在 centos 中先提前处理一些前置问题:
新安装的centos7.9 执行命令 sudo yum update -y 报错:
Cannot find a valid baseurl for repo: base/7/x86_64
解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| su - root
cd /etc/yum.repos.d/
mkdir backup mv CentOS-*.repo backup/
curl -o CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i 's/$releasever/7.9.2009/g' CentOS-Base.repo
yum clean all yum makecache
sudo yum update -y
|
安装 Docker
安装并设置开机自启
1 2 3 4 5 6 7 8 9 10 11 12
| sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io -y
sudo systemctl start docker
sudo docker run hello-world
sudo systemctl enable docker
|
解决获取 GPG 密钥失败
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| su - root
rm -f /etc/yum.repos.d/docker-ce.repo
cat > /etc/yum.repos.d/docker-ce.repo <<'EOF' [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg EOF
yum clean all yum makecache
yum install docker-ce docker-ce-cli containerd.io -y
|
切换国内镜像源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| docker run hello-world
Unable to find image 'hello-world:latest' locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": read tcp 192.168.40.128:49142->3.216.35.38:443: read: connection reset by peer. See 'docker run --help'.
su - root
vi /etc/docker/daemon.json
{ "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://docker.registry.cyou", "https://docker-cf.registry.cyou", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://mirror.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://mirror.iscas.ac.cn", "https://docker.rainbond.cc" ] }
systemctl daemon-reload systemctl restart docker
docker info
docker run hello-world
|
Dockerfile+AI
使用 ai 生成,方便快捷。
vue 项目提示词:
1 2 3 4 5 6 7 8 9 10 11 12
| 请为我的 Vue3 + Vite 前端项目生成一个生产环境可用的 Dockerfile。 要求: 1. 使用多阶段构建:node 环境构建,nginx 运行 2. 基础镜像使用 node:22-alpine(构建) + nginx:alpine(运行) 3. 工作目录 /app 4. 先复制 package.json 和 package-lock.json 再 install,利用缓存 5. 执行 npm install && npm run build 6. 构建产物 dist 目录拷贝到 nginx 的 /usr/share/nginx/html 7. 暴露 80 端口 8. 镜像最小化、安全、无冗余 9. 可以直接用于生产环境 10. 给我完整可直接使用的 Dockerfile,不要解释,只要代码
|
java springboot 项目提示词:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 请为我的 JDK 21 + SpringBoot 3.x 后端项目生成一个生产级 Dockerfile。 要求: 1. 使用多阶段构建:Maven 构建 + JRE 运行 2. 构建镜像:maven:eclipse-temurin-21-alpine 3. 运行镜像:eclipse-temurin:21-jre-alpine(最精简) 4. 工作目录 /app 5. 先复制 pom.xml 进行依赖下载,利用 docker 缓存 6. 再复制源码,执行 mvn clean package -DskipTests 7. 拷贝 target/*.jar 到运行阶段 8. 暴露端口 8080 9. 使用 java -jar 启动 10. 镜像最小化、生产可用、无冗余 11. 给我完整可直接使用的 Dockerfile,只要代码,不要解释
|
如果是前后端一体:
1 2 3 4 5 6 7 8 9
| 请为我的前后端分离项目生成完整的 Docker 部署文件,包括: 1. 前端 Vue3 + Vite 项目的 Dockerfile(多阶段、nginx、node22、alpine) 2. 后端 JDK21 + SpringBoot3 项目的 Dockerfile(多阶段、maven、jre21、alpine) 3. docker-compose.yml,包含 frontend 和 backend 两个服务 4. 所有镜像都使用 alpine 精简版 5. 前端端口 80 6. 后端端口 8080 7. 生产环境可用,最小化镜像,安全规范 8. 不要解释,直接给我完整文件代码
|
docker 多节点部署+nginx负载均衡
主流实现架构
1
| 浏览器 → Nginx(负载均衡 轮询)→ 节点1 + 节点2
|
节点 1:quick-create-so-1(你的 node 项目)
节点 2:quick-create-so-2
Nginx:自动把请求轮流分发到两个节点(默认就是轮询)
具体步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| docker rm -f quick-create-so quick-create-so-1 quick-create-so-2 nginx-lb
docker run -d \ --name quick-create-so-1 \ quick-create-so:latest
docker run -d \ --name quick-create-so-2 \ quick-create-so:latest
mkdir -p /home/nginx/conf.d
cat > /home/nginx/conf.d/default.conf <<EOF upstream backend { server quick-create-so-1:8888; server quick-create-so-2:8888; }
server { listen 80;
location / { proxy_pass http://backend; proxy_set_header Host \$host; } } EOF
docker run -d \ -p 80:80 \ --name nginx-lb \ -v /home/nginx/conf.d:/etc/nginx/conf.d \ --link quick-create-so-1 \ --link quick-create-so-2 \ nginx
|
最后那个 nginx 是 Docker 镜像名:
- Docker 会自动去 Docker Hub 拉取官方 Nginx 镜像(如果本地没有);
- 这个镜像里已经打包好了 Nginx 程序和运行环境;
- 启动容器 = 启动一个独立、隔离的 Nginx 实例,和宿主机有没有装 Nginx 完全没关系。
一句话:宿主机只需要有 Docker,不需要有 Nginx。
测试负载均衡: 不用加端口 8888
http://192.168.40.128
刷新几次 → 你会看到请求轮流打到节点 1、节点 2、节点 1、节点 2……
这就是 默认轮询负载均衡。
docker 多节点部署+nacos负载均衡
主流实现架构
1 2 3 4 5
| 浏览器 → 网关 / 负载均衡组件 ↓ (自动从 Nacos 拿服务列表) Nacos(服务注册中心) ↓ ↓ 服务1 服务2 服务3...(自动注册、自动发现)
|
优势:
- 不用手动改 Nginx 配置
- 启动新服务自动注册到 Nacos
- 负载均衡自动轮询(默认就是)
- 服务挂了自动剔除
默认行为:
- 服务启动 → 自动注册到 Nacos
- 网关 / OpenFeign → 自动从 Nacos 拉取服务列表
- 默认负载均衡策略 = 轮询
- 扩缩节点 完全自动
具体步骤
你唯一要做的:启动多个相同服务实例即可
1 2
| docker run -d --name node1 你的服务 docker run -d --name node2 你的服务
|
它们会自动变成一个集群。
这才是公司微服务真正的负载均衡流程:
- 两个节点都注册到 Nacos
- 调用方(前端 / 网关 / 其他微服务)去 Nacos 拿地址列表
- 本地自动轮询调用
- 增加节点 → Nacos 自动发现
- 节点挂了 → Nacos 自动剔除
全程不需要改任何配置文件!
不加 Nacos:用 Nginx 手动配置节点列表
加了 Nacos:自动服务发现 + 自动负载均衡(轮询)
不用改配置,不用维护 IP,不用重启负载均衡
这就是生产环境标准玩法
附:脚本1
docker 构建并运行:
1
| read name && echo "你的项目名是: $name" && echo "构建镜像: $name" && docker build -t "$name:latest" . && echo "启动容器: $name" && docker rm -f "$name" && docker run -d -p 8888:8888 --name "$name" "$name:latest" && echo "运行成功!访问: http://192.168.xx.xxx:8888"
|
该脚本是直接删除容器和镜像,然后构建镜像运行到容器,使用的都是 latest 版本,如果使用标准版本号 x.y.z 会更贴近于生产环境。
docker 进入容器bash:
1
| docker exec -it [container] /bin/sh
|
docker 重启docker服务:
1
| systemctl daemon-reload && systemctl restart docker
|
docker 强制删除使用镜像的容器:
1 2
| docker rm -f $(docker ps -a -q --filter ancestor=容器名:latest) docker rmi -f 镜像名
|
附:脚本2
以 quick-create-so 这个 node 小项目为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
docker rm -f quick-create-so-1 quick-create-so-2 nacos nginx-lb
echo "正在启动 Nacos..." docker run -d \ --name nacos \ -p 8848:8848 \ -e MODE=standalone \ nacos/nacos-server:v2.2.3
echo "正在启动服务节点 1..." docker run -d \ --name quick-create-so-1 \ -e NACOS_SERVER=192.168.40.128:8848 \ quick-create-so:latest
echo "正在启动服务节点 2..." docker run -d \ --name quick-create-so-2 \ -e NACOS_SERVER=192.168.40.128:8848 \ quick-create-so:latest
echo "正在启动 Nginx 负载均衡..." mkdir -p /home/nginx/conf.d cat > /home/nginx/conf.d/default.conf <<EOF upstream service { server quick-create-so-1:8888; server quick-create-so-2:8888; } server { listen 80; location / { proxy_pass http://service; proxy_set_header Host \$host; } } EOF
docker run -d \ --name nginx-lb \ -p 80:80 \ -v /home/nginx/conf.d:/etc/nginx/conf.d \ --link quick-create-so-1 \ --link quick-create-so-2 \ nginx
echo -e "\n✅ 部署完成!" echo -e "🌐 访问地址(自动轮询):http://192.168.40.128" echo -e "🔧 Nacos 控制台:http://192.168.40.128:8848/nacos" echo -e "默认账号:nacos / 密码:nacos"
|
扩展
如果节点更多,那就需要引入 k8s 这种重量级的中间件来进行管理服务节点。