模块5:构建Docker镜像

导航 上一步:模块4:配置ALB Ingress 下一步:模块6:部署应用到K8s 返回主索引:阿里云ACK部署SOP 模块概述 预计时间:20分钟 本模块目标: ✅ 理解Docker镜像的基本概念 ✅ 编写Dockerfile(使用多阶段构建) ✅ 本地构建Docker镜像 ✅ 本地测试镜像 ✅ 推送镜像到阿里云ACR ✅ 验证镜像可用性 成本说明: ACR个人版:免费 镜像存储:免费(个人版有300GB免费额度) 镜像拉取:免费(同地域) 本模块预计成本:¥0 步骤5.1:理解Docker镜像 🎬 操作说明 在开始构建镜像之前,我们需要先理解Docker镜像的基本概念。这一步不需要操作,只需要理解核心概念。 📍 详细说明 什么是Docker镜像? Docker镜像是一个轻量级、可执行的独立软件包,包含运行应用所需的一切: 代码(你的应用程序) 运行时(如:Java、Python、Node.js) 系统工具和库 配置文件 镜像 vs 容器 概念 说明 类比 镜像(Image) 只读的模板,包含应用和依赖 类似于"类"(Class) 容器(Container) 镜像的运行实例 类似于"对象"(Object) 镜像的层级结构 Docker镜像由多个层(Layer)组成,每一层都是只读的: ┌─────────────────────────────┐ │ 你的应用代码(Layer 4) │ ← 最上层 ├─────────────────────────────┤ │ 应用依赖(Layer 3) │ ├─────────────────────────────┤ │ 运行时环境(Layer 2) │ ├─────────────────────────────┤ │ 基础操作系统(Layer 1) │ ← 最底层 └─────────────────────────────┘ 为什么使用分层结构? ...

2026-01-29 · maneng

Hugo博客迁移到阿里云ACK Kubernetes集群完整方案

方案概述 本文档提供Hugo博客从传统服务器部署迁移到阿里云ACK Kubernetes集群的完整技术方案,包括容器化、K8s资源配置、CI/CD流程改造和实战部署步骤。 架构对比 当前架构(传统部署): 本地开发 → Git推送 → GitHub Actions构建 → rsync同步 → Nginx服务器 → 用户访问 目标架构(K8s部署): 本地开发 → Git推送 → GitHub Actions构建 → Docker镜像 → 阿里云ACR → K8s集群 → Ingress → 用户访问 核心变化 维度 传统部署 K8s部署 部署方式 SSH + rsync kubectl apply 运行环境 直接在服务器 Docker容器 负载均衡 单机Nginx K8s Service + Ingress 扩展性 手动扩容 自动扩缩容 更新策略 直接覆盖 滚动更新 回滚 手动恢复 kubectl rollout undo 成本 ¥0/月 ¥200-500/月 一、容器化方案 1.1 Dockerfile设计(多阶段构建) 创建 docker/Dockerfile: ...

2026-01-29 · maneng

ACK部署SOP-01:准备工作(账号、工具、环境)

