cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】

news2025/1/22 15:07:17

前言:这个系列将使用最前沿的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:latest
    ports:
      - "8080:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example


启动docker项目。

docker-compose up

上面的nginx,mysql都启动了。

如果没有这个文件,你每次启动,都需要

docker run -d \
  --name mydb \
  -e MYSQL_ROOT_PASSWORD=example \
  mysql:5.7

docker 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.7
    container_name: mysql
    ports:
      - "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.d
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - backend
    restart: always

  redis:
    image: redis:latest
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - /volume1/docker/gulimall/redis/data:/data
      - /volume1/docker/gulimall/redis/conf/redis.conf:/etc/redis/redis.conf
    command: ["redis-server","/etc/redis/redis.conf","--appendonly", "yes"] # 开启 Redis 持久化
    networks:
      - backend
    restart: always

networks:
  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

分别进入容器内部,测试下功能。
在这里插入图片描述

一切正常。

到此位置,商城环境已经搭建好咯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FPGA】MIPS 12条整数指令【1】

目录 修改后的仿真结果 修改后的完整代码 实现bgtz、bltz、jalr 仿真结果(有问题) bltz------并未跳转,jCe? 原因是该条跳转语句判断的寄存器r7,在该时刻并未被赋值 代码(InstMem修改前) i…

洛谷题目:P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包 题解 (本题较难)

题目传送门:P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 另:由于一些文章的疏忽,导致一些错别字,代码错误,公式错误导致大家的理解和误导,…

多线程之旅:线程安全问题

之前说到了多线程的创建和一些属性等等,接下来,就来讲讲多线程安全问题。 小编引入这段代码讲解下: public class Demo13 {public static int count0;public static void main(String[] args) throws InterruptedException {Thread t1new…

html学习笔记(3)

一、文本格式标签 效果标签&#xff08;旧版&#xff09;标签&#xff08;语义化&#xff0c;强调&#xff09;加粗<b><strong>倾斜<i><em>下划线<u><ins>删除线<s><del> 前面的标签 b 、 i 、 u 、 s 就仅仅是实现加粗、倾…

Postgresql源码(141)JIT系列分析汇总

JIT的东西比较零散&#xff0c;本篇对之前的一些列分析做个汇总、整理。 涉及&#xff1a; 《Postgresql源码&#xff08;113&#xff09;表达式JIT计算简单分析》 《Postgresql源码&#xff08;127&#xff09;投影ExecProject的表达式执行分析》 《Postgresql源码&#xff08…

Maven多环境打包方法配置

简单记录一下SpringBoot多环境打包配置方法&#xff0c;分部署环境和是否包含lib依赖包两个维度 目录 一、需求说明二、目录结构三、配置方案四、验证示例 一、需求说明 基于Spring Boot框架的项目分开发&#xff0c;测试&#xff0c;生产等编译部署环境&#xff08;每一个环境…

SDL2基本使用

前言 在这里记录SDL的环境基本搭建和使用&#xff0c;方便回忆。使用该图形库也是为了方便在没有单片机和显示模块的使用&#xff0c;也能对简单验证些关于图形构建或界面管理的猜想和测试&#xff0c;所以下述不会探讨过于深入的东西。当然&#xff0c;也可以通过SDL官网查看介…

【Linux系统编程】—— 从零开始实现一个简单的自定义Shell

文章目录 什么是自主shell命令行解释器&#xff1f;实现shell的基础认识全局变量的配置初始化环境变量实现内置命令&#xff08;如 cd 和 echo&#xff09;cd命令&#xff1a;echo命令&#xff1a; 构建命令行提示符获取并解析用户输入的命令执行内置命令与外部命令Shell的主循…

认识BOM

BOM 弹出层 可视窗口尺寸 屏幕宽高 浏览器内核和其操作系统的版本 剪贴板 是否允许使用cookie 语言 是否在线

[c语言日寄]结构体的使用及其拓展

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

Linux系统的第一个进程是什么?

Linux进程的生命周期从创建开始&#xff0c;直至终止&#xff0c;贯穿了一个进程的整个存在过程。我们可以通过系统调用fork()或vfork()来创建一个新的子进程&#xff0c;这标志着一个新进程的诞生。 实际上&#xff0c;Linux系统中的所有进程都是由其父进程创建的。 既然所有…

5. 马科维茨资产组合模型+AI金融智能体(qwen-max)识别政策意图方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…

PostMan最新版本及离线安装指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;PostMan是一款流行的API测试工具&#xff0c;它提供了一个直观的用户界面&#xff0c;方便Web开发者和测试人员进行接口测试。本文将指导你如何安装最新版的PostMan&#xff0c;包括在线安装和离线安装两种方法。…

记录一次k8s起不来的排查过程

我在k8s集群&#xff0c;重启了一个node宿主机&#xff0c;竟然发现kubelet起不来了&#xff01;报错如下 这个报错很模糊&#xff0c;怎么排查呢。这样&#xff0c;开两个界面&#xff0c;一个重启kubelet&#xff0c;一个看系统日志(/var/log/message:centos&#xff0c;/va…

grafana + Prometheus + node_exporter搭建监控大屏

本文介绍生产系统监控大屏的搭建&#xff0c;比较实用也是实际应用比较多的方式&#xff0c;希望能够帮助大家对监控系统有一定的认识。 0、规划 grafana主要是展示和报警&#xff0c;Prometheus用于保存监控数据&#xff0c;node_exporter用于实时采集各个应用服务器的事实状…

2024年博客之星主题创作|从零到一:我的技术成长与创作之路

2024年博客之星主题创作&#xff5c;从零到一&#xff1a;我的技术成长与创作之路 个人简介个人主页个人成就热门专栏 历程回顾初来CSDN&#xff1a;怀揣憧憬&#xff0c;开启创作之旅成长之路&#xff1a;从平凡到榜一的蜕变持续分享&#xff1a;打卡基地与成长复盘四年历程&a…

Golang的网络编程安全

Golang的网络编程安全 一、Golang网络编程的基本概念 作为一种现代化的编程语言&#xff0c;具有优秀的并发特性和网络编程能力。在Golang中&#xff0c;网络编程是非常常见的需求&#xff0c;可以用于开发各种类型的网络应用&#xff0c;比如Web服务、API服务、消息队列等。Go…

【2024年华为OD机试】(C/D卷,200分)- 5G网络建设 (JavaScriptJava PythonC/C++)

一、问题描述 题目描述 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N。接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通。不同基站之间假设光纤的成本各不相同&#xff0c;且有些节点之间已经存在光纤相连。 …

消息队列篇--原理篇--RabbitMQ和Kafka对比分析

RabbitMQ和Kafka是两种非常流行的消息队列系统&#xff0c;但它们的设计哲学、架构特点和适用场景存在显著差异。对比如下。 1、架构设计 RabbitMQ&#xff1a; 基AMQP协议&#xff1a;RabbitMQ是基于AMQP&#xff08;高级消息队列协议&#xff09;构建的&#xff0c;支持多…

玻璃样式的登录界面

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 先看样式: 源码: <div class="wrapper">