1. 什么是容器
容器是一种轻量级的、可移植的、自包含的软件单元,它包含运行应用程序所需的所有内容,包括代码、运行时、系统工具、系统库和设置。容器与虚拟机类似,但它们更加轻量级,并且依赖于宿主内核。容器可以使用 Docker 等工具进行创建、管理和部署。
容器的优势:
-
轻量级: 容器比虚拟机更轻量级,因为它们不需要包含完整的操作系统。
-
可移植: 容器可以在任何支持 Docker 的平台上运行,而无需进行修改。
-
快速启动: 容器启动速度比虚拟机快得多。
-
资源隔离: 容器可以相互隔离,并限制其使用的资源。
-
易于管理: 容器可以使用 Docker 等工具进行轻松管理。
2. 容器与虚拟机的区别
容器和虚拟机都是用于运行应用程序的技术,但它们之间存在一些关键差异:
\ | 容器 | 虚拟机 |
---|---|---|
虚拟化级别 | 操作系统级别 | 硬件级别 |
依赖性 | 依赖于宿主内核 | 拥有独立的内核 |
体积 | 轻量级 | 较重 |
启动速度 | 快 | 慢 |
资源消耗 | 低 | 高 |
3. Docker 镜像与容器的基本概念
Docker 镜像: 镜像是一个只读的模板,它包含构建容器所需的所有文件和配置。镜像可以从 Docker Hub 等公共仓库下载,也可以自行构建。
Docker 容器: 容器是镜像的运行实例,它是一个独立的、沙盒化的环境,拥有自己的文件系统、网络、进程空间等。容器可以创建、启动、停止、删除等。
4. Docker 的基本命令
-
docker images: 查看本地镜像
-
docker pull: 拉取镜像
-
docker push: 推送镜像
-
docker build: 构建镜像
-
docker run: 运行容器
-
docker ps: 查看运行中的容器
-
docker stop: 停止容器
-
docker rm: 删除容器
-
docker exec: 进入容器
-
docker logs: 查看容器日志
5. 在不同操作系统上安装 Docker
5.1 Linux 安装 Docker
下载安装包:
-
从 Docker 官网下载适用于您 Linux 发行版的安装包:https://www.docker.com/get-started
-
也可以使用以下命令下载最新版本的 Docker 社区版 (CE):
curl -fsSL https://get.docker.com | sh
安装 Docker:
-
按照下载脚本的说明进行安装
-
对于某些发行版,可能需要额外添加用户组:
sudo groupadd docker
sudo usermod -aG docker $USER
验证安装:
docker version
5.2 Windows 安装 Docker
下载安装包:
-
从 Docker 官网下载适用于 Windows 的 Docker Desktop 安装程序:https://www.docker.com/get-started
安装 Docker Desktop:
-
运行安装程序并按照说明进行安装
-
安装过程中需要配置 WSL 2 和 Hyper-V
验证安装:
docker version
5.3 macOS 安装 Docker
下载安装包:
-
从 Docker 官网下载适用于 macOS 的 Docker Desktop 安装程序:https://www.docker.com/get-started
安装 Docker Desktop:
-
运行安装程序并按照说明进行安装
验证安装:
docker version
6. Docker 基本配置
6.1 配置镜像加速器:
-
镜像加速器可以提高镜像拉取速度,建议配置国内镜像加速器,例如阿里云镜像加速器:
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
-
将上述内容写入
~/.docker/daemon.json
文件
6.2 配置日志和存储:
-
可以通过
--log-opt
参数配置容器日志的存储位置和格式 -
可以通过
-v
参数将宿主目录挂载到容器中,用于持久化数据存储
使用案例:
-
使用 Docker 运行一个简单的 Web 应用程序:
# 拉取 Nginx 镜像
docker pull nginx# 运行 Nginx 容器
docker run -p 80:80 nginx
-
访问
http://localhost:80
即可看到 Nginx 的欢迎页面
7.Docker 容器生命周期管理
7.1. 创建容器
7.1.1 使用 docker create
命令
docker create
命令用于创建容器,但不启动容器。该命令允许用户指定镜像、配置参数、挂载数据卷等,为容器的启动做好准备。
命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明:
-
OPTIONS: 创建容器的选项,例如
-p
端口映射、-v
数据卷挂载、-e
环境变量设置等 -
IMAGE: 要创建的镜像名称
-
COMMAND: 容器启动时要执行的命令
-
ARG: 传递给容器的参数
最佳实践:
-
使用
docker inspect
命令检查容器配置是否符合预期。 -
尽量使用配置文件而非命令行参数进行配置,以提高可读性和维护性。
-
仅在必要时才指定
COMMAND
和ARG
参数,以便保持容器的灵活性。
7.1.2 使用 Dockerfile 构建镜像
Dockerfile 是一种文本文件,用于定义镜像的构建过程。通过编写 Dockerfile,可以自动化镜像构建过程,并确保镜像的一致性和可重复性。
Dockerfile 示例:
FROM nginx
RUN echo "Hello World" > index.html
最佳实践:
-
使用多阶段构建优化镜像大小和性能。
-
缓存构建步骤以提高构建效率。
-
使用
RUN
命令安装应用程序和依赖项。 -
使用
CMD
命令设置容器启动时默认执行的命令。
7.1.3. 多阶段构建
多阶段构建是一种将镜像构建过程分解为多个阶段的技术。每个阶段都包含一组特定的指令,用于完成特定的任务。例如,可以将编译和运行时环境分离成不同的阶段。
优势:
-
提高镜像构建效率: 并行执行不同阶段的构建任务,显著缩短构建时间。
-
减少镜像大小: 仅包含运行时所需的依赖项,降低镜像体积,优化资源占用。
-
增强镜像安全性: 隔离构建过程中的敏感信息,提升镜像安全性,降低潜在风险。
使用示例:
FROM golang:1.18-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main
FROM nginx:alpine
COPY --from=build /app/main /usr/bin/nginx
CMD ["nginx", "-conf", "/etc/nginx/conf.d/default.conf"]
-
定义两个阶段:
build
和main
。 -
build
阶段:-
使用
golang:1.18-alpine
镜像作为基础镜像。 -
编译 Go 代码并生成可执行文件
main
。
-
-
main
阶段:-
使用
nginx:alpine
镜像作为基础镜像。 -
复制
main
可执行文件到/usr/bin/nginx
目录。 -
设置容器启动命令为
nginx -conf /etc/nginx/conf.d/default.conf
。
-
7.2. 启动容器
7.2.1 使用 docker run
命令
docker run
命令用于启动容器并运行应用程序。该命令可以根据镜像创建并运行容器,并可以指定端口映射、环境变量、数据卷等参数。
命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明:
-
OPTIONS: 运行容器的选项,与
docker create
命令相同 -
IMAGE: 要运行的镜像名称
-
COMMAND: 容器启动时要执行的命令
-
ARG: 传递给容器的参数
最佳实践:
-
使用
-d
参数以守护进程模式运行容器,以便在后台运行应用程序。 -
使用
-p
参数映射容器端口到宿主机的端口,以便访问应用程序。 -
使用
-v
参数挂载数据卷,以便持久化容器数据。 -
使用
-e
参数设置环境变量,以便配置应用程序。
7.2.2 使用 docker start
命令
docker start
命令用于启动已创建但未运行的容器。
命令格式:
docker start CONTAINER_ID
参数说明:
-
CONTAINER_ID: 要启动的容器 ID
最佳实践:
-
在启动容器之前,检查容器的状态和配置是否正确。
-
使用
docker logs
命令查看容器启动日志,以便排查问题。
7.3. 运行容器
7.3.1 容器内操作
-
使用
docker exec
命令进入容器,以便进行调试、维护等操作。
命令格式:
docker exec -it CONTAINER_ID /bin/bash
参数说明:
-
-it: 分配伪tty并保持连接
-
CONTAINER_ID: 要进入的容器 ID
-
使用
docker attach
命令连接到正在运行的容器,以便实时查看容器输出。
命令格式:
docker attach CONTAINER_ID
参数说明:
-
CONTAINER_ID: 要连接的容器 ID
7.3.2 容器监控
-
使用
docker stats
命令查看容器的资源使用情况,例如 CPU、内存、网络等。
命令格式:
docker stats CONTAINER_ID
参数说明:
-
CONTAINER_ID: 要查看的容器 ID
-
使用
docker logs
命令查看容器的日志输出。
命令格式:
docker logs CONTAINER_ID
参数说明:
-
CONTAINER_ID: 要查看的容器 ID
最佳实践:
-
使用监控工具监控容器的运行状况,例如 Prometheus、Grafana 等。
8. 从 Docker Hub 拉取镜像
8.1.1 使用 docker pull
命令
docker pull
命令用于从 Docker Hub 等镜像仓库拉取镜像。
命令格式:
docker pull [OPTIONS] REPOSITORY/IMAGE[:TAG]
参数说明:
-
OPTIONS: 拉取镜像的选项,例如
--insecure-registry
绕过安全检查 -
REPOSITORY/IMAGE: 镜像仓库/镜像名称
-
TAG: 镜像标签,用于指定镜像版本
使用案例:
# 拉取最新版本的 Nginx 镜像
docker pull nginx
# 拉取指定版本的 Nginx 镜像
docker pull nginx:1.17
最佳实践:
-
尽量使用官方镜像或可靠的第三方镜像,以确保镜像的安全性和稳定性。
-
使用
docker images
命令查看本地镜像列表,以便管理镜像。 -
使用
docker tag
命令为镜像添加标签,以便方便地引用和管理不同版本的镜像。
8.2. 创建自定义镜像
8.2.1 使用 docker build
命令构建镜像
docker build
命令用于根据 Dockerfile 构建镜像。
命令格式:
docker build [OPTIONS] PATH | URL
参数说明:
-
OPTIONS: 构建镜像的选项,例如
-t
指定镜像名称 -
PATH: Dockerfile 文件所在的目录
-
URL: Dockerfile 文件的 URL 地址
使用案例:
# 构建当前目录下的 Dockerfile 镜像
docker build -t my-nginx .
# 构建指定 URL 的 Dockerfile 镜像
docker build -t my-nginx https://github.com/my-project/my-nginx/Dockerfile
最佳实践:
-
使用多阶段构建优化镜像大小和性能。
-
缓存构建步骤以提高构建效率。
-
使用
RUN
命令安装应用程序和依赖项。 -
使用
CMD
命令设置容器启动时默认执行的命令。
8.3. 推送镜像
8.3.1 使用 docker push
命令
docker push
命令用于将镜像推送到 Docker Hub 等镜像仓库。
命令格式:
docker push [OPTIONS] REPOSITORY/IMAGE[:TAG]
参数说明:
-
OPTIONS: 推送镜像的选项,例如
--username
和--password
用于身份验证 -
REPOSITORY/IMAGE: 镜像仓库/镜像名称
-
TAG: 镜像标签,用于指定镜像版本
使用案例:
# 将本地镜像推送到 Docker Hub
docker push nginx
# 将本地镜像推送到指定仓库
docker push my-registry/my-nginx
# 将本地镜像推送到指定仓库的指定版本
docker push my-registry/my-nginx:1.0
最佳实践:
-
仅推送安全可靠的镜像到公共仓库。
-
使用私有仓库来存储敏感或内部使用的镜像。
-
使用镜像签名来确保镜像的完整性和安全性。
8.4. 删除镜像
8.4.1 使用 docker rmi
命令
docker rmi
命令用于删除本地镜像。
命令格式:
docker rmi [OPTIONS] IMAGE[:TAG]
参数说明:
-
OPTIONS: 删除镜像的选项,例如
-f
强制删除 -
IMAGE[:TAG] 要删除的镜像名称和标签
使用案例:
# 删除所有本地镜像
docker rmi -f $(docker images -a -q)
# 删除指定镜像
docker rmi nginx
# 删除指定版本的镜像
docker rmi nginx:1.17
最佳实践:
-
定期清理本地镜像,以节省存储空间。
-
仅删除不再使用的镜像,以避免意外删除。
9.Docker Compose
Docker Compose 是用于定义和运行多容器应用程序的工具。它使用 YAML 文件 来描述应用程序的组成部分,以及它们之间的关系。通过 Docker Compose,您可以轻松地启动、停止、缩放和管理由多个容器组成的应用程序。
9.1. 编写 Docker Compose 文件的基本语法
Docker Compose 文件的语法由以下几个部分组成:
-
版本: 指定 Docker Compose 文件的版本。
-
服务: 定义应用程序中的每个服务。
-
网络: 定义应用程序使用的网络。
-
卷: 定义应用程序使用的卷。
-
环境: 定义应用程序的环境变量。
服务 是 Docker Compose 文件的核心部分。它描述了一个容器的配置,包括:
-
镜像: 要使用的镜像名称。
-
容器名称: 容器的名称。
-
端口: 容器暴露的端口。
-
环境: 容器的环境变量。
-
volumes: 容器使用的卷。
-
depends_on: 容器启动依赖的其他容器。
以下是一个简单的 Docker Compose 文件示例:
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: postgres
environment:
- POSTGRES_PASSWORD=password
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
在这个例子中,我们定义了两个服务:
-
web
: 使用nginx
镜像,暴露80
端口。 -
db
: 使用postgres
镜像,并设置环境变量POSTGRES_PASSWORD
为password
,使用卷db-data
存储数据库数据。
9.2. 容器编排和管理
Docker Compose 提供以下命令来管理容器:
-
docker-compose up
: 启动所有定义的容器。 -
docker-compose down
: 停止所有定义的容器。 -
docker-compose ps
: 列出所有运行的容器。 -
docker-compose logs
: 查看容器的日志。 -
docker-compose build
: 构建镜像。 -
docker-compose scale
: 缩放服务中的容器数量。
以下是一些使用 Docker Compose 进行容器编排和管理的示例:
-
启动所有容器:
docker-compose up
-
停止所有容器:
docker-compose down
-
查看所有运行的容器:
docker-compose ps
-
查看容器的日志:
docker-compose logs
-
构建镜像:
docker-compose build
-
缩放服务中的容器数量:
docker-compose scale web=3
9.3.多容器应用的编排和运行示例
-
一个完整的 Web 应用:
我们将以一个完整的 Web 应用为例,演示如何使用 Docker Compose 进行编排和运行。该应用包含以下组件:
-
Nginx 作为 Web 服务器
-
Python Flask 应用程序
-
PostgreSQL 数据库
步骤一:创建 Docker Compose 文件
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./app:/app
depends_on:
- app
app:
image: python:3.9-slim
command: ["python", "-u", "./app.py"]
volumes:
- ./app:/app
environment:
- DATABASE_URL=postgres://db:5432/mydb
depends_on:
- db
db:
image: postgres:latest
environment:
- POSTGRES_PASSWORD=password
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
步骤二:构建镜像
docker-compose build
步骤三:启动应用
docker-compose up
步骤四:访问应用
在浏览器中访问 http://localhost:80
,即可看到应用界面。
步骤五:停止应用
docker-compose down
扩展应用
-
添加新的服务,例如缓存服务、搜索服务等。
-
使用不同的网络模式,例如将应用与外部数据库连接。
-
使用配置文件来管理环境变量和配置。
故障排除
-
查看容器日志:
docker-compose logs
-
检查容器状态:
docker-compose ps
-
使用
docker-compose troubleshoot
命令获取帮助
10.Docker 网络
-
bridge: 默认模式,将容器连接到虚拟网桥,可与外部网络通信。
-
host: 将容器连接到宿主机网络,共享宿主机 IP 和网络配置。
-
none: 不创建任何网络,容器之间无法通过网络通信。
-
overlay: 用于构建多主机网络,可跨越多个 Docker 主机连接容器。
-
macvlan: 将容器连接到虚拟局域网 (VLAN),可与其他 VLAN 中的设备通信。
bridge:
-
创建虚拟网桥,容器拥有独立 IP 地址。
-
可通过端口映射与外部网络通信。
-
常用于开发、测试和生产环境。
host:
-
容器共享宿主机 IP 和网络配置。
-
适合需要访问宿主机资源的应用。
-
不适用于需要网络隔离的应用。
none:
-
容器不连接任何网络。
-
仅用于需要完全隔离的应用。 高级网络模式
overlay:
-
用于构建多主机网络。
-
可跨越多个 Docker 主机连接容器。
-
常用于微服务架构和分布式应用。
macvlan:
-
将容器连接到虚拟局域网 (VLAN)。
-
可与其他 VLAN 中的设备通信。
-
常用于需要网络隔离和安全性的应用。
示例一:使用 bridge 模式构建 Web 应用
FROM nginx:latest
COPY index.html /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
docker run -d -p 80:80 nginx
-
使用
bridge
模式启动 Nginx 容器。 -
容器暴露 80 端口,可通过浏览器访问。
示例二:使用 host 模式部署数据库
FROM postgres:latest
ENV POSTGRES_PASSWORD password
CMD ["postgres", "-D", "/var/lib/postgresql/data"]
docker run -d --name db -e POSTGRES_PASSWORD=password postgres
-
使用
host
模式启动 Postgres 数据库容器。 -
容器共享宿主机 IP 和网络配置,可直接通过 localhost 访问。
11. Docker 数据管理:持久化与共享
11.1 数据卷:持久化存储
数据卷是一种用于在容器之间共享数据或将数据持久化到宿主机的存储机制。数据卷独立于容器的生命周期而存在,可以被多个容器挂载,提供以下优势:
-
数据持久化:容器删除后,数据仍然保留
# 创建数据卷
docker volume create db-data
# 启动数据库容器
docker run -d -v db-data:/var/lib/postgresql/data postgres
# 访问数据库
psql -h localhost -U postgres -d mydb
-
数据共享:多个容器可以访问同一个数据卷
# 创建配置文件
vim config.yaml
# 创建数据卷
docker volume create app-config
# 启动应用容器
docker run -d -v app-config:/app/config my-app
# 更新配置文件
vim config.yaml
# 重启应用容器
docker restart my-app
-
数据一致性:即使容器更新,数据也能保持一致
11.2 绑定挂载:灵活传递数据
绑定挂载允许将宿主机的目录或文件挂载到容器中,提供了一种便捷的方式将数据从宿主机传递到容器,常用于以下场景:
-
配置文件:将配置文件挂载到容器,无需修改容器镜像
# 创建配置文件
vim /etc/app/config.yaml
# 启动应用容器
docker run -d -v /etc/app/config:/app/config my-app
-
数据迁移:将宿主机的现有数据迁移到容器
# 将宿主机数据复制到容器
docker run -v /data:/data my-app cp -r /data/* /app/data
# 访问容器中的数据
docker exec -it my-app ls /app/data
-
日志存储:将容器日志挂载到宿主机,方便查看和分析
11.3 临时卷:便捷存储
临时卷是一种临时性存储,在容器删除后会被自动删除,常用于存储以下数据:
-
日志:存储容器运行过程中的日志信息
# 启动应用容器
docker run -d --log-driver=none my-app
# 查看容器日志
docker logs my-app
-
缓存:存储临时数据,例如数据库缓存
# 启动应用容器
docker run -d -v /tmp/cache:/app/cache my-app
# 清理缓存
docker exec -it my-app rm -rf /app/cache/*
-
临时文件:存储容器运行过程中产生的临时文件
11.4 数据管理最佳实践:提升可靠性
-
优先使用数据卷进行数据持久化,确保数据安全
-
使用绑定挂载传递配置文件或静态数据,提高灵活性
-
使用临时卷存储日志和缓存,优化资源利用
-
定期清理数据卷和临时卷,节省存储空间
11.5. 高级数据管理:扩展应用能力
-
使用 Docker Volume Plugin 扩展数据卷功能,支持更多存储类型
-
使用分布式存储系统,例如 GlusterFS 或 Ceph,实现大规模数据存储
-
使用数据备份和恢复工具,确保数据安全
12.Docker 安全:构建安全可靠的容器应用
12.1.1.镜像安全
-
镜像是构建容器的基础,因此镜像安全至关重要。
-
应尽量使用官方镜像或来自可信来源的镜像。
-
可以使用镜像扫描工具扫描镜像中的漏洞和安全风险。
12.1.2 容器安全
-
容器运行时应配置必要的安全选项,例如隔离、授权和审计。
-
应使用最小特权原则,仅授予容器运行所需的权限。
-
应定期更新容器镜像和软件包,修复已知的安全漏洞。
12.1.3 网络安全
-
应使用合适的网络模式,隔离容器之间的网络通信。
-
应限制容器对外暴露的端口和服务。
-
应使用防火墙和入侵检测系统等安全措施,保护容器网络。
12.1.4 数据安全
-
敏感数据应加密存储,并限制对数据的访问权限。
-
应定期备份数据,以防数据丢失或损坏。
12.2 配置容器的安全选项
12.2.1 使用安全选项
-
Docker 提供了多种安全选项,用于配置容器的安全属性。
-
常用安全选项包括:
-
--cap-add
和--cap-drop
: 限制容器的能力 -
--security-opt
: 配置安全策略 -
--user
: 设置容器运行用户 -
--read-only
: 将容器设置为只读模式
-
12.2.2 使用安全配置文件
-
可以使用安全配置文件来定义容器的安全配置。
-
安全配置文件可以包含以下内容:
-
用户和组
-
权限控制
-
SELinux 或 AppArmor 配置
-
12.2.3 使用 Docker 安全扫描工具
-
Docker 安全扫描工具可以帮助您扫描镜像和容器中的安全漏洞和风险。
-
常用安全扫描工具包括:
-
Clair
-
Trivy
-
Anchore
-
13.Docker Swarm 进行容器编排
Docker Swarm 是官方提供的原生容器编排工具,可以将多个 Docker 主机组成一个集群,并以统一的方式管理和调度容器。Swarm 提供强大的功能,帮助您轻松部署和管理复杂的分布式应用。
13.1.使用 Docker Swarm 进行容器编排
13.1.1 Swarm 集群概述
Swarm 集群由以下几个主要组件组成:
-
管理器: 负责集群的管理和调度
-
工作节点: 运行容器的节点
-
服务: 由多个容器组成的应用
13.1.2 Swarm 部署流程
-
初始化 Swarm 集群
-
创建服务
-
部署服务
-
扩缩容服务
-
监控和管理服务
13.1.3 Swarm 编排优势
-
高可用性: Swarm 集群可以自动故障转移,确保应用高可用性
-
扩展性: Swarm 集群可以轻松扩展,满足应用不断增长的需求
-
安全性: Swarm 提供强大的安全功能,帮助您构建安全可靠的应用
13.2. 使用 Docker Swarm 部署安全的多主机环境
13.2.1 安全实践
-
使用安全镜像
-
配置安全选项
-
使用网络隔离
-
使用 RBAC 授权
-
使用 TLS 加密
13.2.2 部署示例
示例一:部署一个安全的 Web 应用
-
创建一个包含 Nginx 和 Web 应用程序的镜像
FROM nginx:latest
RUN apt-get update && apt-get install -y openssl
COPY index.html /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
-
配置 Nginx 使用 HTTPS
conf.d/default.conf
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/ssl/nginx.pem;
ssl_certificate_key /etc/ssl/nginx.key;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
-
生成 SSL 证书
openssl req -newkey rsa:2048 -new -nodes -keyout nginx.key -out nginx.csr
openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.pem
-
将镜像推送到 Docker 仓库
docker build -t my-secure-web-app .
docker push my-secure-web-app
-
创建服务
docker service create --name my-secure-web-app \
-p 443:443 \
my-secure-web-app
-
配置 RBAC 授权
docker swarm init --advertise-addr <swarm-manager-ip>
docker secret create my-secret \
--file nginx.pem
docker config create my-config \
--file conf.d/default.conf
docker service create --name my-secure-web-app \
-p 443:443 \
--secret my-secret \
--config my-config \
my-secure-web-app
-
访问 Web 应用
浏览器访问 https://<swarm-manager-ip>:443
,即可看到 Web 应用页面。
想要了解更多技术文章请关注公众号“职谷智享”,关注后回复关键字【秒杀】可以领取秒杀系统学习资料