🎯 本章目标 完成阿里云ACK部署的所有准备工作,包括: ✅ 注册阿里云账号并完成实名认证 ✅ 充值账户并开通必要服务 ✅ 在本地安装kubectl命令行工具 ✅ 在本地安装Docker Desktop ✅ 验证所有工具安装成功 预计时间:30分钟 预计费用:¥0(仅充值,暂不产生费用) 📋 准备工作清单 在开始之前,请准备好: 一台电脑(Windows 10+、macOS 10.15+、或Linux) 稳定的网络连接 手机(用于接收验证码) 身份证(用于实名认证) 银行卡或支付宝(用于充值) 第一部分:阿里云账号准备 步骤1.1:注册阿里云账号 🎬 操作说明 如果你已经有阿里云账号,可以跳过这一步。如果没有,我们现在来注册一个。 📍 详细步骤 第1步:打开阿里云官网 在浏览器中输入:https://www.aliyun.com 按回车键访问阿里云官网 你会看到阿里云的首页,上面有很多产品介绍 第2步:点击注册按钮 在页面右上角,找到"免费注册"按钮 按钮通常是橙色或蓝色的,很显眼 点击"免费注册"按钮 第3步:选择注册方式 你会看到两种注册方式: 手机号注册(推荐) 邮箱注册 我们选择"手机号注册"(更方便) 第4步:填写注册信息 输入你的手机号码(11位数字) 点击"获取验证码"按钮 等待手机收到验证码(通常10秒内到达) 输入收到的6位验证码 设置登录密码(建议8位以上,包含字母和数字) 勾选"我已阅读并同意《阿里云服务协议》" 点击"注册"按钮 第5步:完成注册 注册成功后,页面会自动跳转 你会看到"注册成功"的提示 现在你已经有了一个阿里云账号 ✅ 验证点 确认收到阿里云的欢迎短信 确认可以用手机号和密码登录阿里云控制台 登录后能看到阿里云控制台首页 ⚠️ 常见问题 问题1:收不到验证码怎么办? ...

2026-01-29 · maneng

RocketMQ入门04:快速上手 - Docker一键部署与第一条消息

