
mall 电商项目 Docker 容器化部署实战从镜像命令、私有仓库到 Compose 全栈编排【免费下载链接】mallmall项目是一套电商系统包括前台商城系统及后台管理系统基于Spring BootMyBatis实现采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。项目地址: https://gitcode.com/macrozheng/mall导读本文是 mall 电商项目Spring Boot 3 MyBatis配套的 Docker 入门与部署手册系统梳理 Docker 镜像/容器常用命令、私有镜像仓库Registry 2.0搭建、Maven 插件自动构建镜像以及 Docker Compose 全栈编排方案。读完本文你将能够独立完成 mall 项目中 MySQL、Redis、Elasticsearch、RabbitMQ 等中间件环境的容器化部署并通过 document/docker/docker-compose-app.yml 一键拉起 mall-admin、mall-search、mall-portal 三个应用服务同时掌握镜像数据迁移与生产环境排障的完整方法。一、Docker 镜像常用命令镜像是 Docker 容器运行的基础掌握镜像的搜索、下载、列出与删除是第一步。1.1 搜索镜像docker search javadocker search从 Docker Hub 检索镜像输出中包含镜像名称、Star 数、官方认证OFFICIAL与自动构建AUTOMATED标记可用于在拉取前确认镜像来源是否可信。1.2 下载镜像# 下载未指定版本的镜像默认 tag 为 latest docker pull java:8 # 下载指定仓库、指定 tag 的镜像 docker pull macro/eureka-server:0.0.1docker pull的完整格式为docker pull [仓库地址/]镜像名[:标签]。不写仓库地址时默认从 Docker Hub 拉取写私有仓库地址如localhost:5000/macro/eureka-server:0.0.1时则从私有 Registry 拉取。1.3 列出镜像docker images输出包含REPOSITORY镜像所属仓库、TAG标签、IMAGE ID镜像 ID、CREATED创建时间与SIZE体积。mall 项目中各应用镜像的命名遵循mall/应用名:版本的约定例如mall/mall-admin:1.0-SNAPSHOT。1.4 删除镜像# 按名称删除镜像 docker rmi java # 强制删除镜像忽略容器占用 docker rmi -f java # 删除所有镜像慎用 docker rmi -f $(docker images)删除镜像前需确保没有容器正在使用它否则需要加-f强制删除。在 mall 的部署脚本 document/sh/mall-admin.sh 中还有一条更精细的清理命令docker rmidocker images | grep none | awk {print $3}用于批量清理构建过程中产生的none悬空镜像。二、Docker 容器常用命令容器是镜像的运行实例以下命令覆盖 mall 项目日常部署与运维的完整生命周期。2.1 新建并启动容器docker run -d -p 91:80 nginx-d后台运行detach 模式容器在后台持续运行并返回容器 ID-p 91:80端口映射将宿主机的 91 端口映射到容器内的 80 端口nginx使用的镜像。mall 项目中应用容器的启动方式可参考 document/sh/run.sh它展示了更完整的docker run用法docker run -p 8080:8080 --name ${app_name} \ --link mysql:db \ --link redis:redis \ -e spring.profiles.active${profile_active} \ -e TZAsia/Shanghai \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/${app_name}/logs:/var/logs \ -d ${group_name}/${app_name}:${app_version}关键参数说明参数作用--name为容器指定名称便于后续 stop/rm 等操作按名字引用--link mysql:db容器互联使当前容器可通过db这个域名访问 mysql 容器-e注入环境变量这里注入了spring.profiles.activeprod激活生产配置以及时区TZAsia/Shanghai-v数据卷挂载将宿主机/mydata/app/mall-admin/logs挂载到容器/var/logs实现日志持久化2.2 列出容器docker ps默认只列出运行中的容器加-a可列出所有容器含已停止的例如docker rm -f $(docker ps -a -q)中的-q表示只输出容器 ID便于批量操作。2.3 停止与启动容器# 优雅停止容器发送 SIGTERM docker stop $ContainerId # 强制停止容器发送 SIGKILL docker kill $ContainerId # 启动一个已停止的容器 docker start $ContainerId2.4 进入容器# 方式一先通过 inspect 拿到容器主进程 PID docker inspect --format {{.State.Pid}} $ContainerId # 再用 nsenter 进入容器的命名空间 nsenter --target $pid --mount --uts --ipc --net --pid# 方式二更常用直接进入容器内执行命令 docker exec -it $ContainerName /bin/bashdocker exec -it 容器名 /bin/bash是日常进入容器排查问题的最常用方式-i保持标准输入打开-t分配伪终端。2.5 删除容器# 删除指定容器 docker rm $ContainerId # 强制删除所有容器含运行中的 docker rm -f $(docker ps -a -q)2.6 查看启动错误日志docker logs $ContainerIdName(或者$ContainerId)当容器启动后立即退出常见于数据库连接失败、端口被占用、配置文件缺失时docker logs是定位问题的第一入口。配合docker logs -f可以持续跟踪日志输出。2.7 查看容器的 IP 地址docker inspect --format {{ .NetworkSettings.IPAddress }} $ContainerIdDocker 默认 bridge 网络的网段为172.17.0.*通过该命令可拿到容器的内网 IP用于测试容器间连通性。2.8 同步宿主机时间到容器docker cp /etc/localtime $ContainerName:/etc/容器默认使用 UTC 时区会导致日志时间与宿主机不一致。该命令将宿主机的时区文件复制进容器实现时间同步在 mall 的部署中则更推荐在docker run时挂载-v /etc/localtime:/etc/localtime并设置-e TZAsia/Shanghai从 document/docker/docker-compose-app.yml 可以看到同样的时区处理方式。2.9 查看 Docker 资源占用# 查看指定容器的 cpu、内存、网络、IO 情况 docker stats $ContainerName # 查看所有容器的资源占用 docker stats -adocker stats实时输出容器的 CPU、内存、网络 I/O 与磁盘 I/O 使用率是定位容器资源瓶颈的直接手段。mall 项目中 Elasticsearch 容器通过ES_JAVA_OPTS-Xms512m -Xmx1024m显式限制了 JVM 堆内存见 document/docker/docker-compose-env.yml正是为了避免资源占用失控。三、Docker Registry搭建私有镜像仓库企业内部部署 Docker 时通常需要自建私有镜像仓库避免把业务镜像推到公网。3.1 搭建 Registry 2.0docker run -d -p 5000:5000 --restartalways --name registry2 registry:2-p 5000:5000暴露 Registry 的 5000 端口--restartalways容器异常退出后自动重启保证仓库服务高可用registry:2Registry 2.0 镜像。3.2 修改镜像标签并推送# 先为镜像打上私有仓库地址前缀的标签 docker tag macro/eureka-server:0.0.1 localhost:5000/macro/eureka-server:0.0.1 # 推送镜像到私有仓库 docker push localhost:5000/macro/eureka-server:0.0.1镜像名中的仓库地址前缀决定了 push 的目标localhost:5000即指本机 Registry 服务。3.3 让 Docker 支持 HTTP 私有仓库默认情况下 Docker 只信任 HTTPS 仓库对于内网 HTTP 仓库需要显式声明为 insecure-registriesecho { insecure-registries:[39.98.190.128:5000] } /etc/docker/daemon.json写入后需重启 Docker 服务使配置生效。mall 项目中推送到私有仓库时的镜像名形如192.168.1.71:5000/macro/mall-admin:1.0-SNAPSHOT同一套机制即可复用。四、使用 Maven 构建 Docker 镜像mall 项目在根 pom.xml 中集成了io.fabric8:docker-maven-plugin版本0.45.1并在mall-admin等子模块的 pom.xml 中引用实现了「打包即构建镜像」的流水线。4.1 构建镜像mvn clean package docker:build仓库根 pom.xml 中与 Docker 构建相关的核心配置如下docker.hosthttp://192.168.3.101:2375/docker.host指定 Docker 远程管理地址插件execution将build目标绑定到package阶段因此执行mvn clean package时也会自动构建镜像镜像名定义为mall/${project.name}:${project.version}基础镜像为openjdk:17容器启动命令为java -jar -Dspring.profiles.activeprod xxx.jar维护者为macrozheng。前提docker:build需要连接 Docker 守护进程。若在 Linux 服务器上远程构建需开启 Docker 远程 API编辑/usr/lib/systemd/system/docker.service将ExecStart修改为ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock修改后执行systemctl daemon-reload systemctl restart docker生效。注意开启 TCP 监听后应仅在可信内网使用并配合防火墙限制访问。4.2 构建并推送镜像到私有仓库mvn clean package docker:build -DpushImage推送前需要把镜像名改成私有仓库地址前缀使 push 指向目标 Registry若使用仓库当前采用的 fabric8 插件在 pom.xml 中修改name节点例如name192.168.1.71:5000/macro/${project.name}:${project.version}/name早期教程中常见的 Spotify 版 docker-maven-plugin 则对应imageName192.168.1.71:5000/macro/${project.artifactId}:${project.version}/imageName配置同时按 3.3 节配置insecure-registries使 Docker 支持 HTTP 协议推送。4.3 手动编写 Dockerfile 的替代方案除插件外仓库还提供了手写 Dockerfile 的示例 document/sh/Dockerfile# 依赖的基础镜像 FROM openjdk:17 # 将当前目录下的 jar 包复制到容器根目录 ADD mall-admin-1.0-SNAPSHOT.jar /mall-admin-1.0-SNAPSHOT.jar # 声明服务运行在 8080 端口 EXPOSE 8080 # 容器启动时运行 jar 包 ENTRYPOINT [java, -jar,/mall-admin-1.0-SNAPSHOT.jar] # 指定维护者 MAINTAINER macro配合 document/sh/run.sh 中的docker build -t mall/mall-admin:1.0-SNAPSHOT .即可构建应用镜像。两条路径插件自动构建 vs 手动 Dockerfile在 mall 中并存前者适合 CI 流水线后者适合手工运维。五、修改 Docker 镜像存放位置默认情况下 Docker 的镜像与容器数据存放在/var/lib/docker当磁盘空间不足时可整体迁移到数据盘步骤如下# 1. 查看 Docker 当前存放位置默认为 /var/lib/docker docker info | grep Docker Root Dir # 2. 关闭 Docker 服务 systemctl stop docker # 3. 将数据目录移动到目标路径 mv /var/lib/docker /root/data/docker # 4. 建立软链接使 Docker 仍按原路径访问 ln -s /root/data/docker /var/lib/docker # 5. 重新启动 Docker 服务 systemctl start docker软链接方式对 Docker 完全透明无需修改任何配置是迁移数据目录的通用做法。mall 项目中 MySQL、Elasticsearch 等容器的数据卷均挂载在宿主机/mydata目录下见 document/docker/docker-compose-env.yml部署前应确认该目录所在磁盘容量充足。六、Docker Compose安装与常用命令当应用依赖多个容器时逐条执行docker run效率低且易出错Compose 通过一个 YAML 文件声明并编排整个服务栈。6.1 安装 Docker Compose从 Docker Compose 官方 GitHub Releases 页面下载与系统架构匹配的二进制文件将其安装到/usr/local/bin/docker-compose赋予可执行权限sudo chmod x /usr/local/bin/docker-compose验证安装docker-compose --version。说明目前 Docker 官方已推荐使用内置的docker compose子命令Compose V2命令格式与本文所述 V1 基本一致仅将docker-compose替换为docker compose。6.2 安装命令补全工具可通过官方提供的 bash 补全脚本安装将脚本下载到/etc/bash_completion.d/docker-compose后重新加载 shell即可在输入docker-compose时获得子命令与参数补全提示有效减少拼写错误。6.3 常用命令命令作用docker-compose up构建、创建并启动相关容器加-d后台运行docker-compose ps列出当前编排的所有容器docker-compose rm eureka删除指定服务的容器docker-compose scale eureka3对指定服务动态扩容到 3 个实例Compose V1V2 使用up --scale eureka3docker-compose stop eureka停止指定服务的容器docker-compose start eureka启动已停止的服务容器七、用 Docker Compose 编排 mall 全栈环境原手册以 SpringCloud 教程工程eureka-server、hello-service、feign-consumer、api-gateway演示微服务编排其docker-res目录下的三个编排文件属于独立的 SpringCloud 教程仓库不在当前仓库内。本仓库对应的编排实践体现在 document/docker 下的两个 Compose 文件下面结合它们深入讲解两种典型编排模式。7.1 环境组件编排docker-compose-env.ymldocument/docker/docker-compose-env.yml 一次性拉起 mall 运行所需的全部中间件各服务明细如下服务镜像端口数据卷挂载关键配置mysqlmysql:5.73306/mydata/mysql/{data,conf,log}指定 utf8mb4 字符集MYSQL_ROOT_PASSWORDrootredisredis:76379/mydata/redis/data:/dataredis-server --appendonly yes开启 AOF 持久化nginxnginx:1.2280/mydata/nginx/{conf,html,logs}配置与静态资源目录全部挂载宿主机rabbitmqrabbitmq:3.9.11-management5672、15672/mydata/rabbitmq/datamanagement 版自带管理控制台elasticsearchelasticsearch:7.17.39200、9300/mydata/elasticsearch/{plugins,data}单节点模式JVM 堆 512m~1024mlogstashlogstash:7.17.34560~4563挂载 logstash.confdepends_on与links依赖 es配置见 document/elk/logstash.confkibanakibana:7.17.35601-elasticsearch.hostshttp://es:9200通过 links 访问 esmongomongo:427017/mydata/mongo/db:/data/db数据目录持久化miniominio/minio9090、9001/mydata/minio/data:/dataMINIO_ROOT_USER/PASSWORDminioadminConsole 端口 9001几个值得注意的设计数据持久化优先所有有状态服务的数据目录都通过volumes挂载到宿主机/mydata下容器销毁重建不丢数据启动顺序控制logstash 与 kibana 通过depends_on: - elasticsearch保证在 ES 之后启动避免启动竞态服务发现logstash/kibana 通过links: - elasticsearch:es获得es域名访问 ES与下文中应用的external_links用法一致。7.2 应用编排docker-compose-app.ymldocument/docker/docker-compose-app.yml 编排 mall 的三个后端应用与 7.1 的环境栈配合使用version: 3 services: mall-admin: image: mall/mall-admin:1.0-SNAPSHOT container_name: mall-admin ports: - 8080:8080 # 后台管理系统 volumes: - /mydata/app/mall-admin/logs:/var/logs - /etc/localtime:/etc/localtime environment: - TZAsia/Shanghai external_links: - mysql:db # 可以用 db 这个域名访问 mysql 服务 mall-search: image: mall/mall-search:1.0-SNAPSHOT container_name: mall-search ports: - 8081:8081 # 搜索服务 external_links: - elasticsearch:es # 可以用 es 域名访问 elasticsearch - mysql:db mall-portal: image: mall/mall-portal:1.0-SNAPSHOT container_name: mall-portal ports: - 8085:8085 # 前台商城接口服务 external_links: - redis:redis - mongo:mongo - mysql:db - rabbitmq:rabbit编排要点external_links跨 Compose 互联应用与中间件分属两个 Compose 文件时通过external_links把环境栈中的容器以别名db、es、redis等接入应用容器应用配置文件中即可直接使用这些短域名连接中间件端口规划mall-admin 8080、mall-search 8081、mall-portal 8085与各模块 [application.yml] 中的服务端口保持一致日志与时区统一挂载/mydata/app/应用/logs持久化日志、挂载/etc/localtime并设置TZAsia/Shanghai保证日志时间与宿主机一致。7.3 三种编排模式的对应关系原手册提到的三种 SpringCloud 微服务编排模式基础编排、简化编排、高可用注册中心可以对应到仓库内的实现思路基础编排即 7.1 的环境栈 7.2 的应用栈完整呈现依赖关系与端口映射简化编排将应用容器直接并入环境栈文件减少external_links复杂度适合单机演示环境高可用注册中心对无状态服务使用docker-compose scale 服务N或 V2 的up --scale动态扩容多个实例配合--link别名实现互相注册达到高可用效果。如果希望手工完成同样的部署可参考 document/sh/mall-admin.sh、document/sh/mall-portal.sh、document/sh/mall-search.sh 三个脚本它们展示了 stop → rm → rmi → run 的完整容器生命周期管理流程。八、总结本文从 Docker 最基础的镜像与容器命令出发完整覆盖了 mall 项目容器化部署所需的全部技能镜像与容器的增删查改、nsenter/exec进入容器排障、docker stats监控资源、Registry 私有仓库的搭建与推送、Maven 插件一键构建镜像、镜像数据目录迁移以及基于 Docker Compose 的环境栈与应用栈编排。建议按以下顺序实践先搭建私有仓库再用 Maven 构建 mall 应用镜像最后通过两个 Compose 文件拉起完整环境即可在单台服务器上复现 mall 的前台商城与后台管理系统运行环境。【免费下载链接】mallmall项目是一套电商系统包括前台商城系统及后台管理系统基于Spring BootMyBatis实现采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。项目地址: https://gitcode.com/macrozheng/mall创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考