SpringCloud系列教程:微服务的未来(八)项目部署、DockerCompose
本博客将重点介绍如何在 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容器名,只要两者在一个网络,就一定能互相访问。
将项目打包:
将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/ng
inx.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 hgq
mysql
对应的docker-compose.yml文件
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 1234
volumes:
- "./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: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 1234
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hgq-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hgq-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hgq-net
networks:
hgq-net:
name: hgq
docker 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 为现代开发和运维提供了强大的工具支持,帮助我们简化了部署流程,提高了工作效率,也为未来的技术发展打下了坚实的基础。