• 【微服务】Docker-Compose


    Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

    在这里插入图片描述

    1.1 初识DockerCompose

    Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:

    version: "3.8"
     services:
      mysql:
        image: mysql:5.7.25
        environment:
         MYSQL_ROOT_PASSWORD: 123 
        volumes:
         - "/tmp/mysql/data:/var/lib/mysql"
         - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
      web:
        build: .
        ports:
         - "8090:8090"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上面的Compose文件就描述一个项目,其中包含两个容器:

    • mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录
    • web:一个基于docker build临时构建的镜像容器,映射端口时8090

    DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/

    其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语法稍有差异。

    1.2 安装DockerCompose

    1.2.1 下载

    Linux下需要通过命令下载:

    # 安装
    curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
    • 1
    • 2

    如果下载速度较慢,或者下载失败,使用离线文件上传到/usr/local/bin/目录也可以。

    在这里插入图片描述

    1.2.2 修改文件权限

    # 修改权限
    chmod +x /usr/local/bin/docker-compose
    
    • 1
    • 2

    在这里插入图片描述

    1.2.3 Base自动补全命令

    # 补全命令
    curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
    
    • 1
    • 2

    如果这里出现错误,需要修改自己的hosts文件:

    echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
    
    • 1

    1.3 部署微服务集群

    需求:将之前学习的cloud-demo微服务集群利用DockerCompose部署

    实现思路

    ① 查看提供的cloud-demo文件夹,里面已经编写好了docker-compose文件

    ② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名

    ③ 使用maven打包工具,将项目中的每个微服务都打包为app.jar

    ④ 将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中

    ⑤ 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署

    1.3.1 compose文件

    查看提供的cloud-demo文件夹,里面已经编写好了docker-compose文件,而且每个微服务都准备了一个独立的目录:

    在这里插入图片描述

    docker-compose.yml内容如下:

    version: "3.2"
    
    services:
      nacos:
        image: nacos/nacos-server
        environment:
          MODE: standalone
        ports:
          - "8848:8848"
      mysql:
        image: mysql:5.7.25
        environment:
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "$PWD/mysql/data:/var/lib/mysql"
          - "$PWD/mysql/conf:/etc/mysql/conf.d/"
      userservice:
        build: ./user-service
      orderservice:
        build: ./order-service
      gateway:
        build: ./gateway
        ports:
          - "10010:10010"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    可以看到,其中包含5个service服务:

    • nacos:作为注册中心和配置中心
      • image: nacos/nacos-server: 基于nacos/nacos-server镜像构建
      • environment:环境变量
        • MODE: standalone:单点模式启动
      • ports:端口映射,这里暴露了8848端口
    • mysql:数据库
      • image: mysql:5.7.25:镜像版本是mysql:5.7.25
      • environment:环境变量
        • MYSQL_ROOT_PASSWORD: 123:设置数据库root账户的密码为123
      • volumes:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我们提前准备好的数据
    • userserviceorderservicegateway:都是基于Dockerfile临时构建的

    查看mysql目录,可以看到其中已经准备好了cloud_order、cloud_user表:

    在这里插入图片描述

    查看微服务目录,可以看到都包含Dockerfile文件:

    在这里插入图片描述

    内容如下:

    FROM java:8-alpine
    COPY ./app.jar /tmp/app.jar
    ENTRYPOINT java -jar /tmp/app.jar
    
    • 1
    • 2
    • 3

    1.3.2 修改微服务配置

    因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。这里将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。

    如下所示:

    spring:
      datasource:
        url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
        username: root
        password: 123
        driver-class-name: com.mysql.jdbc.Driver
      application:
        name: orderservice
      cloud:
        nacos:
          server-addr: nacos:8848 # nacos服务地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.3.3 打包

    接下来需要将每个微服务都打包。因为之前查看到Dockerfile中的jar包名称都是app.jar,因此每个微服务都需要用这个名称。

    可以通过修改pom.xml中的打包名称来实现,每个微服务都需要修改:

    <build>
      
      <finalName>appfinalName>
      <plugins>
        <plugin>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-maven-pluginartifactId>
        plugin>
      plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1.3.4 拷贝jar包到部署目录

    编译打包好的app.jar文件,需要放到Dockerfile的同级目录中。注意:每个微服务的app.jar放到与服务名称对应的目录,别搞错了。

    user-service:

    在这里插入图片描述

    order-service:

    在这里插入图片描述

    gateway:

    在这里插入图片描述

    1.3.5 部署

    最后,需要将整个cloud-demo文件夹上传到虚拟机中,利用DockerCompose部署。

    lrzsz不支持文件夹上传,先将文件夹压缩成.rar文件上传,再解压.rar文件。参考:centos如何解压rar格式文件

    在这里插入图片描述

    进入cloud-demo目录,然后运行下面的命令:

    docker-compose up -d
    
    • 1

    在这里插入图片描述

    查看容器

    在这里插入图片描述

    查看日志

    docker-compose logs -f
    
    • 1

    通过日志看到出现异常,nacos连接异常,因为nacos服务后启动,故先启动时其它服务连接nacos失败,需要重启其它服务

    docker-compose logs -f [服务名]查看具体服务的日志,如docker-compose logs -f userservice

    重启服务

    docker-compose restart gateway userservice orderservice
    
    • 1

    本机测试

    在这里插入图片描述

  • 相关阅读:
    计算机程序设计艺术习题解答(Excercise 1.2.2-28~30题)
    工程伦理--14.2 国际工程职业实践的超文化规范
    【Android】关于touch设备TOOL_TYPE_STYLUS
    路由器虚拟服务器有什么作用
    项目管理逻辑:项目如何算是做完?什么是项目管理中的PPP模式?
    EffectiveC++-条款40:明智而审慎地使用多重继承
    分布式数据库系统
    【Spark NLP】第 5 章:处理词
    框架&Mybatis的基础了解
    c++&qt day4
  • 原文地址:https://blog.csdn.net/qq_45917176/article/details/127679131