• 微服务06-Dockerfile自定义镜像+DockerCompose部署多个镜像


    常见的镜像在DockerHub能找到,但是我们自己写项目得自己构造镜像

    1 镜像结构

    在这里插入图片描述
    作用:提高复用性,当应用需要更新时,不再是整个系统重装进行更新 ,而是对需要更新的部分进行更新,其他地方不动——>这就是分层的好处 每做一次新的操作会产生新的一层

    简单来说,镜像就是在系统函数库、运行环境的基础上添加应用程序文件、配置文件,然后合并后+编写好的启动脚本(镜像运行的入口)一起形成的文件

    所以说,构建镜像,就是实现上述打包过程

    在这里插入图片描述

    2 什么是Dockerfile

    构建自定义镜像,如果一个个文件去拷贝打包,会非常麻烦;

    我们只需要告诉Docker,我们镜像的组成结构,需要哪些BaseImage、拷贝哪些依赖,需要哪些启动脚本,那么Docker将会帮助构建镜像;

    而DockerFile:是一个文本文件,里面的指令描述了要什么样的操作来构建镜像;

    在这里插入图片描述

    更新详细语法说明,请参考官网文档:Dockerfile reference | Docker Documentation

    举例:构建Java项目

    在这里插入图片描述

    • 步骤1:.首先新建一个空文件夹docker-demo,然后将文件拷贝到里面
      在这里插入图片描述
    • 步骤2:.设置DockerFile中的内容(利用DockerFile指令设置镜像的每一层内容:就是函数库、依赖、环境啥的):
    # 指定基础镜像
    FROM ubuntu:16.04
    # 配置环境变量,JDK的安装目录
    ENV JAVA_DIR=/usr/local
     
    # 拷贝jdk和java项目的包
    COPY ./jdk8.tar.gz $JAVA_DIR/
    COPY ./docker-demo.jar /tmp/docker-demo.jar
     
    # 安装JDK
    RUN cd $JAVA_DIR \
     && tar -xf ./jdk8.tar.gz \
     && mv ./jdk1.8.0_144 ./java8
     
    # 配置环境变量
    ENV JAVA_HOME=$JAVA_DIR/java8
    ENV PATH=$PATH:$JAVA_HOME/bin
     
    # 暴露端口
    EXPOSE 8090
    # 入口,java项目的启动命令
    ENTRYPOINT java -jar /tmp/docker-demo.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 步骤3:.然后我们在当前目录下 执行docker build命令:创建镜像给到岛屿(本地)

    • 步骤4:进入docker-demo

      将准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下

    • 步骤5:运行命令:

      docker build -t javaweb:1.0 .
      
      • 1

    最后访问 http://192.168.XX.XXX:8090/hello/count,其中的ip改成你的虚拟机ip

    在这里插入图片描述

    3 DockerCompose是什么以及其作用

    1.DockerCompose是一个文本文件,里面通过指令定义了每个容器如何运行的

    在这里插入图片描述

    2.DockerCompose可以快速部署多个容器,而无需一个个docker run

    在这里插入图片描述

    不用端口是因为集群,自己访问就行了,所以端口不需要暴露;

    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
      下面这个web:build : . xxxx类似于:1.用来用户主动自定义build镜像给到岛屿(本地),后面的.代表当前文件目录下build镜像 .然后后面的ports相当于docker run了生成容器

    DockerCompose的详细语法参考官网:DockerCompose的详细语法

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

    4 安装DockerCompose

    • 1.通过命令下载,或者通过资料上传到/usr/lcoal/bin目录也行
    # 安装
    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
    • 2.修改权限
    # 修改权限
    chmod +x /usr/local/bin/docker-compose
    
    • 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
    • 4.若出现错误
    echo "199.232.88.XXX raw.githubusercontent.com" >> /etc/hosts
    
    • 1

    5 Compose部署微服务demo

    Compose部署微服务demo

    在这里插入图片描述
    这里我们再复习一下DockerFIle:

    一种构建镜像最常用的方式,包括:基础镜像信息+层层叠加,维护更新(容器启动指令+镜像操作指令…)

    Docker从上到下顺序执行DockerFIle指令,为了指定基本映象,第一条指令时FROM

    每条指令都会创建一个新的镜像层,并对镜像进行提交

    实现步骤

    1.cloud项目需要打成jar包后放到各自服务的文件夹下,同时还需要+DockerFile文件,分别代表:

    java8,拷贝的app.jar文件,启动脚本
    在这里插入图片描述

    内容如下:

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

    2.每个服务的DockerFile准备好后(也就是镜像构建好),我们还需要DockerCompose:——>目的是将多个镜像全部启动

    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表:
    在这里插入图片描述

    需要注意的是:

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

    如下所示:

    spring:
      datasource:
        url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
        username: root
        password: 123456
        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

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

    3.部署

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

    上传到任意目录:
    在这里插入图片描述

    部署:

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

    docker-compose up -d
    
    • 1
  • 相关阅读:
    机器学习入门教学——决策树
    【大数据处理技术】第二篇 大数据存储与管理(持续更新)
    react 生命周期
    MATLAB | 全网唯一,三元相映射图绘制(三元相分级统计地图)
    安卓 MediaRecorder 录音调用 mMediaRecorder.start(); 抛出 start failed. 异常
    设计模式学习笔记 - 面向对象 - 7.为什么要多用组合少用继承?如何决定该用组合还是继承?
    神经网络与深度学习(三):循环神经网络网络
    【项目 计网12】4.32UDP通信实现 4.33广播 4.34组播 4.35本地套接字通信
    perl之print,printf,sprintf使用案例详解
    归并排序及其拓展应用
  • 原文地址:https://blog.csdn.net/weixin_67201964/article/details/132744394