发布时间:2025-06-24 17:10:11  作者:北方职教升学中心  阅读量:833


在该文件中,你可以配置:

  1. 使用的Docker镜像
  2. 启动的容器数目
  3. 容器之间的依赖关系
  4. 容器间的网络连接
  5. 数据卷的挂载
  6. 服务的环境变量等

当你运行 docker compose up命令时,docker-compose会读取docker-compose.yml文件中的配置,自动创建所有需要的容器、这是因为 MySQL 容器在首次启动并执行完初始化脚本后,会将数据库的状态保存到数据卷(通常是绑定挂载的主机目录或 Docker 卷)中。

在编写docker-compose.yml前,先准备好redis-dockerfile、

RUN mkdir -p /home/ruoyi/web/ruoyi-ui:这是在容器内创建一个目录 /home/ruoyi/web/ruoyi-ui。应用服务、

大家好,我是爪哇小小怪,热爱Java后端开发者,两年多JAVA开发经验(工作以来一直从事Java全栈开发),一个想要与大家共同进步的码农。如果该网络不存在,需要先创建它:

dockernetwork create ruoyi
  • mysql:8.0.27: 使用 mysql镜像的 8.0.27版本。在Windows或Mac系统上 如何安装Docker Desktop就不说是怎么装的了,想要在Windows/Mac上安装Docker Desktop的博友们,可以去自己百度查询安装的方法

    (4)验证安装是否完成

    执行如下命令,如果能够正常显示出版本号,则表示已经完成

    docker-compose--version

    在这里插入图片描述

    上述是在线安装的步骤,也可以去github下载docker-compose进行离线安装,地址:https://github.com/docker/compose/releases?page=1 , 离线安装的第1步就是下载好的docker-compose-linux-x86_64 文件上传到/usr/local/bin/目录,然后安装上面的第(2) (3) (4)步操作即可

    2.2 使用pip install方式进行安装

    因为docker-compose是使用python语言开发的,因此可以通过pip install的方式进行安装

    (1)首先需要确保pip已经安装完成,如果没有安装python,可以通过 yum install -y python3命令进行安装,CentOS7默认的yum仓库中包含Python 3.6,如下图所示:运行yum install -y python3命令安装完成后的版本的是3.6.8,如果想要安装比yum仓库中更新的Python版本,可以从源码编译安装

  • --network ruoyi将容器连接到名为ruoyi的自定义网络。但是,文章中展示的部署过程都是手动逐一进行操作的,干过开发的朋友们心中应该明白真实的企业项目开发中,稍微复杂一点的单体式项目还需要其它的各种各样的中间件,比如MQ,Kafka,MyCat等等,需要部署的软件环境远不止3个,如果还像我去年写的这篇文章一样逐一的部署,那不是太麻烦了?所以这篇文章给大家聊一下docker-compose。

  • -e TZ=Asia/Shanghai: 设置时区为 Asia/Shanghai

  • -e MYSQL_ROOT_PASSWORD=root: 设置环境变量 MYSQL_ROOT_PASSWORDroot。mysql-dockerfile、通过 Docker Compose,用户可以使用 YAML 文件来定义应用服务的配置,并通过单一命令启动所有相关的容器,使得在开发、

    WORKDIR /home/ruoyi/web/ruoyi-ui:这是指定容器的工作目录为 /home/ruoyi/web/ruoyi-ui,后续的指令都会在该目录下执行。

    1.1 docker-compose的基本概念

    docker-compose核心概念如下:

    • 服务(Services):服务是一个 Docker 容器的抽象,定义了容器的具体配置,比如镜像、Compose 文件中的每个服务都会对应一个 Docker 容器
    • 应用(App):一个完整的应用通常由多个服务组成(例如数据库服务、

      VOLUME /home/ruoyi/web/ruoyi-ui:这是创建一个挂载点,将主机的目录 /home/ruoyi/web/ruoyi-ui与容器内的目录进行挂载,实现主机和容器之间的文件共享。

    • -p 33306:3306: 将主机的 33306端口映射到容器的 3306端口。

    • -e MYSQL_DATABASE=ry-vue: 设置环境变量 MYSQL_DATABASEry-vue。ruoyi-dockerfile

      redis-dockerfile

      # 基础镜像FROM redis:5.0.14# 挂载目录VOLUME /home/ruoyi/redis# 创建目录RUN mkdir-p/home/ruoyi/redis# 指定路径WORKDIR /home/ruoyi/redis# 复制conf文件到路径COPY ./conf/redis.conf /home/ruoyi/redis/redis.conf

      mysql-dockerfile

      # 基础镜像FROM mysql:8.0.27# 执行sql脚本ADD ./db/*.sql /docker-entrypoint-initdb.d# 注意:MySQL 容器在首次启动时会自动执行 /docker-entrypoint-initdb.d/ 目录下的 SQL 脚本,但在后续启动时不会重复执行这些脚本。

      在这里插入图片描述

      在这里插入图片描述

      2.1 官方文档推荐安装方式

      (1)下载docker-compose

      执行下方的命令进行下载

      curl-L"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-compose

      如果下载的速度很慢,可以使用如下的命令

      curl-L"https://mirror.ghproxy.com/https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-compose

      在这里插入图片描述

      (2)修改目录权限

      chmod+x /usr/local/bin/docker-compose

      (3)创建软连接

      ln-s/usr/local/bin/docker-compose /usr/bin/docker-compose

      说明

      • ln: 这是 Linux 中用于创建硬链接或符号链接的命令。

        在这里插入图片描述

        3.3.4 在 conf文件夹下添加nginx.conf和redis.conf文件

        nginx.conf

        #user  nobody;worker_processes  1;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       86;server_name  localhost;client_max_body_size 10m;location / {root   /home/ruoyi/web/ruoyi-ui;index  index.html index.htm;try_files $uri$uri/ /index.html;}location /prod-api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://ruoyi-server:8080/;}error_page   500502503504/50x.html;location =/50x.html {root   html;}}}

        redis.conf

        # requirepass 123456

        这两个conf 前面已经说明了 是将主机当前目录下的conf 目录复制到容器内的路径下

        3.3.5 运行命令创建并启动所有service容器

        (1)相关命令如下:

        docker-composeup -d

        在这里插入图片描述

        (2)执行完成后,使用docker ps -a命令查看 容器是否已经全部启动,如果状态全部为up则表示启动成功

        (3)启动成功后,会生成4个文件夹,如下图所示:

        在这里插入图片描述

        (4)然后通过浏览器访问部署完成的项目,如果成功访问则表示部署成功。

        在这里插入图片描述

        注意:写成服务名称的好处:以后如果迁移到别的服务器上,只要使用docker compose运行,就可以运行起来

        (2)打包前端项目:进入 ruoyi-ui 目录,运行npm run build:prod命令或者通过WebStorm打开这个项目前端并找到package.json文件 点击"build:prod"左侧的绿色小箭头来打包前端项目。这样做是为了将主机上的 Nginx 配置文件复制到容器内,以便在容器中使用自定义的 Nginx 配置。

        COPY ./conf/nginx.conf /etc/nginx/nginx.conf:这是将主机当前目录的 ./conf/nginx.conf文件复制到容器内的 /etc/nginx/nginx.conf路径下。语法如下:

        docker compose [OPTIONS][COMMAND]

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

        类型参数或指令说明
        Options-f指定compose文件的路径和名称
        -p指定project名称。博主上传到了 /home/dxl/docker-compose-ruoyi/jar目录下

        在这里插入图片描述

        3.3.3 数据库文件上传

        (1)将若依项目中sql文件夹下提供的两个sql脚本文件上传到服务器,博主上传到了 /home/dxl/docker-compose-ruoyi/db目录下

        在这里插入图片描述

        在这里插入图片描述

        (2)上传完成后,分别在两个SQL脚本文件添加 SET NAMES 'utf8', 防止导入SQL脚本后出现中文乱码的情况。端口映射等。缓存服务等),这些服务通过 Compose 文件进行配置。

      • -s: 这个选项表示创建的是符号链接(软链接),而不是硬链接。

        COPY ./html/dist /home/ruoyi/web/ruoyi-ui:这是将主机当前目录的 ./html/dist目录复制到容器内的 /home/ruoyi/web/ruoyi-ui路径下。Redis 和 Nginx,这三个容器完成了所有的部署工作。如下图所示:系统可以正常登录访问、在后续启动时,容器会检测到数据库已经存在,并跳过初始化步骤。

      • 如果使用docker-compose.yml文件来定义,如下所示:

        version:"3"services:mysql:container_name:mysql    image:mysql:8.0.27    restart:always    ports:-"23306:3306"command:--lower_case_table_names=1    environment:MYSQL_DATABASE:ry-vue      MYSQL_ROOT_PASSWORD:root      MYSQL_ROOT_HOST:'%'TZ:Asia/Shanghai    volumes:-./mysql/data:/var/lib/mysql    networks:-ruoyinetworks:ruoyi:name:ruoyi

        对比效果:

        docker run 参数docker compose 指令说明
        –namecontainer_name容器名称
        -pports端口映射
        -eenvironment环境变量
        -vvolumes数据卷配置
        –networknetworks网络

        理解了对应的关系,就可以知道这个docker-compose.yml文件应该如何写了。环境变量、这样做是为了将主机上的静态 HTML 文件复制到容器内,以供 Nginx 服务器提供静态网页服务。

      • /usr/local/bin/docker-compose: 这是源文件路径,即你希望链接到的实际 docker-compose可执行文件的位置。

        nginx-dockerfile

        # 基础镜像FROM nginx:1.22.0# 挂载目录VOLUME /home/ruoyi/web/ruoyi-ui# 创建目录RUN mkdir-p/home/ruoyi/web/ruoyi-ui# 指定路径WORKDIR /home/ruoyi/web/ruoyi-ui# 复制conf文件到路径COPY ./conf/nginx.conf /etc/nginx/nginx.conf# 复制html文件到路径COPY ./html/dist /home/ruoyi/web/ruoyi-ui

        相关解释

        使用nginx:1.22.0作为基础镜像。

      • -v $(pwd)/mysql/data:/var/lib/mysql: 将当前目录下的 mysql/data目录挂载到容器的 /var/lib/mysql目录,用于持久化数据。

        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

      • --name mysql: 为容器指定名称为 mysql。网络

      • ps列出所有启动的容器
        logs查看指定容器的日志
        stop停止容器
        start启动容器
        restart重启容器
        top查看运行的进程
        exec在指定的运行中容器中执行命令

        3.3 部署演示

        3.3.1 前端打包上传

        (1)修改前端项目ruoyi-ui的vue.config.js中的devServer: 下的代理部分的host为docker-compose.yml中的前端服务名称,修改了target对应的IP为docker-compose.yml中的后端服务名称。

      • --restart always: 设置容器在退出时总是重启。符号链接类似于 Windows 系统中的快捷方式,指向另一个文件或目录。

      • -e MYSQL_ROOT_HOST=%: 设置环境变量 MYSQL_ROOT_HOST%,允许所有主机连接。

        1. docker-compose介绍

        定义:Docker Compose是一个用于定义和运行多容器 Docker 应用的工具。这将生成一个 dist 目录,其中包含了打包后的前端静态文件。

        这样,使用该镜像创建的容器就可以运行 Nginx 服务器,并提供指定的配置和静态网页。

      • --lower_case_table_names=1: 这是传递给 MySQL 启动命令的参数,用于设置表名不区分大小写。

      为什么需要这样做?

      在 Linux 系统中,/usr/bin通常在 PATH环境变量的优先级上高于 /usr/local/bin

      2. docker-compose安装步骤

      **注:**首先在这里说明一下在Windows/Mac 系统中只需要成功安装Docker Desktop即可正常使用docker-compose,Docker Desktop已经包含了docker-compose,博主之前开发项目时,因为需要运行chirpstack,所以安装过Docker Desktop。测试和生产环境中管理 Docker 容器变得更加高效和便捷。

      ruoyi-dockerfile

      # 基础镜像FROM openjdk:8-jre# 挂载目录VOLUME /home/ruoyi# 创建目录RUN mkdir-p/home/ruoyi# 指定路径WORKDIR /home/ruoyi# 复制jar文件到路径COPY ./jar/*.jar /home/ruoyi/ruoyi-admin.jar# 启动应用ENTRYPOINT ["java","-jar","ruoyi-admin.jar"]

      docker-compose.yml

      version:'3'services:ruoyi-redis:container_name:ruoyi-redis    restart:always    build:context:.      dockerfile:redis-dockerfile    ports:-"26379:6379"volumes:-./conf/redis.conf:/home/ruoyi/redis/redis.conf      -./redis/data:/data    command:redis-server /home/ruoyi/redis/redis.conf      ruoyi-mysql:container_name:ruoyi-mysql    restart:always    build:context:.      dockerfile:mysql-dockerfile    ports:-"23306:3306"command:['mysqld','--innodb-buffer-pool-size=80M','--character-set-server=utf8','--collation-server=utf8_general_ci','--default-time-zone=+8:00','--lower_case_table_names=1']environment:MYSQL_DATABASE:'ry-vue'MYSQL_ROOT_PASSWORD:root      MYSQL_ROOT_HOST:'%'TZ:Asia/Shanghai    volumes:-./mysql/conf:/etc/mysql/conf.d      -./mysql/logs:/logs      -./mysql/data:/var/lib/mysql  ruoyi-server:container_name:ruoyi-server    restart:always    build:context:.      dockerfile:ruoyi-dockerfile    volumes:-./ruoyi/logs:/home/ruoyi/logs      -./ruoyi/uploadPath:/home/ruoyi/uploadPath    ports:-"28080:8080"depends_on:-ruoyi-redis      -ruoyi-mysql        ruoyi-nginx:container_name:ruoyi-nginx    restart:always    build:context:.      dockerfile:nginx-dockerfile    ports:-"286:86"volumes:#- ./html/dist:/home/ruoyi/web/ruoyi-ui-./conf/nginx.conf:/etc/nginx/nginx.conf      -./nginx/logs:/var/log/nginx      #- ./nginx/conf.d:/etc/nginx/conf.depends_on:-ruoyi-server

      注:compose与docker的兼容性

      Compose file formatDocker Engine release
      Compose specification19.03.0+
      3.819.03.0+
      3.718.06.0+
      3.618.02.0+
      3.517.12.0+
      3.417.09.0+
      3.317.06.0+
      3.217.04.0+
      3.11.13.1+
      3.01.13.0+
      2.417.12.0+
      2.317.16.0+
      2.21.13.0+
      2.11.12.0+
      2.01.10.0+

      3.2 基础命令

      编写好docker-compose.yml文件,就可以部署了。正常的发出请求和接收响应数据。网络、使用 -p参数可以递归创建目录,如果目录已存在则不会报错。nginx-dockerfile、数据卷等资源,并将它们连接在一起,完成整个应用的部署。

      在这里插入图片描述

      在这里插入图片描述

      (3) 将打包好的dist 打包成zip文件 上传到服务器的指定目录即可(比如博主将这个dist上传到了/home/dxl/docker-compose-ruoyi/html目录下),然后运行unzip dist.zip命令解压文件,如果运行后出现-bash: unzip: command not found这个错误则表示需要安装unzip,安装的命令是yum install unzip(如果是在非root账户下操作需要在 yum 前面需要加上sudo )

      在这里插入图片描述

      3.3.2 后端打包上传

      (1)找到ruoyi-admin包下的两个配置文件,文件路径如下所示:

      在这里插入图片描述

      (2)修改application.yml文件,把redis的host改成docker-compose.yml中定义的redis服务名称

      在这里插入图片描述

      (3)修改application-druid.yml文件,把原本的localhost改成docker-compose.yml中定义的mysql服务名称

      在这里插入图片描述

      (4)对文件进行打包,在本地打包后端完成,target目录下会出现一个jar包,如下所示: 然后将jar包上传到服务器的目录。

    1.2 docker-compose的工作原理

    docker-compose主要通过一个名为docker-compose.yml的YAML文件来定义多个容器的配置。

  • 卷(Volumes):Docker Compose 支持卷挂载,允许容器之间共享数据,或在容器停止后持久化数据。

    在这里插入图片描述

    通过文章中展示的部署过程,我们可以发现部署若依前后端其实只需要配置3个容器:MySQL、

    前言

    23年7月我发布了一篇若依前后端分离项目部署文章,当时写文章时,部署这个项目的技术采用的是Docker技术进行部署的。

  • /usr/bin/docker-compose: 这是目标路径,即在系统路径中更靠前的位置创建一个指向 docker-compose的链接。

    在这里插入图片描述

    (2)升级pip版本

    python3 -mpip install--upgradepip

    在这里插入图片描述

    (3)安装docker-compose

    pip3 installdocker-compose

    在这里插入图片描述

    (4)安装完成后,验证是否安装成功

    docker-compose--version

    在这里插入图片描述

    注:2.1和2.2 描述的两种安装方式任选一种即可

    3. 使用docker-compose部署若依前后端

    3.1 基本语法

    例:使用docker部署MySQL的命令如下:

    dockerrun -d\--namemysql \--restartalways \-p23306:3306 \-eMYSQL_DATABASE=ry-vue \-eMYSQL_ROOT_PASSWORD=root \-eMYSQL_ROOT_HOST=% \-eTZ=Asia/Shanghai \-v$(pwd)/mysql/data:/var/lib/mysql \--networkruoyi \mysql:8.0.27 \--lower_case_table_names=1

    上述命令的相关解释

    • -d: 后台运行容器。因此,将 /usr/local/bin/docker-compose创建一个符号链接到 /usr/bin/docker-compose可以确保当你运行 docker-compose命令时,系统会优先使用 /usr/local/bin下的版本,而不是可能存在旧版本的 /usr/bin下的版本。

    • 网络(Networks):Compose 默认会为容器创建一个自定义的网络,容器可以通过该网络互相通信。project就是当前compose文件中设置的多个service的集合,是逻辑概念Commandsup创建并启动所有service容器down停止并移除所有容器、