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安装(该项目使用)

进入我们的虚拟机

shell 复制代码
vagrant up
vagrant ssh

由于某些网络原因,需要对虚拟机中centos换源。

shell 复制代码
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

shell 复制代码
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

shell 复制代码
sudo systemctl start docker
#开机自启动
#sudo systemctl enable docker

验证 Docker 安装

shell 复制代码
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)

bash 复制代码
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。如失效,自己找一个。

shell 复制代码
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo vi /etc/docker/daemon.json

修改文件内容:

json 复制代码
{
  "registry-mirrors": ["https://docker.xuanyuan.me"]
}

重启docker服务

shell 复制代码
sudo systemctl restart docker

验证是否生效。

shell 复制代码
sudo docker info

5、容器化和Dockerfile

前面我们提到,容器的作用就是打包项目及其需要的环境、配置等。具体怎么做?

所谓Dockerfile,其实就是一个配置文件,包括一些打包需要的内容。

下面我们演示个实际的demo。看看这一个过程。

创建一个hellodocker文件夹。编写index.js一个简单的代码。

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。这里我们就不展开了。

shell 复制代码
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

yaml 复制代码
version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

启动docker项目。

shell 复制代码
docker-compose up

上面的nginx,mysql都启动了。

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

shell 复制代码
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

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 服务可以相互访问。

由于使用了挂载命令,需要保证宿主机上,下面的目录或者文件存在,请自行创建。

shell 复制代码
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

启动。

测试下吧。首先,确保容器是正常的。

shell 复制代码
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

分别进入容器内部,测试下功能。

一切正常。

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

相关推荐
快乐非自愿24 分钟前
Spring Boot集成Spring Security之HTTP请求授权
spring boot·spring·http
张烫麻辣亮。1 小时前
【教程】使用docker+Dify搭建一个本地知识库
运维·docker·容器
代码小白%1 小时前
快速理解Spring 和 Spring Boot 的核心区别
java·spring boot·spring
不是笨小孩i1 小时前
如何使用Docker一键本地化部署LibrePhotos搭建私有云相册
运维·docker·容器
虎鲸不是鱼2 小时前
【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建
java·spring boot·spring·maven·mybatis
网络点点滴3 小时前
重构MVC
重构·mvc
nfenghklibra3 小时前
Docker安装Mysql
mysql·docker
csdn5659738504 小时前
AI 时代下,操作系统如何进化与重构?
人工智能·重构·操作系统
流情4 小时前
【Docker】Linux部署web版Firefox
linux·前端·docker
iteye_103924 小时前
docker 部署 rocketmq
docker·eureka·rocketmq