首页 > 其他分享 >Docker是什么-通过部署一个SpringBoot项目到Docker来快速理解它

Docker是什么-通过部署一个SpringBoot项目到Docker来快速理解它

时间:2024-09-23 11:37:46浏览次数:8  
标签:容器 SpringBoot 部署 mysql 镜像 docker Docker

Docker是什么

Docker是一个开源的容器化技术,它可以使开发人员将自己的程序打包成一个完整的镜像,这个镜像包含了程序以及它依赖的运行环境,可以任意系统的机器上部署,只要其安装了Docker。下面介绍下Docker和核心的概念

容器化(container)

服务程序部署可以分为三个阶段

  1. 物理机器部署,多个服务部署在物理机器,共享机器的cpu、内存,这种部署方式最简单直接,但是一但某一个服务出现问题,占用cpu资源和内存过高,会影响其他服务的稳定运行。服务所以依赖的各种环境和配置都需要在机器配置好才能部署,如果多个机器,工作量翻倍且重复。
  2. 虚拟机部署,为了解决资源共享的问题,在物理机器上部署多个虚拟机,每个虚拟机上有独立的操作系统,并且有单独的cpu资源和内存资源,然后在虚拟机上部署服务。但是虚拟机上有独立的操作系统,本身就比较占用资源。并且部署方式和物理部署一样繁琐
  3. 容器化部署,它的和虚拟机很像,能做到资源隔离,但是它占用的资源很小,它可以将程序所依赖的环境配置打包成一个镜像,每个容器都可以用这个镜像启动服务,无需额外的配置。

镜像(image)

刚才提到可以将程序所依赖的环境和配置打包成一个镜像,那么环境中最重要的就是操作系统的,操作系统可以分为内核空间和用户空间,如果将操作系统全都打包进去,那就和虚拟机没什么区别,因此docker仅仅将用户空间、依赖库、文件系统打包成一个基础镜像(basic image)。这个基础镜像是服务运行的基础。

除了基础镜像还不够,服务还有各种依赖项和配置,可以将这些配置和依赖写在dockerfile的yaml格式的文件里,docker通过dockerfile和基础镜像,将我们的服务程序打包成(docker build命令)一个完整的镜像。容器只要有这个镜像就可以完整的运行整个服务,无需进行额外的配置

仓库(registry)

我们打包好了镜像,如果再一个个上传到每个容器中再部署,这样依然很繁琐,于是可以将打包好的镜像推送到(**<font style="color:#74B602;">docker push</font>**)仓库中,由容器自己拉取(docker pull)并部署。这一个模式和git很类似。官方的镜像仓库Docker hub是共享的,所有人都可以推送和拉取,也可以自己搭建私有的仓库。

Docker Compose

刚才我们知道了将一个服务镜像部署到一个容器中,如果有一个博客系统,包含了三个镜像:数据库镜像、后端服务镜像,网关服务镜像,我们不能将所有镜像都部署到一个容器中,而是要部署多个容器,并且部署顺序有要求,需要先部署数据库再部署后端服务,在部署网关

因此docker提供了 compose客户端来实现多个容器的部署,通过编写compese yaml格式的文件来确定启动哪些容器和顺序。

Docker是怎么使用的

Docker 的安装不再细说,这里将介绍如何使用Docker,并介绍一个Java SpringBoot程序打包成镜像并且部署到Docker中去

Java代码

通过spring initializr 快速创建一个springboot项目

编写服务代码和前端代码,这里写了一个简单的查询数据的接口,前端请求接口并展示

前端代码

$(document).ready(function() {
  $.ajax({
    url: '/search',
    method: 'GET',
    success: function(response) {
      $('#results').html(response);
    },
    error: function(xhr, status, error) {
      console.error("An error occurred: ", error);
    }
  });
});

打包镜像并部署

创建docker网络,确保两个容器能互相通信
docker network create demo-network
启动mysql镜像

//拉取镜像
docker pull mysql
//启动镜像
docker run --name mysql --network demo-network -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest

注意 服务代码中jdbc连接host需要改成mysql docker容器的名称,由于我的mysql容器启动名称就叫mysql,这里就需要改成mysql,否则服务项目通过jdbc无法连接mysql。

项目添加Dockerfile文件
#基础镜像
FROM openjdk:17
#工作目录
WORKDIR "/app"
#将当前目录的jar拷贝到容器中
COPY ./target/docker-demo-0.0.1-SNAPSHOT.jar app.jar
#暴露端口
EXPOSE 8080
#容器启动后 启动服务
CMD ["java","-jar","/app/app.jar"]
在项目目录下运行docker命令构建镜像
#打包
mvn clean package
#构建镜像
docker build -t docker-demo:v1 .
#查看构建的镜像
docker images
启动容器

注意需要指定网络

#运行镜像
docker run --name docker-demo --network demo-network -p 8080:8080 -d docker-demo:v1

部署成功

部署之后就可以在docker上看见我们部署的两个容器了

打开浏览器键入localhost:8080

通过docker compose部署

通过docker命令部署的方式比较繁琐,先要创建网络、再逐一部署msyql容器和服务容器,我门可以使用docker compose来部署多个容器

在项目中中间compose.yaml文件

services:
  app:
    image: docker-demo:v1
    ports:
      - 127.0.0.1:8080:8080

  mysql:
    image: mysql:latest
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: root

