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

使用docker-compose部署一个springboot项目(包含Postgres\redis\Mongo\Nginx等环境)

准备 Docker 环境

Linux

# 安装 Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable --now docker
# 安装 docker-compose
curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 验证安装
docker -v
docker-compose -v
# 如失效,自行百度~

MacOS

推荐直接使用 Orbstack。可直接通过 Homebrew 来安装:

brew install orbstack

或者直接下载安装包进行安装。

Windows

我们建议将源代码和其他数据绑定到 Linux 容器中时,将其存储在 Linux 文件系统中,而不是 Windows 文件系统中。

  • docker官网首页https://www.docker.com/ 下载windows版本的Docker Desktop。

  • 也可以选择直接使用 WSL 2 后端在 Windows 中安装 Docker Desktop。

  • 也可以直接在 WSL 2 中安装命令行版本的 Docker

创建docker-compose.yml文件

新建一个部署项目文件夹,例如myproject文件夹,进入文件夹,创建一个docker-compose.yml文件,修改docker-compose.yml文件内的配置如下:

version: '1.4'
services:
  postgres:
    image: postgres:12.20
    container_name: postgres
    restart: always
    ports: # 生产环境建议不要暴露
      - "5432:5432"
    networks:
      - digital-twin
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
  mongo:
    image: mongo:8.0
    container_name: mongo
    restart: always
    ports:
      - "27017:27017"
    networks:
      - digital-twin
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - ./mongo/data:/data/db
  redis:
    image: redis:7.4.1
    container_name: redis
    networks:
      - digital-twin
    restart: always
    ports:
      - "6379:6379"
    environment:
      - REDIS_PASSWORD=tarzan123456
    command: >
      sh -c "redis-server --requirepass $$REDIS_PASSWORD"
    volumes:
      - ./redis/data:/data # 持久化数据,将容器内的 /data 目录映射到宿主机的当前目录下的 data 文件夹
  web:
    image: nginx:1.26.2
    container_name: nginx-web
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/logs:/var/log/nginx
    ports:
      - "8080:80"
    networks:
      - digital-twin

  digital-twin:
    container_name: coalface-safety
    image: tarzan/coalface-safety:v1.4
    ports:
      - "12000:12000"
    networks:
      - digital-twin
    depends_on:
      - mongo
      - postgres
      - redis
    restart: always
    environment:
      - SPRING_DATA_MONGODB_URI=mongodb://root:example@mongo:27017/work_face?authSource=admin
      - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/coalface_safety
      - SPRING_DATASOURCE_USERNAME=username
      - SPRING_DATASOURCE_PASSWORD=password
      - SPRING_REDIS_HOST=redis
      - SPRING_REDIS_PASSWORD=tarzan123456
      - OPC_TCP=opc.tcp://10.16.91.47:12685
networks:
  digital-twin:

配置解读

这份 docker-compose.yml 文件定义了一个多服务的 Docker 组合,用于部署一个包含 PostgreSQL、MongoDB、Redis 和 Nginx 的 Web 应用程序,以及一个名为 digital-twin 的自定义应用。下面是对该文件的逐行详细解读:

版本声明

version: '1.4'

指定了此 docker-compose 文件遵循的是版本 1.4 的规范。不同的版本之间可能存在语法差异,因此指定版本是非常重要的。

服务定义

services:

这是所有服务的开始标签,每个服务都是一个独立运行的应用程序或数据库实例。

PostgreSQL 数据库
  postgres:
    image: postgres:12.20
    container_name: postgres
    restart: always
    ports:
      - "5432:5432"
    networks:
      - digital-twin
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
  • image: 使用的镜像是 postgres:12.20,即 PostgreSQL 数据库的版本 12.20。
  • container_name: 容器启动后,其名称将设置为 postgres
  • restart: 设置为 always,意味着无论退出代码为何,Docker 都会自动重启容器。
  • ports: 将容器内的端口 5432 映射到宿主机的端口 5432
  • networks: 容器将连接到名为 digital-twin 的网络。
  • environment: 设置了 PostgreSQL 的环境变量,包括用户名、密码和初始创建的数据库名。
  • volumes: 将本地文件夹 ./postgres/data 映射到容器内的 /var/lib/postgresql/data,以便持久化存储数据库文件。
