cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】
前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。
本项目将基于谷粒商城项目,并且对谷粒商城项目进行二次重构,使其满足最新的主流技术栈要求。
上篇文章介绍了vagrant技术快速构建虚拟机。这篇文章我们开始介绍docker容器化技术,使用docker部署我们项目需要的环境。这篇文章真正的面向0基础的读者。但是,我们并不会花大的时间代价,而是快速带你掌握工作中,真正可以用到的技术。
docker官方教程:https://docs.docker.com/
1、为什么需要docker
docker会将我们软件相关的配置文件、启动命令等全部打包。这样,我们可以在任何环境中,加载这个打包箱子,无需重新配置,直接运行。完全还原我们的软件环境。
举个栗子。这是我们之前运行一个软件的传统方式。
有了docker以后,正确打开方式是这样的。
又快又好不出错。
2、docker与虚拟机的区别
虚拟机,相当于计算机的分身术。
它有啥缺点呢?虚拟机会启动一个完整的操作系统,占用计算机资源多,启动速度慢。
但其实我们并不需要它启动完整的操作系统,比如之前的例子,我们只需要一个web服务器。
docker解决了这一问题。更快,更好,一个服务器,可以启动更多的docker容器。这是因为它更加轻量级。
3、docker的基本概念
下面这个图可以大概看看,看不懂也没关系。
镜像(images)是一个只读的模板,包含了应用程序及其依赖的环境(如操作系统、库、工具等)。镜像是容器的基础,它定义了容器应该如何启动。可以把镜像看作是应用程序的“蓝图”,它描述了容器的运行环境和程序的配置。镜像可以通过 Dockerfile 构建,也可以从 Docker Hub(官方的镜像仓库)拉取。
容器(containers)是镜像的一个实例,是镜像在执行时的“运行时环境”。容器是一个隔离的环境,在其中应用可以独立运行。容器会启动镜像并允许应用程序在其中执行。容器是轻量级的,它比传统虚拟机启动速度更快,并且资源开销更小。
总结:镜像是模板,容器是示例,对应java,可以类比类和对象。
仓库:存储docker镜像的地方。最常见的是dockerhub(https://www.docker.com/products/docker-hub/)。类似拉取代码的github。
4、docker安装
4.1 linux下docker安装(该项目使用)
进入我们的虚拟机
vagrant up
vagrant ssh
由于某些网络原因,需要对虚拟机中centos换源。
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 下面镜像源如果不可用,自行网上找一个
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum clean all
sudo yum makecache
sudo yum update
安装docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
启动docker
sudo systemctl start docker
#开机自启动
#sudo systemctl enable docker
验证 Docker 安装
sudo docker --version
参考官方文档:https://docs.docker.com/engine/install/centos/
4.2 windows/mac操作系统下docker安装(补充)
对于windows或者mac
官网下载,傻瓜式安装。https://www.docker.com/。注意Windows家庭版不支持docker!!!
因为我的计算机是windows,我就下载windows。
这里补充一个小知识。amd64和arm64的区别。
这里amd64,就是我们常说的x86_64。ARM64 和 AMD64(或 x86_64)是两种不同的处理器架构,它们在设计、性能、应用场景等方面有显著区别。ARM64 架构强调低功耗和高集成度,适合于移动设备和嵌入式系统。AMD64 架构则侧重于高性能计算,广泛用于台式机、笔记本和服务器中。
你可以控制台查看你到底是啥架构。一般笔记本都是x86(AMD64)
C:\Users\半旧>echo %PROCESSOR_ARCHITECTURE%
AMD64
下载后,启动下docker。如果是windows的电脑,需要提前启动Hyper-V服务。(注意:windows家庭版不支持Hyper-V,所以也不支持docker服务
)
4.3 docker换源
由于网络原因,需要对docker换源,下面源25年1 月 21 日确认可用:https://docker.xuanyuan.me。如失效,自己找一个。
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo vi /etc/docker/daemon.json
修改文件内容:
{"registry-mirrors": ["https://docker.xuanyuan.me"]
}
重启docker服务
sudo systemctl restart docker
验证是否生效。
sudo docker info
5、容器化和Dockerfile
前面我们提到,容器的作用就是打包项目及其需要的环境、配置等。具体怎么做?
所谓Dockerfile,其实就是一个配置文件,包括一些打包需要的内容。
下面我们演示个实际的demo。看看这一个过程。
创建一个hellodocker文件夹。编写index.js一个简单的代码。
console.log("hello,docker")
我们电脑已经安装过node了(参考下面博客第三节:https://blog.csdn.net/qq_41708993/article/details/145163210?spm=1001.2014.3001.5501)。
可以执行node index.js看到输出结果。
现在我们如果需要在另一个地方(比如生产中,需要把程序员电脑的代码在服务器上执行)运行我们的代码,需要:
现在,我们把这些步骤写到Dockerfile中。
在项目的根目录下创建Dockerfile
FROM node:18-alpine
COPY index.js /index.js
CMD ["node", "index.js"]
打包。
查看是否生成成功。
运行。
可以把镜像上传到dockerhub。这里我们就不展开了。
docker push your-username/your-image-name:tag
6、在线docker实验学习平台
我们可以在线运行我们的docker镜像。https://labs.play-with-docker.com/
Play with Docker(PWD)是一个由 Docker 社区成员开发的在线平台,旨在为用户提供一个无需安装即可体验和学习 Docker 的环境。
主要特点:
在线实验环境:用户可以在浏览器中直接运行 Docker 命令,体验容器的构建、运行和管理。
支持 Docker Swarm 模式:PWD 允许用户创建和管理 Docker Swarm 集群,体验容器编排和集群管理功能。
交互式教程:平台提供了丰富的自学教程,涵盖从基础到高级的 Docker 使用场景,帮助用户深入了解 Docker 的各项功能。
操作下从dockerhub拉取镜像,点击start登录后,按下图操作。
7、镜像拉取、容器运行
测试下拉取镜像。
运行容器。
8、DockerCompose简介
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 通过 Compose,您可以使用 YAML 文件来配置应用程序所需的所有服务,然后使用一个命令从该配置文件中创建并启动所有服务。 这使得管理复杂的多容器应用变得更加简单和高效。
下面实际操作下,你就理解它有啥用了。
编写compose.yaml
version: '3'
services:web:image: nginx:latestports:- "8080:80"db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: example
启动docker项目。
docker-compose up
上面的nginx,mysql都启动了。
如果没有这个文件,你每次启动,都需要
docker run -d \--name mydb \-e MYSQL_ROOT_PASSWORD=example \mysql:5.7docker run -d \--name mynginx \-p 8080:80 \--link mydb:db \nginx:latest
而且你第一次运行,还需要docker pull拉取镜像。就问你烦不烦。
到现在为止,你就已经会用docker了。其它的内容,我们只需要在实际实战中,用一用,你就都会了,不会也没关系,查一查。下面,回到我们的主线任务吧。
9、docker安装mysql、redis(谷粒商城环境搭建)
编写compose.yaml
version: '3'
services:mysql:image: mysql:5.7container_name: mysqlports:- "3306:3306"volumes:- /volume1/docker/gulimall/mysql/log:/var/log/mysql- /volume1/docker/gulimall/mysql/data:/var/lib/mysql- /volume1/docker/gulimall/mysql/conf:/etc/mysql/conf.denvironment:MYSQL_ROOT_PASSWORD: rootnetworks:- backendrestart: alwaysredis:image: redis:latestcontainer_name: redisports:- "6379:6379"volumes:- /volume1/docker/gulimall/redis/data:/data- /volume1/docker/gulimall/redis/conf/redis.conf:/etc/redis/redis.confcommand: ["redis-server","/etc/redis/redis.conf","--appendonly", "yes"] # 开启 Redis 持久化networks:- backendrestart: alwaysnetworks:backend:driver: bridge
稍微解释下这个文件。
MySQL 配置:
使用 mysql:5.7 镜像。 将 MySQL 的端口映射到宿主机的 3306。 配置了三个卷: log:用于持久化 MySQL
日志文件。 data:用于持久化 MySQL 数据文件。 conf:用于持久化 MySQL 配置文件。 设置环境变量
MYSQL_ROOT_PASSWORD 来初始化数据库的 root 密码。 设置 restart: always,确保容器在失败时自动重启。
Redis 配置:使用 redis:latest 镜像。 将 Redis 的端口映射到宿主机的 6379。 配置了持久化,指定 --appendonly
yes 参数开启 AOF 持久化。 持久化的 Redis 数据存储在 /volume1/docker/gulimall/redis/data
目录下。 网络配置:使用了 backend 网络(桥接模式)来确保 MySQL 和 Redis 服务可以相互访问。
由于使用了挂载命令,需要保证宿主机上,下面的目录或者文件存在,请自行创建。
mkdir -p /volume1/docker/gulimall/mysql/log
mkdir -p /volume1/docker/gulimall/mysql/data
mkdir -p /volume1/docker/gulimall/mysql/conf
mkdir -p volume1/docker/gulimall/redis/data
touch /volume1/docker/gulimall/conf/conf/redis.conf
启动。
测试下吧。首先,确保容器是正常的。
root@ubuntu-Inspiron-16-5630:/volume1/docker/gulimall# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2d00947dcb7 mysql:5.7 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
7d4f79fddf23 redis:latest "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
分别进入容器内部,测试下功能。
一切正常。
到此位置,商城环境已经搭建好咯。
相关文章:

cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】
前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…...
高等数学学习笔记 ☞ 微分方程
1. 微分方程的基本概念 1. 微分方程的基本概念: (1)微分方程:含有未知函数及其导数或微分的方程。 举例说明微分方程:;。 (2)微分方程的阶:指微分方程中未知函数的导数…...
【探索 Kali Linux】渗透测试与网络安全的终极操作系统
探索 Kali Linux:渗透测试与网络安全的终极操作系统 在网络安全领域,Kali Linux 无疑是最受欢迎的操作系统之一。无论是专业的渗透测试人员、安全研究人员,还是对网络安全感兴趣的初学者,Kali Linux 都提供了强大的工具和灵活的环…...

四方连续贴图是什么意思
上下左右四个方向都是连续的图案,是由一个纹样或几个纹样组成一个单位,向四周重复地连续和延伸扩展而成的图案形式...

RKNN_C++版本-YOLOV5
1.背景 为了实现低延时,所以开始看看C版本的rknn的使用,确实有不足的地方,请指正(代码借鉴了rk官方的仓库文件)。 2.基本的操作流程 1.读取模型初始化 // 设置基本信息 // 在postprocess.h文件中定义,详见…...
k8s优雅重启
理论上处于terminating状态的pod,k8s 就会把它从service中移除了,只用配置一个优雅停机时长就行了。kubectl get endpoints 验证 因此,优雅重新的核心问题,是怎么让空闲长连接关闭,再等待处理中的请求执行完。 一些底…...
三高“高性能、高并发、高可靠”系统架构设计系列文章
目录 高并发系统的艺术:如何在流量洪峰中游刃有余 《数据密集型应用系统设计》读后感与高并发高性能实践案例 系统稳定性与高可用保障的几种思路 软件系统限流的底层原理解析 技术解决方案调研 延迟队列调研 重试调研 异步回调调研 分库分表调研 分布式事…...

opengrok_使用技巧
Searchhttps://xrefandroid.com/android-15.0.0_r1/https://xrefandroid.com/android-15.0.0_r1/ 选择搜索的目录(工程) 手动在下拉框中选择,或者 使用下面三个快捷按钮进行选择或者取消选择。 输入搜索的条件 搜索域说明 域 fullSearc…...
C++资料
InterviewGuide 首页 - 八股精 Releases halfrost/LeetCode-Go GitHub GitHub - GrindGold/CppGuide: 「C/C学习面试指南」一份涵盖大部分 C 程序员所需要掌握的知识。入门、进阶、深入、校招、社招,准备 C 学习& 面试,首选 CppGuide࿰…...

基于模糊PID的孵化箱温度控制系统(论文+源码)
1系统方案设计 本课题为基于模糊PID的孵化箱温度控制系统,其以STM32最小系统与模糊PID控制器为控制核心。系统主要包括数据采集模块、处理器模块、电机控制模块。 数据采集模块由温度传感器构成,通过温度传感器感应温度变化,获得待处理的数据…...

景联文科技加入AIIA联盟数据标注分委会
2025年1月16日,中国人工智能产业发展联盟(简称AIIA)数据委员会数据标注分委会(以下简称“分委会”)正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…...

1-1 飞机大战项目框架搭建
前言: 基于本人巩固C语言编写,仅供学习参考 1.0 框架搭建 搭建完成后状态 C语言飞机大战框架 使用loadimage时出现波浪线的错误如何解决,这个问题主要是编码格式不对造成的,我们需要修改系统的编码格式,将unicode编码格…...

【C++高并发服务器WebServer】-7:共享内存
本文目录 一、共享内存1.1 shmget函数1.2 shmat1.3 shmdt1.4 shmctl1.5 ftok1.6 共享内存和内存映射的关联1.7 小demo 二、共享内存操作命令 一、共享内存 共享内存允许两个或者多个进程共享物理内存的同一块区域(通常被称为段)。由于一个共享内存段会称…...

RabbitMQ 多种安装模式
文章目录 前言一、Windows 安装 RabbitMq1、版本关系2、Erlang2.1、下载安装 Erlang 23.12.2、配置 Erlang 环境变量 3、RabbitMQ3.1、下载安装 RabbitMQ 3.8.93.2、环境变量3.3、启动RabbitMQ 管理插件3.3、RabbitMQ3.4、注意事项 二、安装docker1、更新系统包:2、…...
C++ 包装器与绑定器的应用之回调函数的实现
回调函数的实现 在消息队列和网络库的框架中,当接收到消息(报文)时,回调用户自定义的函数对象,把消息(报文)参数传给它,由它决定如何处理。 queue参考文章:C queue(STL queue&…...
Baichuan大模型Base、Chat、Instruct等版本的区别
Baichuan大模型Base与Instruct等版本的区别解析 Baichuan大模型作为国内领先的开源语言模型,其不同版本(如Base、Chat、Instruct等)在训练目标、应用场景和性能特点上存在显著差异。以下是基于公开技术文档和行业分析的详细对比:…...
3.DrawCall的概念
DrawCall是渲染管线中的一个重要概念,指的是CPU向GPU发送的一个绘制命令,告诉GPU:“请根据我提供的数据,画一个物体(或一部分物体)。” 通俗易懂讲解:DrawCall就像给画师下订单 想象你是一个老…...
ubuntu电脑调用摄像头拍摄照片
一、 1、先装环境 conda create -n text python3.8 -y conda activate text 2、 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 1、连接摄像头拍摄收集数据集 capture_image5.py import cv2 as cv import os import datetime import n…...
PyQt4 的图片切割编辑器
一、 编辑器功能明确 允许用户加载图片、选择切割模式、对切割后的图片片段进行操作(如移动、复制、粘贴、删除等),并支持撤销和重做操作。 环境:Py2.7 PyQt 4.11 二、导入模块介绍 sys: 用于访问与 Python 解释器强相关的变…...

mac 电脑上安装adb命令
在Mac下配置android adb命令环境,配置方式如下: 1、下载并安装IDE (android studio) Android Studio官网下载链接 详细的安装连接请参考 Mac 安装Android studio 2、配置环境 在安装完成之后,将android的adb工具所在…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...