3.3 DockerCompose(快速部署)

大家可以看到,我们部署一个简单的java项目,其中包含3个容器:

  • MySQL

  • Nginx

  • Java项目

而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。

而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

对比如下:

docker run 参数 docker compose 指令 说明
--name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷配置
--network networks 网络

明白了其中的对应关系,相信编写docker-compose文件应该难不倒大家

基础命令

编写好docker-compose.yml文件,就可以部署项目了。语法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
Options -p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commands up 创建并启动所有service容器
Commands down 停止并移除所有容器、网络
Commands ps 列出所有启动的容器
Commands logs 查看指定容器的日志
Commands stop 停止容器
Commands start 启动容器
Commands restart 重启容器
Commands top 查看运行的进程
Commands exec 在指定的运行中容器中执行命令

步骤

1). 在 Linux 服务器的 /usr/local 目录下创建目录 app,并切换到 /usr/local/app 目录。

2). 上传资料中提供的 "资料/05. Docker Compose" 中的文件及文件夹到 /usr/local/app 目录中,如下所示:

注意,资料中提供的Dockerfile文件中的阿里云OSS的 AccessKeyId,AccessKeySecret需要替换成自己的。

3). 执行如下指令,基于DockerCompose部署项目。

docker compose up -d

docker compose down

可以把创建的容器快速删除

docker-compose.yml详解

XML 复制代码
services:
  mysql:
    image: mysql:8
    container_name: mysql
    ports:
      - "3307:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "/usr/local/app/mysql/conf:/etc/mysql/conf.d"
      - "/usr/local/app/mysql/data:/var/lib/mysql"
      - "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - tlias-net
  tlias:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: tlias-server
    ports:
      - "8080:8080"
    networks:
      - tlias-net
    depends_on:
      - mysql
  nginx:
    image: nginx:1.20.2
    container_name: nginx-tlias
    ports:
      - "80:80"
    volumes:
      - "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
      - "/usr/local/app/nginx/html:/usr/share/nginx/html"
    depends_on:
      - tlias
    networks:
      - tlias-net
networks:
  tlias-net:
    name: itheima

一、整体部署思路(先说架构)

这是一个 基于 Docker Compose 的三层部署架构:

• MySQL:数据存储层

• tlias 后端服务(Spring Boot):业务逻辑层

• Nginx:前端静态资源 + 反向代理层

三者通过 同一个 Docker 自定义网络 进行通信,实现服务解耦和统一编排。

二、各服务的职责与设计思路

1️⃣ MySQL 服务(数据层)

核心思路:数据库容器化 + 数据持久化

• 使用官方 MySQL 镜像,快速搭建数据库环境

• 通过数据卷映射:

• 配置文件

• 数据目录

• 初始化 SQL 脚本

• 数据不会随着容器删除而丢失,方便重启和迁移

• 加入自定义网络,供后端服务访问

👉 面试可以说:

MySQL 作为基础依赖服务,独立运行,负责数据持久化。

2️⃣ tlias 后端服务(业务层)

核心思路:应用容器化 + 服务依赖管理

• 使用 Dockerfile 构建后端镜像

• 容器中运行的是已经打包好的 Java 后端服务

• 通过 depends_on 声明:

• 后端依赖数据库服务

• 保证启动顺序清晰

• 和 MySQL 在同一个 Docker 网络中

• 后端访问数据库时 直接使用 mysql 这个容器名作为主机名

👉 这一句很关键(面试加分):

在 Docker 网络中,服务之间通过容器名进行通信,而不是写死 IP。

3️⃣ Nginx 服务(接入层)

核心思路:前端静态资源 + 反向代理

• 使用 Nginx 容器对外暴露 80 端口

• 通过目录映射:

• 挂载前端打包后的静态资源

• 挂载自定义的 nginx.conf

• 在 Nginx 配置中:

• 静态资源直接由 Nginx 返回

• 接口请求通过反向代理转发到 tlias-server 这个后端容器

👉 面试亮点表达:

Nginx 通过 Docker 网络,直接把请求代理到后端容器名 tlias-server。

三、Docker 网络设计(重点)

核心思想:统一网络 + 容器名通信

• 三个服务都加入同一个自定义网络 tlias-net

• Docker 会自动提供 DNS 服务

• 在这个网络中:

• mysql 就是数据库地址

• tlias-server 就是后端地址

• 避免了 IP 变化带来的问题

👉 面试总结一句:

使用 Docker 自定义网络,可以让服务之间通过名字通信,部署更加稳定。

四、整体启动与运行逻辑(顺序概念)

  1. 先启动 MySQL

  2. 再启动后端服务 tlias

  3. 最后启动 Nginx

  4. 用户请求 → Nginx

  5. Nginx:

• 返回前端页面

• 或代理请求到后端

  1. 后端访问 MySQL 完成业务逻辑

五、面试一句话总结(直接背)

这是一个通过 Docker Compose 编排的前后端分离项目,MySQL 负责数据存储,后端服务负责业务逻辑,Nginx 提供静态资源并反向代理接口,三者通过 Docker 自定义网络使用容器名通信,结构清晰、部署稳定。
现在我们要基于这个快速部署一个项目,首先他涉及到三个服务

第一个服务是数据库需要准备一个数据库的脚本,它里面有相关的内容以及数据库存放的目录和初始化脚本的目录,要设置本地对应的目录挂载,

第二个就是服务端,就是后端我们要准备JDK的安装包和jar包,还有Docker file这个文件

第三个是前端标准为前端项目所打包的文件还要修改配置文件也要挂载

然后第二部要编写这个配置文件编写完毕之

然后继续这个快速构建项目

相关推荐
ICT董老师3 小时前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
原神启动13 小时前
K8S(八)—— Kubernetes Pod 资源限制 + 探针(Probe)解析
云原生·容器·kubernetes
zxnbmk3 小时前
【7】Kubernetes存储(本章知识密度较高,仅浅浅了解后续详解)
linux·云原生·容器·kubernetes
叫致寒吧3 小时前
pod详解
云原生·kubernetes
孤岛悬城4 小时前
58 k8s之pod
云原生·容器·kubernetes
可爱又迷人的反派角色“yang”4 小时前
k8s(五)
linux·运维·docker·云原生·容器·kubernetes
努力搬砖的咸鱼5 小时前
用 Docker 部署你的第一个微服务
docker·微服务·云原生·容器
Zsr10235 小时前
K8s核心组件pod:进阶篇
云原生·容器·kubernetes·pod
一条咸鱼_SaltyFish5 小时前
Spring Cloud Gateway鉴权空指针惊魂:HandlerMethod为null的深度排查
java·开发语言·人工智能·微服务·云原生·架构