MongoDB 数据库
  mongo:
    image: mongo:8.0
    container_name: mongo
    restart: always
    ports:
      - "27017:27017"
    networks:
      - digital-twin
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - ./mongo/data:/data/db
  • image: 使用的镜像是 mongo:8.0
  • container_name: 容器启动后,其名称将设置为 mongo
  • restart: 设置为 always
  • ports: 将容器内的端口 27017 映射到宿主机的端口 27017
  • networks: 容器将连接到名为 digital-twin 的网络。
  • environment: 设置了 MongoDB 的环境变量,包括初始化用户和密码。
  • volumes: 将本地文件夹 ./mongo/data 映射到容器内的 /data/db
Redis 缓存服务器
  redis:
    image: redis:7.4.1
    container_name: redis
    networks:
      - digital-twin
    restart: always
    ports:
      - "6379:6379"
    environment:
      - REDIS_PASSWORD=tarzan123456
    command: >
      sh -c "redis-server --requirepass $$REDIS_PASSWORD"
    volumes:
      - ./redis/data:/data
  • image: 使用的镜像是 redis:7.4.1
  • container_name: 容器启动后,其名称将设置为 redis
  • networks: 容器将连接到名为 digital-twin 的网络。
  • restart: 设置为 always
  • ports: 将容器内的端口 6379 映射到宿主机的端口 6379
  • environment: 设置了 Redis 的密码环境变量。
  • command: 启动 Redis 服务时需要提供密码。
  • volumes: 将本地文件夹 ./redis/data 映射到容器内的 /data
Nginx Web 服务器
  web:
    image: nginx:1.26.2
    container_name: nginx-web
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/logs:/var/log/nginx
    ports:
      - "8080:80"
    networks:
      - digital-twin
  • image: 使用的镜像是 nginx:1.26.2
  • container_name: 容器启动后,其名称将设置为 nginx-web
  • volumes: 映射了 Nginx 的配置文件、静态文件目录和日志目录。
  • ports: 将容器内的端口 80 映射到宿主机的端口 8080
  • networks: 容器将连接到名为 digital-twin 的网络。
自定义应用 digital-twin
  digital-twin:
    container_name: coalface-safety
    image: tarzan/coalface-safety:v1.4
    ports:
      - "12000:12000"
    networks:
      - digital-twin
    depends_on:
      - mongo
      - postgres
      - redis
    restart: always
    environment:
      - SPRING_DATA_MONGODB_URI=mongodb://root:example@mongo:27017/work_face?authSource=admin
      - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/coalface_safety
      - SPRING_DATASOURCE_USERNAME=username
      - SPRING_DATASOURCE_PASSWORD=password
      - SPRING_REDIS_HOST=redis
      - SPRING_REDIS_PASSWORD=tarzan123456
      - OPC_TCP=opc.tcp://10.16.91.47:12685
  • image: 使用的镜像是 tarzan/coalface-safety:v1.4
  • container_name: 容器启动后,其名称将设置为 coalface-safety
  • ports: 将容器内的端口 12000 映射到宿主机的端口 12000
  • networks: 容器将连接到名为 digital-twin 的网络。
  • depends_on: 指定了依赖的服务列表,这些服务在启动之前会被先启动。
  • restart: 设置为 always
  • environment: 设置了一系列环境变量,用于配置应用程序连接到 MongoDB、PostgreSQL 和 Redis 的方式,以及其他配置选项如 OPC UA 服务器地址。

网络定义

networks:
  digital-twin:

这里定义了一个名为 digital-twin 的网络,所有的服务都会连接到这个网络上,以便它们可以互相通信。