volumes:
  todo-mysql-data:

启动容器

docker compose up -d --build

此时发现两个服务放在了docker-demo下面了

相对于刚才的部署方式已经很简洁了

Docker是怎么实现的

Docker使用Go语言实现,并且通过Linux的几个关键特性来实现相关功能,Docker通过namepace技术来创建独立的容器

整体架构上Docker是client-server架构,client和server通过restful api进行交互,server可以是本地的也可以是远程

Docker engine

它Docker是client-server的实现,包含了Docker实现的所有组件

  • 长时间运行的守护进程(server)
  • 容器和镜像管理
  • docker client和docker compose客户端

client通过运行各种docker命令提交给守护进程,守护进程执行命令去构建或再registry中下载镜像、管理容器的启动销毁等。

K8s和Docker

使用了docker是解决了一个容器构建、部署、运行的问题,我们可以在物理机上部署多个容器,在生产环境中,我们的服务往往是集群多台机器的,在多个机器部署服务容器是比较繁琐的,生产部署还要涉及到自动扩缩容、服务发现、容器编排,而k8s就是为了解决这一问题而诞生的。

标签:容器,SpringBoot,部署,mysql,镜像,docker,Docker
From: https://www.cnblogs.com/xiazki/p/18426759

相关文章

  • iotdb单机版部署
    本章将介绍如何启动IoTDB单机实例,IoTDB单机实例包括1个ConfigNode和1个DataNode(即通常所说的1C1D)。 1.先决条件1.1获取安装包以下是iotdb的安装包官方地址https://www.apache.org/dyn/closer.cgi/iotdb/1.3.2/apache-iotdb-1.3.2-all-bin.zip 1.2网络配......
  • ONNX模型部署利器ONNXRUNTIME框架
    1.ONNXRUNTIME介绍        ONNX格式模型部署兼容性最强的框架ONNXRUNTIME,基本上不会有算子不支持跟不兼容的情况出现,只要能导出ONNX格式模型,它基本上都能成功加载,成功推理。虽然在CPU速度不及OpenVINO、GPU上速度不及TensorRT,但是胜在兼容性强,支持不同硬件上推理部署......
  • Docker nsenter 命令使用以及lsns命令(需要安装utrace包)
    查看容器对应宿主机上面的pid,容器技术的实质是进程,并没有完整的操作系统,就相当于在主机上面fork了一个子进程,通过dockerdaemon去fork一个子进程,这个子进程是可以在主机上面看到其pid的。 $dockerinspect-f{{.State.Pid}}容器名或者容器id  如下:$dockerinspect-f{{.......
  • SpringBoot中基于JWT的双token(access_token+refresh_token)授权和续期方案
    微服务架构中,JWT认证方案中,用户登录成功后,后端会生成一个JWT格式的access_token并发送给前端。前端接收后,会将此access_token安全地存储在浏览器的LocalStorage中,以便在后续请求中作为身份认证的依据。每次API请求时,前端都会将access_token附加在请求头中发送给后端,后端则通过过......
  • SpringBoot前后端接口加解密--解决方案
    开放接口-通信方式采用HTTP+JSON或消息中间件进行通信。-调用接口之前需要使用登录鉴权接口获得token。-当鉴权成功之后才能调用其他接口(携带Token)。登录接口:Code 说明200 成功401 未授权,请先登录。403 没有访问权限404 接口不存在500 接口内部错误但是开放接口......
  • SpringBoot + Disruptor 实现特快高并发处理,支撑每秒 600 万订单无压力!
    01、背景02、Disruptor介绍03、Disruptor的核心概念04、RingBuffer05、SequenceDisruptor06、Sequencer07、SequenceBarrier08、WaitStrategy09、Event10、EventProcessor11、EventHandler12、Producer13、案例-demo14、总结01、背景工作中遇到项目使用Di......
  • SpringBoot实战:JWT Token 自动续期的解决方案
    前言在前后端分离的开发架构中,当用户成功登录后,后端服务会生成一个JWT(JSONWebTokens)token,并将其返回给前端。前端(如Vue应用)接收到此token后,通常会将其存储在LocalStorage中以方便后续请求时使用。每次向后端发送请求时,前端会将这个token作为请求头的一部分发送给后端,以便后端通......
  • SpringBoot+mail 轻松实现各类邮件自动推送
    在实际的项目开发过程中,经常需要用到邮件通知功能。例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多。早期的时候,为了能实现邮件的自动发送功能,通常会使用JavaMail相关的api来完成。后来Spring推出的JavaMailSender工具,进一步简化了邮件的自动发送......
  • Office的部署与激活工具软件 - 初学者系列 - 学习者系列文章
    Office一直是笔者喜欢的办公软件,依托微软强大的开发实力以及人性化的操作界面,连WPS也是参考的Office的界面进行的研发。所以除了Windows操作系统,Office就是笔者的电脑里必安装的软件之一。以前笔者安装Office,都是先下载ISO文件,然后加载到虚拟光驱运行EXE文件进行安装,这个以......
  • springboot中小学数字化教学资源管理平台
    基于springboot+vue实现的中小学数字化教学资源管理平台 (源码+L文+ppt)4-078  第4章系统设计   4.1功能模块设计  系统整体模块分为管理员、教师和学生三大用户角色,整体功能设计图如下所示:图4-1系统整体功能图4.2数据库设计  4.2.1E-R模型结构设......