引言:5分钟上手 RocketMQ 不需要复杂的环境配置,不需要编译源码,通过 Docker,我们可以在 5 分钟内搭建一个完整的 RocketMQ 环境,并成功发送第一条消息。 让我们开始这段激动人心的旅程! 一、环境准备 1.1 前置要求 # 检查 Docker 版本(需要 20.10+) docker --version # Docker version 24.0.5, build ced0996 # 检查 Docker Compose 版本(需要 2.0+) docker-compose --version # Docker Compose version v2.20.2 # 检查系统资源 # 建议:4GB+ 内存,10GB+ 磁盘空间 docker system info | grep -E "Memory|Storage" 1.2 创建项目目录 # 创建项目目录 mkdir -p ~/rocketmq-demo cd ~/rocketmq-demo # 创建必要的子目录 mkdir -p data/namesrv/logs data/broker/logs data/broker/store mkdir -p conf 二、Docker Compose 部署 2.1 编写 docker-compose.yml # docker-compose.yml version: '3.8' services: # NameServer 服务 namesrv: image: apache/rocketmq:5.1.3 container_name: rocketmq-namesrv ports: - "9876:9876" environment: JAVA_OPT: "-Duser.home=/opt" JAVA_OPT_EXT: "-Xms512M -Xmx512M -Xmn128m" volumes: - ./data/namesrv/logs:/opt/logs command: sh mqnamesrv networks: - rocketmq-net # Broker 服务 broker: image: apache/rocketmq:5.1.3 container_name: rocketmq-broker ports: - "10909:10909" - "10911:10911" - "10912:10912" environment: JAVA_OPT_EXT: "-Xms1G -Xmx1G -Xmn512m" volumes: - ./data/broker/logs:/opt/logs - ./data/broker/store:/opt/store - ./conf/broker.conf:/opt/conf/broker.conf command: sh mqbroker -n namesrv:9876 -c /opt/conf/broker.conf depends_on: - namesrv networks: - rocketmq-net # 控制台服务 dashboard: image: apacherocketmq/rocketmq-dashboard:latest container_name: rocketmq-dashboard ports: - "8080:8080" environment: JAVA_OPTS: "-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" depends_on: - namesrv - broker networks: - rocketmq-net networks: rocketmq-net: driver: bridge 2.2 配置 Broker # conf/broker.conf cat > conf/broker.conf << 'EOF' # 集群名称 brokerClusterName = DefaultCluster # broker 名称 brokerName = broker-a # 0 表示 Master,>0 表示 Slave brokerId = 0 # 删除文件时间点,默认凌晨 4 点 deleteWhen = 04 # 文件保留时间,默认 48 小时 fileReservedTime = 48 # Broker 的角色 brokerRole = ASYNC_MASTER # 刷盘方式 flushDiskType = ASYNC_FLUSH # 存储路径 storePathRootDir = /opt/store # 队列存储路径 storePathCommitLog = /opt/store/commitlog # 自动创建 Topic autoCreateTopicEnable = true # 自动创建订阅组 autoCreateSubscriptionGroup = true # Broker 监听端口 listenPort = 10911 # 是否允许 Broker 自动创建 Topic brokerIP1 = broker EOF 2.3 启动服务 # 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 输出示例: # NAME IMAGE STATUS # rocketmq-namesrv apache/rocketmq:5.1.3 Up 30 seconds # rocketmq-broker apache/rocketmq:5.1.3 Up 20 seconds # rocketmq-dashboard apacherocketmq/rocketmq-dashboard:latest Up 10 seconds # 查看日志 docker-compose logs -f broker 三、发送第一条消息 3.1 创建 Java 项目 <!-- pom.xml --> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>rocketmq-demo</artifactId> <version>1.0.0</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- RocketMQ 客户端 --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client-java</artifactId> <version>5.0.5</version> </dependency> <!-- 日志 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> </dependencies> </project> 3.2 编写生产者代码 // QuickProducer.java package com.example.rocketmq; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.common.RemotingHelper; public class QuickProducer { public static void main(String[] args) throws Exception { // 1. 创建生产者,指定生产者组名 DefaultMQProducer producer = new DefaultMQProducer("quick_producer_group"); // 2. 指定 NameServer 地址 producer.setNamesrvAddr("localhost:9876"); // 3. 启动生产者 producer.start(); System.out.println("Producer Started."); // 4. 发送消息 for (int i = 0; i < 10; i++) { // 创建消息对象 Message msg = new Message( "QuickStartTopic", // Topic "TagA", // Tag ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) ); // 发送消息 SendResult sendResult = producer.send(msg); // 打印发送结果 System.out.printf("%s%n", sendResult); Thread.sleep(1000); } // 5. 关闭生产者 producer.shutdown(); System.out.println("Producer Shutdown."); } } 3.3 编写消费者代码 // QuickConsumer.java package com.example.rocketmq; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; import java.util.List; public class QuickConsumer { public static void main(String[] args) throws Exception { // 1. 创建消费者,指定消费者组名 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("quick_consumer_group"); // 2. 指定 NameServer 地址 consumer.setNamesrvAddr("localhost:9876"); // 3. 订阅 Topic 和 Tag consumer.subscribe("QuickStartTopic", "*"); // 4. 设置消费模式(默认集群模式) consumer.setMessageModel(MessageModel.CLUSTERING); // 5. 注册消息监听器 consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage( List<MessageExt> messages, ConsumeConcurrentlyContext context) { for (MessageExt message : messages) { System.out.printf("Consume message: %s%n", new String(message.getBody())); } // 返回消费状态:成功 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); // 6. 启动消费者 consumer.start(); System.out.println("Consumer Started."); // 保持运行 Thread.sleep(Long.MAX_VALUE); } } 四、运行测试 4.1 运行步骤 # 1. 先启动消费者(新终端) mvn compile exec:java -Dexec.mainClass="com.example.rocketmq.QuickConsumer" # 输出: # Consumer Started. # 等待消息... # 2. 启动生产者(新终端) mvn compile exec:java -Dexec.mainClass="com.example.rocketmq.QuickProducer" # 输出: # Producer Started. # SendResult [sendStatus=SEND_OK, msgId=7F00000100002A9F0000000000000000, ... # SendResult [sendStatus=SEND_OK, msgId=7F00000100002A9F00000000000000B8, ... # ... # Producer Shutdown. # 3. 查看消费者输出 # Consume message: Hello RocketMQ 0 # Consume message: Hello RocketMQ 1 # ... 4.2 使用控制台查看 打开浏览器访问:http://localhost:8080 ...

2025-11-13 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...