启动容器

在 docker-compose.yml 同级目录下执行。请确保docker-compose版本最好在2.17以上,否则可能无法执行自动化命令。

# 启动容器
docker-compose up -d

docker-compose up -d 是一个常用的命令,用于启动并运行 Docker Compose 文件中定义的所有服务。这个命令的具体含义如下:

docker-compose

这是调用 Docker Compose 工具的命令。Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过使用 YAML 文件来配置应用程序的服务,你可以轻松地管理一个应用的服务群组。

up

up 命令是 Docker Compose 中用来启动和创建项目中的服务。它执行以下操作:

  • 构建或者重新构建服务中定义的任何镜像。
  • 如果存在已停止的容器,则会启动这些容器。
  • 如果没有容器存在,它会创建并启动新的容器。
  • 如果有需要更新的容器(例如,如果服务的配置已经改变),它会停止并移除旧的容器,然后创建新的容器。

-d

-d 参数代表“detached”模式,即后台运行模式。这意味着当您运行 docker-compose up -d 命令时,Docker 会在后台启动并运行所有服务,并立即将控制台返回给您,而不是保持控制台占用状态显示服务的日志输出。

总结

所以,当你运行 docker-compose up -d 命令时,实际上是告诉 Docker Compose 根据当前目录下的 docker-compose.yml 文件中的配置,在后台启动并运行所有定义的服务。这对于生产环境中部署应用非常有用,因为您可以立即获得控制台访问权限,而服务则在后台持续运行。

示例命令执行流程

  1. 解析 docker-compose.yml 文件:Docker Compose 读取 docker-compose.yml 文件中的配置信息。
  2. 构建镜像(如果需要):根据配置文件中的 build 指令构建所需的 Docker 镜像。
  3. 启动或创建容器:对于每个服务,如果已经有容器存在,则启动这些容器;如果没有,则创建新容器并启动。
  4. 后台运行:由于 -d 参数的存在,所有服务都在后台运行,不会阻塞终端。

注意事项

  • 在使用 docker-compose up -d 命令前,请确保当前工作目录下有一个有效的 docker-compose.yml 文件。
  • 如果你想查看服务的日志输出,可以使用 docker-compose logs 命令。
  • 如果你需要停止所有服务,可以使用 docker-compose down 命令。

http://www.kler.cn/news/364103.html

相关文章:

  • 【Qt6聊天室项目】 主界面功能实现
  • Linux运维篇-ansible的使用
  • 程序员:代码世界的探险家与日常“救火队员”
  • MongoDB的常用语句
  • 自由学习记录(12)
  • Dalvik汇编语言基础
  • STL标准容器库
  • 【华为HCIP实战课程十七】OSPF的4类及5类LSA详解,网络工程师
  • nginx------HTTP模块配置详解
  • 什么是虚拟线程?Java 中虚拟线程的介绍与案例演示
  • 【Unity实战笔记】第二一 · 基于状态模式的角色控制——以UnityChan为例
  • ArcGIS计算落入面图层中的线的长度或面的面积
  • 十七、行为型(命令模式)
  • 社区团购在一线城市的新机遇:定制开发小程序助力用户细分
  • Lua简介
  • 【CSS in Depth 2 精译_054】8.2 CSS 层叠图层(cascade layer)的推荐组织方案
  • Redis 安装部署与常用命令
  • 【H2O2|全栈】JS入门知识(八)DOM(2)
  • rabbitmq 使用注意事项
  • JVM 的定义、内部工作原理以及不同 JVM 实现的区别, Oracle JVM 、 OpenJ9、GraalVM对比。
  • 51 单片机[11]:蜂鸣器播放提示音和音乐
  • DNS 原理
  • 证明非平方整数阶射影平面关联矩阵的主对角线有t+1个1
  • Python 爬虫下载图片
  • 将 Docker 安装到指定目录
  • Spring Boot 中常见的注解,分类列出