• SpringBoot整合Docker实现一次构建到处运行


    写在前面

    🍁个人主页:微枫Micromaple

    ✨本期专栏:《0到1项目搭建》欢迎订阅学习~

    📌源码获取:GitCodeGitHub码云Gitee 持续更新中,别忘了 star 喔~

    本文讲解的是 SpringBoot 引入容器化技术 Docker 实现一次构建到处运行,包括镜像构建、Docker仓库搭建使用、Docker仓库可视化UI等内容。

    PS:如果你是新手,可以跟着系列专栏的框架搭建先动手把项目搭建起来,然后在结合本期内容继续深入学习,这样会有更好的效果。

    一、容器化部署的好处

    在这里插入图片描述

    Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。

    传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

    最重要的是一致的运行环境Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而达到真正意义上的 一次构建,到处执行

    二、构建镜像

    2.1、Dockerfile

    接着我们开始使用 Dockerfile 来定制我们的镜像,从而达到容器化的目的。Dockerfile 的本质就是将一系列修改、安装、构建、操作的命令整合到一起,去构建一个个性化的镜像,以达到**一次构建,到处运行。**接下来我们就来构建自定义镜像。

    my-project-server模块下创建docker目录,在docker目录下创建Dockerfile。代码如下:

    FROM openjdk:8-jre
    
    MAINTAINER Micromaple 
    
    RUN mkdir /app
    
    COPY my-project-server-1.0.0-SNAPSHOT.jar /app/app.jar
    
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod,druid-prod"]
    
    EXPOSE 8899
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • FROM:指定基础镜像,项目是使用jdk8开发的项目,所以我们指定的基础镜像为openjdk:8-jre
    • MAINTAINER:项目维护人员
    • RUN:执行命令,在根目录下创建app目录
    • COPY:将宿主机当前目录下的my-project-server-1.0.0-SNAPSHOT.jar文件拷贝到app目录下,并重命名为app.jar
    • ENTRYPOINT:指定容器启动程序及参数
    • EXPOSE:指定运行时容器提供服务的端口

    2.2、开始构建

    在虚拟机创建目录

    mkdir -p /usr/local/docker/my-project/docker
    
    • 1

    将打包后的my-project-server-1.0.0-SNAPSHOT.jar文件和Dockerfile文件上传至该目录。

    在这里插入图片描述

    执行镜像构建命令

    docker build -t my-project-server:v1 .
    
    • 1

    构建成功

    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    my-project-server   v1                  ed30386b06d2        11 seconds ago      334MB
    openjdk             8-jre               26ac3f63d29f        9 months ago        273MB
    
    • 1
    • 2
    • 3
    • 4

    三、搭建私服

    3.1、搭建 Docker Registry

    创建目录

    mkdir -p /usr/local/docker/registry
    
    • 1

    在该目录下创建Docker Registrydocker-compose.yml。内容如下:

    cd /usr/local/docker/registry
    
    • 1
    version: '3.1'
    services:
      registry:
        image: registry
        restart: always
        container_name: registry
        ports:
          - 5000:5000
        volumes:
          - ./data:/var/lib/registry
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    启动容器

    docker-compose up -d
    
    • 1

    3.2、搭建 Docker Registry WebUI

    创建目录

    mkdir -p /usr/local/docker/docker-registry-frontend
    
    • 1

    在该目录下创建Docker Registrydocker-compose.yml。内容如下:

    cd /usr/local/docker/docker-registry-frontend
    
    • 1
    version: '3.1'
    services:
      frontend:
        image: konradkleine/docker-registry-frontend:v2
        ports:
          - 8080:80
        volumes:
          - ./certs/frontend.crt:/etc/apache2/server.crt:ro
          - ./certs/frontend.key:/etc/apache2/server.key:ro
        environment:
          - ENV_DOCKER_REGISTRY_HOST=192.168.110.158(Docker仓库的IP)
          - ENV_DOCKER_REGISTRY_PORT=5000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    需要将ENV_DOCKER_REGISTRY_HOST的值更改为自己搭建的 DockerRegistry 服务的IP

    启动容器

    docker-compose up -d
    
    • 1

    浏览器访问http://192.168.110.158:8080/,效果如下:

    在这里插入图片描述

    3.3、客户端配置

    在需要上传 Docker 镜像的客户端需配置daemon.json,完整路径在 /etc/docker/daemon.json

    vi /etc/docker/daemon.json
    
    • 1

    需增加如下内容:

    "insecure-registries": [
      "Docker仓库的IP:5000"
    ]
    
    • 1
    • 2
    • 3

    完整daemon.json内容:

    {
      "registry-mirrors": [
        "https://xxx.mirror.aliyuncs.com"
      ],
      "insecure-registries": [
        "192.168.110.158:5000"
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • registry-mirrors:为镜像加速地址,这里为我自己申请的加速地址。大家可以自己申请一个,也可以在网上找一个。
    • insecure-registries:Docker仓库的IP。

    重新启动服务

    systemctl daemon-reload
    systemctl restart docker
    
    • 1
    • 2

    3.4、上传私服

    搭建以及配置完成后,需要将我们之前构建的镜像上传至我们自己的Docker仓库。

    查看镜像

    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    my-project-server   v1                  6af7d633afb7        5 seconds ago       334MB
    openjdk             8-jre               26ac3f63d29f        9 months ago        273MB
    
    • 1
    • 2
    • 3
    • 4

    1)、镜像标记

    使用 docker tagmy-project-server:v1 这个镜像标记为 192.168.110.158:5000/my-project-server:v1

    192.168.110.158为我的Docker仓库的IP。

    格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

    命令如下:

    docker tag my-project-server:v1 192.168.110.158:5000/my-project-server:v1
    
    • 1

    标记后,查看镜像

    $ docker images
    REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
    192.168.110.158:5000/my-project-server   v1                  6af7d633afb7        3 minutes ago       334MB
    my-project-server                        v1                  6af7d633afb7        3 minutes ago       334MB
    openjdk                                  8-jre               26ac3f63d29f        9 months ago        273MB
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2)、镜像上传

    使用 docker push 上传镜像。

    $ docker push 192.168.110.158:5000/my-project-server
    The push refers to repository [192.168.110.158:5000/my-project-server]
    5b9e874b9f9c: Pushed 
    e87c042d22f8: Pushed 
    b4cfcb8385a8: Pushed 
    2b730cf18c09: Pushed 
    edeaba958753: Pushed 
    8bf42db0de72: Pushed 
    31892cc314cb: Pushed 
    11936051f93b: Pushed 
    v1: digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40 size: 2000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3)、查看镜像

    使用 curl 查看 192.168.110.158:5000/v2/_catalog 地址,可以看到上传成功的镜像

    $ curl 192.168.110.158:5000/v2/_catalog
    {"repositories":["my-project-server"]}
    
    • 1
    • 2

    这里我们可以成功的看到我们上传的镜像。

    我们也可以在我们刚刚搭建的WebUI上可视化的查看我们的镜像。效果图如下:

    在这里插入图片描述

    4)、验证

    此时我们将本地镜像删除,尝试从私有仓库下载这个镜像

    先删除已有镜像

    docker rmi my-project-server:v1 192.168.110.158:5000/my-project-server:v1
    
    • 1

    下载镜像

    docker pull 192.168.110.158:5000/my-project-server:v1
    
    • 1
    $ docker pull 192.168.110.158:5000/my-project-server:v1
    v1: Pulling from my-project-server
    0e29546d541c: Already exists 
    9b829c73b52b: Already exists 
    cb5b7ae36172: Already exists 
    99ce012bef04: Already exists 
    22dc2a72d098: Already exists 
    9c69a57e10d9: Already exists 
    776f54050ab5: Pull complete 
    65a83a9a7871: Pull complete 
    Digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40
    Status: Downloaded newer image for 192.168.110.158:5000/my-project-server:v1
    192.168.110.158:5000/my-project-server:v1
    $ docker images
    REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
    192.168.110.158:5000/my-project-server   v1                  6af7d633afb7        15 minutes ago      334MB
    openjdk                                  8-jre               26ac3f63d29f        9 months ago        273MB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    我们可以看到可以正常拉取。

    四、容器启动

    镜像构建并上传至完成后,可以直接使用Docker Compose来启动容器。实现一次构建到处运行。

    创建目录

    mkdir -p /usr/local/docker/my-project
    
    • 1

    在该目录下创建Docker Registrydocker-compose.yml。内容如下:

    cd /usr/local/docker/my-project
    
    • 1
    version: '3.1'
    services:
      my_project_server:
        image: 192.168.110.158:5000/my-project-server:v1
        container_name: my-project-server
        restart: always
        ports:
          - 8899:8899
        volumes:
          - ./logs:/logs
        environment:
          TZ: Asia/Shanghai
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    启动容器

    docker-compose up -d
    
    • 1

    查看容器启动状态

    docker ps -a
    
    • 1

    访问查询所有用户接口

    http://ip:8899/sys-user/get/all
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    数据分析与挖掘: 红楼梦人物关系(Python)词云图
    Python爬虫(二十四)_selenium案例:执行javascript脚本
    .NET周刊【8月第1期 2023-08-06】
    记一次 .NET某企业数字化平台 崩溃分析
    目标检测算法——YOLOv7改进|增加小目标检测层
    Flink 窗口分配器 WindowAssigner
    matlab⾼级绘图时间距离图像
    sentry线上报跨域问题记录
    C++ 类的前置声明
    极客重学前端3 - JavaScript对象:面向对象还是基于对象?
  • 原文地址:https://blog.csdn.net/qq_41779565/article/details/127356651