本博客将重点介绍如何在 Docker 环境中部署一个 Java 项目,并使用 Docker Compose 来简化和管理多个服务的协调部署。我们将通过一个典型的 Java Web 应用(如基于 Spring Boot 的应用)为例,演示如何构建、配置和运行 Docker 容器,以及如何通过 Docker Compose 实现不同服务间的集成和自动化部署。
目录
前言
项目部署
部署后端
部署前端
DockerCompose
总结
前言
在现代软件开发中,持续集成和持续交付(CI/CD)是提升开发效率和产品质量的关键实践。随着微服务架构和容器化技术的普及,Docker 和 Docker Compose 已成为开发和运维中不可或缺的工具。它们不仅可以简化应用的部署和管理,还能帮助开发者和运维团队快速、高效地进行应用的发布、更新和扩展。
本博客将重点介绍如何在 Docker 环境中部署一个 Java 项目,并使用 Docker Compose 来简化和管理多个服务的协调部署。我们将通过一个典型的 Java Web 应用(如基于 Spring Boot 的应用)为例,演示如何构建、配置和运行 Docker 容器,以及如何通过 Docker Compose 实现不同服务间的集成和自动化部署。
项目部署
项目代码说明:
-  hmall:商城的后端代码 
-  hmall-portal:商城用户端的前端代码 
-  hmall-admin:商城管理端的前端代码 
部署的容器及端口说明:
| 项目 | 容器名 | 端口 | 备注 | 
|---|---|---|---|
| hmall | hmall | 8080 | 黑马商城后端API入口 | 
| hmall-portal | nginx | 18080 | 黑马商城用户端入口 | 
| hmall-admin | 18081 | 黑马商城管理端入口 | |
| mysql | mysql | 3306 | 数据库 | 
部署后端
hmall项目是一个maven聚合项目,使用IDEA打开hmall项目,查看项目结构如图:’
 
 
要部署的就是其中的hm-service,其中的配置文件采用了多环境的方式:

其中的application-dev.yaml是部署到开发环境的配置,application-local.yaml是本地运行时的配置。
查看application.yaml,你会发现其中的JDBC地址并未写死,而是读取变量:

 这两个变量在application-dev.yaml和application-local.yaml中并不相同:

 在dev开发环境(也就是Docker部署时)采用了mysql作为地址,刚好是我们的mysql容器名,只要两者在一个网络,就一定能互相访问。
 在dev开发环境(也就是Docker部署时)采用了mysql作为地址,刚好是我们的mysql容器名,只要两者在一个网络,就一定能互相访问。
将项目打包:

 
 
 将Dockerfile和hm-service.jar一起上传到虚拟机的root目录:

部署项目
#构建项目镜像
docker build -t hmall . 
创建并运行容器,并通过--network将其加入hgq网络,这样才能通过容器名访问mysql
docker run -d --name hm -p 8080:8080 --network hgq hmall

 docker logs -f hm 
 
部署前端
需求:创建一个新的nginx容器,将课前资料提供的nginx.conf、html目录与容器挂载

-  html是静态资源目录,我们需要把hmall-portal以及hmall-admin都复制进去
-  nginx.conf是nginx的配置文件,主要是完成对html下的两个静态资源目录做代理
要做的就是把整个nginx目录上传到虚拟机的/root目录下:

创建nginx容器并完成两个挂载:
-  把 /root/nginx/nginx.conf挂载到/etc/nginx/nginx.conf
-  把 /root/nginx/html挂载到/usr/share/nginx/html
由于需要让nginx同时代理hmall-portal和hmall-admin两套前端资源,因此我们需要暴露两个端口:
-  18080:对应hmall-portal 
-  18081:对应hmall-admin 
docker run -d \
> --name nginx \
> -p 18080:18080 \
> -p 18081:18081 \
>  -v /root/nginx/html:/usr/share/nginx/html \
>  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
> --network hgq \
> nginx

https://虚拟机地址:18080

DockerCompose
Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
docker run部署Mysql命令
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=1234 \-v ./mysql/data:/var/lib/mysql \-v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d \--network hgqmysql 对应的docker-compose.yml文件
version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 1234volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hgq
| docker run 参数 | docker compose 指令 | 说明 | 
|---|---|---|
| --name | container_name | 容器名称 | 
| -p | ports | 端口映射 | 
| -e | environment | 环境变量 | 
| -v | volumes | 数据卷配置 | 
| --network | networks | 网络 | 
 项目多容器对应的docker-compose.yml文件
version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 1234volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hgq-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hgq-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hgq-net
networks:hgq-net:name: hgqdocker compose的命令格式如下:
docker compose [OPTIONS] [COMMAND]其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
| 类型 | 参数或指令 | 说明 | 
|---|---|---|
| Options | -f | 指定compose文件的路径和名称 | 
| -p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 | |
| Commands | up | 创建并启动所有service容器 | 
| down | 停止并移除所有容器、网络 | |
| ps | 列出所有启动的容器 | |
| logs | 查看指定容器的日志 | |
| stop | 停止容器 | |
| start | 启动容器 | |
| restart | 重启容器 | |
| top | 查看运行的进程 | |
| exec | 在指定的运行中容器中执行命令 | 
# -d 后台运行
docker compose up -d

总结
通过 Docker 和 Docker Compose 的引入,我们的 Java 项目部署流程变得更加自动化、可重复和可靠。这不仅提升了开发和运维的效率,还使得应用的扩展、升级和维护变得更加轻松。
未来,我们可以继续深入探索 Docker 和容器化的其他高级特性,如多阶段构建、服务扩展和负载均衡等。掌握这些技术,将使我们能够更加灵活地应对复杂的分布式系统和微服务架构挑战。
总之,Docker 和 Docker Compose 为现代开发和运维提供了强大的工具支持,帮助我们简化了部署流程,提高了工作效率,也为未来的技术发展打下了坚实的基础。