当前位置: 首页 > article >正文

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.yamlapplication-local.yaml中并不相同:

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

将项目打包:

 

 将Dockerfilehm-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 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 为现代开发和运维提供了强大的工具支持,帮助我们简化了部署流程,提高了工作效率,也为未来的技术发展打下了坚实的基础。


http://www.kler.cn/a/468843.html

相关文章:

  • GoF23种设计模式 简介
  • 【FlutterDart】 listView.builder例子二(14 /100)
  • IDE和IDEA详解和具体差异
  • 小结:DNS,HTTP,SMTP,IMAP,FTP,Telnet,TCP,ARP,ICMP
  • 基于微信小程序的面部动作检测系统
  • 【Android项目学习】3. MVVMHabit
  • Dockerfile进行详细的介绍
  • IDEA 编辑器自动识别 Dockerfile 类型高亮和语法提示
  • Git使用mirror备份和恢复
  • NLP问与答——Deep contextualized word representations
  • 51c嵌入式~单片机~合集4
  • 如何排查香港服务器上的权限问题
  • ros2笔记-2.5.1 面向对象编程
  • 双馈风电DFIG并网系统次转子侧变流器RSC抑制策略研究基于LADRC和重复控制的方法
  • 【视觉SLAM:八、后端Ⅱ】
  • C#Halcon跨窗口颜色识别
  • 使用 Spring Boot 进行数据校验
  • 如何构建云原生时空大数据平台?
  • EasyExcel监听器详解
  • 【QED】暴食海獭
  • DDcGAN_多分辨率图像融合的双鉴别条件生成对抗网络_y译文马佳义
  • 若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)
  • 4_TypeScript 条件语句 --[深入浅出 TypeScript 测试]
  • 强化学习常用库的版本对应关系
  • 【C语言】可移植性陷阱与缺陷(六): 内存位置0的访问
  • C++并发:在线程间共享数据