docker部署springboot

基础知识

什么是docker

官网:

Docker Docs: How to build, share, and run applications | Docker Documentation
Docker 是一个基于go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

开发环境,测试环境,生产环境不一致,会出现开发环境可用,但其他环境出现问题的情况,使用docker 可以解决这一问题

减少各应用之间的相互影响,比如A应用需要修改环境变量,会影响B应用,如果在两个容器中就没影响了

  • 从下面的logo中我们可以看到,一条鲸鱼载着一堆集装箱。在集装箱没有出现之前,运送的货物全部都堆在一条船上运输,很容易造成货物损坏,比如我运送一批货物,里面有水果,化学物品,木头。当这批货物堆在一条船上一起运送的时候,有可能会发生化学物品泄露导致水果被污染,或者木头松动导致砸坏化学物品。这个时候为了避免货物损失,会安排多条船去运送这批物资,但是这样又会造成运送成本的增加,这个时候就发明了集装箱,把不同的货物通过集装箱隔离开。这样所有的货物放在一条船上,就不会出现互相污染的情况了。
  • 那么docker是什么呢?docker就是那头鲸鱼货轮+集装箱的集合体,它可以将货物进行分类包装进集装箱,并提供一条存放集装箱的货轮。这样,通过想把集装箱送往哪个地方就送往哪个地方。

 

913275-20220802033443887-783620713.png

 

 

docker核心概念


docker三大核心概念:镜像 Image、容器 Container、仓库 Repository

  1. 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  2. 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。基于镜像可以创建容器,同一个镜像可以创建多个容器;
  3. 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。镜像存放在仓库中,可以从仓库中拉取。

v2-a27cdebc82abd9ab9624b0e68fc7025b_720w.jpg

 

docker架构及原理

v2-86a93e02587919405c0bd8eda245a1b1_720w.jpg


 Docker 使用客户端-服务器 (**C/S**) 架构模式,使用远程API来管理和创建Docker容器。 架构上可以分为客户端和服务端; **Docker Daemon**是docker的守护进程; **containerd**是容器运行的进程,是实现容器的核心; 客户端通过内部的API和服务端的守护进程进行交互,守护进程再通过**containerd**分发到各个容器;

 

 

Docker和虚拟机 

  说到Docker就要提到虚拟机了,在Docker流行之前,虚拟机是开发人员部署开发环境的普遍方法。但是虚拟机的缺点是消耗太多不必要的资源和内存,速度也很慢。从一张图就可以看出为什么Docker会比虚拟机更快,更方便。

     20170725114514574.png 

 

    可以看到Docker和VM的区别,是没有Guestos,而是用Docker Engine代替。虚拟机的Guest OS即为虚拟机安装的操作系统,它是一个完整的操作系统内核,而Docker就显得简练很多,docker Engine可以简单看成对Linux和NameSpace,Cgroup,镜像管理文件的系统操作的分装。Docker没有和虚拟机一样利用一个完全独立的Guest OS 实现环境隔离,它利用的是目前Linux内核本身支持的容器实现资源和环境隔离。

docker命令

 其他命令参考docker命令大全:Docker 命令大全 | 菜鸟教程

下载和安装docker

windows:

DockerToolbox在Win7上的安装和设置

为什么使用Docker Toolbox

Docker在Windows上使用有两种方式,一是利用VirtualBox建立linux虚拟机,在linux虚拟机中安装docker服务端和客户端,二是利用Windows的Hyper-v虚拟化技术,直接在Windows上安装docker服务端和客户端。WIndows7不支持Hyper-v,所以只能采用Docker Toolbox的方式使用Docker。下载地址:https://docs.docker.com/toolbox/overview/

安装过程很简单,保持默认选项,直接【next】即可。VirualBox和Git如果已经安装,也可以不选

如果已经安装了virtualbox,建议先卸载自己的virtualbox,在这里重新安装,否则启动docker时会报错

1、Docker Toolbox安装图文教程

注意:
1、在第四张教程图片中,可以不勾选Install VirtualBox with NDISS。
2、过程中,需要安装一个串行设备,切记点击安装!

安装完成后,桌面上会多出3各图标,如下。其中VirtualBox提供了linux虚拟机的运行环境,Docker Quickstart Terminal用于快速介入linux虚拟机,提供命令行交互,Kitematic是docker GUI很少用到。

启动

第一次运行Docker Quickstart Terminal时会进行Docker环境的初始化,会在VirtualBox中自动创建名字为【default】的linux虚拟机

利用Xshell登录

Docker Quickstart Terminal使用起来不方便,可以使用XShell进行SSH登录Docker环境(其实就是远程访问default linux虚拟机)。

通过在PowerShell或cmd终端中执行【docker-machine ls】命令,可以看到虚拟机的地址,本机是192.168.99.100。

default虚拟机的默认用户名和密码

用户名:docker
密码: tcuser

 登录成功页面:

 更改虚拟磁盘存储位置

虚拟机的默认存储位置是C:\Users\Administrator\.docker\machine\machines ,后期docke镜像文件会不断增加,为了给系统盘减负,最好将磁盘移动到其他位置。

  •  首先通过PowerShell或cmd终端中执行【docker-machine stop default】命令停止default虚拟机

  • 通过VirtualBox【管理】-》【虚拟介质管理】界面对虚拟磁盘进行复制

需要注意虚拟磁盘类型的选择

    

  •  为虚拟机添加新复制的虚拟磁盘,删除之前的dick

更改镜像仓库地址

  docker默认的镜像仓库地址是https://hub.docker.com/,但国内的下载速度太过缓慢,最好使用国内镜像,比如阿里云。

  首先需要注册阿里云账号,然后在https://cr.console.aliyun.com/页面的左侧可以看到【镜像加速器】选项

  在powershell或cmd中通过 【docker-machine ssh default】命令登录虚拟机(或使用设置好的XShell连接),执行如下命令:

1

sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=加速地址 |g" /var/lib/boot2docker/profile

  然后重启default 

1

docker-machine restart default

修改之后,用docker info命令查看, Registry Mirrors所配置的镜像地址

2021031615291063.png

20210316153516726.png

 idea集成docker

打开Settings设置界面
在这里插入图片描述
选择Build Exection Deployment=>Docker
点击+号,创建一个Docker连接,指定Docker Machine为default,默认的虚拟机。
点击右下角的Apply
在这里插入图片描述
底部出现Docker工具栏

20191111153340623.png

在Images右键Pull Image拉取镜像

20191111153404429.png

在Repository中输入指定的镜像名,比如httpd,mysql,nginx等名称。
latest是Tag中是最新的Tag版本。

20191111153423958.png

20191111153450473.png

拉取成功之后,右键Create container

20191111153633670.png
设置端口映射

由于此处选择了mysql,所以要设置mysql的密码。

20191111155028530.png

 20191111155057108.png

将springboot部署到docker中

遇到过的问题:

  • 生成出来的jar包缺少依赖JAR的
  • 启动时找不到主类
  • 容器启动后主机拒绝

pom配置

pom.xml的文件,下面红色的,是docker相关的

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10-SNAPSHOT</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.sheng</groupId><artifactId>myDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>myDemo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>2021.0.5</spring-cloud.version><dockerfile-maven-plugin.version>1.4.10</dockerfile-maven-plugin.version><docker.image.prefix>springboot</docker.image.prefix></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version><scope>compile</scope></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>${dockerfile-maven-plugin.version}</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><!--docker和maven结合的配置--><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>${dockerfile-maven-plugin.version}</version><executions><execution><id>default</id><goals><!--如果package时不想用docker打包,就注释掉这个goal,运行mvn package时,会自动执行build目标,构建Docker镜像。当运行mvn deploy命令时,会自动执行push目标,将Docker镜像push到Docker仓库--><!--<goal>build</goal><goal>push</goal>--></goals></execution></executions><configuration><!--在maven运行docker时,dockerFile文件必须在这个文件夹内--><contextDirectory>${project.basedir}/docker</contextDirectory><!--repository指定docker镜像的repo名字--><repository>${docker.image.prefix}/demo</repository><!--tag指定docker镜像的tag--><tag>v1</tag><!--buildArgs可以指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用。暂时不用,注释掉--><!--<buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs>--></configuration></plugin><plugin><!--用于生成jar的时候,将依赖的包也导入进去,否则无法启动,另外MANIFEST.MF文件中会找不到启动类--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes><includeSystemScope>true</includeSystemScope><mainClass>${start-class}</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><testFailureIgnore>true</testFailureIgnore></configuration></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories><pluginRepositories><pluginRepository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></pluginRepository><pluginRepository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></pluginRepository></pluginRepositories></project>

操作步骤

生成jar

先maven上点击clean compile package在target生成JAR包(myDemo-0.0.1-SNAPSHOT.jar)把它用解压缩包打开,看看MANIFEST.MF中有没有主函数入口,有红圈的就行,不然无法启动,会报错no main manifest attribute, in /xxxxx.jar异常将 F:\workspace\arch\spring-cloud-demo\target\myDemo-0.0.1-SNAPSHOT.jar 拷贝到 F:\workspace\arch\spring-cloud-demo\docker
F:\workspace\arch\spring-cloud-demo\docker 文件夹中应该有Dockerfile 和 myDemo-0.0.1-SNAPSHOT.jar

然后用bash做docker命令

docker images  查看镜像

构建镜像

 docker build -t springboot/demo .

 最后的警告没有影响

查看镜像docker images

 

删除镜像:只需删除镜像对应的image id即可,例如删除java执行命令: docker rmi d23bdf5b1b1b

  若存在两个镜像的image id相同,需要通过REPOSITORY+TAG删除,例如删除java执行命令: docker rmi java 8

  若报删除的镜像存在依赖镜像错误,则需通过 docker rm 【依赖镜像id】,命令依次删除依赖

  若镜像已经运行,需要先停止运行再删除
 

运行镜像

docker run -p 8005:8005 -d springboot/demo

-p表示端口映射,此时将服务器中的8005端口映射到容器中的8005端口

查看运行的镜像

 docker ps

查看所有容器,包含未运行的:docker ps -a

  停止运行镜像:docker stop ceb5f1a71a29

 

 11.浏览器访问 http://192.168.99.100:8005/ 出现项目页面,即发布成功

 

 

docker stats <容器 ID>

该命令可以查看容器资源的使用情况,包括 CPU 占用率、内存使用量、网络使用量等。

查看虚拟机:docker-machine ls

进入虚拟机:docker-machine ssh 虚拟机名称

退出虚拟机:exit

启动虚拟机:docker-machine start 虚拟机名称

停止虚拟机:docker-machine stop 虚拟机名称

重启虚拟机:docker-machine restart 虚拟机名称

删除虚拟机:docker-machine rm 虚拟机名称

查看虚拟机环境信息:docker-machine env 虚拟机名称

注:若进入虚拟机,对虚拟机的启动、停止、重启、删除操作,需先退出虚拟机
 

dockerFile的指令详解

 

 

 

参考文章:

https://www.cnblogs.com/canger/p/9028723.html

Docker Toolbox:Docker Toolbox的简介、安装、使用方法之详细攻略_dockertoolbox_一个处女座的程序猿的博客-CSDN博客

Windows7安装使用Docker发布Spring boot项目详细_王绍桦的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/90768.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指针---进阶篇(二)

指针---进阶篇&#xff08;二&#xff09; 前言一、函数指针1.抛砖引玉2.如何判断函数指针&#xff1f;&#xff08;方法总结&#xff09; 二、函数指针数组1.什么是函数指针数组&#xff1f;2.讲解函数指针数组3.模拟计算器&#xff1a;讲解函数指针数组 三、指向函数指针数组…

组态王-实现语音播报告警点位信息及语音通知-语音播报器|声光报警器|工业报警方案|语音报警器|工业报警器|语音播报模块

需求简介 本文将介绍组态王如何对产生的告警实现声光语音播报&#xff0c;根据不同的告警点位&#xff0c;朗读具体的告警内容。 本文使用大连英仕博科技有限公司生产的博灵语音通知终端A4与北京亚控开发的组态王进行联动。 本文章分2部分讲解 第一部分为demo调用演示第二部…

调试 SELinux

semanage port -a -t http_port_t -p tcp 82 题目&#xff1a; 非标准端口 82 上运行的 WEB 服务器在提供内容时遇到问题。根据需要调试并解决问题&#xff0c; 并使其满足以下条件&#xff1a; 系统上的 web 服务器能够提供/var/www/html 中所有现在有的 html 文件&#xff…

无涯教程-Perl - getpwnam函数

描述 此函数基于EXPR指定的用户名,从/etc/passwd文件提取的列表context中返回字段列表。通常这样使用- ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) getpwnam($user); 在标量context中,返回数字用户ID。如果尝试访问整个/etc/passwd文件,则应使用getpwent…

Python 3 使用Hadoop 3之MapReduce总结

MapReduce 运行原理 MapReduce简介 MapReduce是一种分布式计算模型&#xff0c;由Google提出&#xff0c;主要用于搜索领域&#xff0c;解决海量数据的计算问题。 MapReduce分成两个部分&#xff1a;Map&#xff08;映射&#xff09;和Reduce&#xff08;归纳&#xff09;。…

idea常见错误大全之:解决全局搜索失效+搜索条件失效(条件为空)+F8失灵

问题一&#xff1a;全局搜索快捷键ctrlshiftf 突然失灵了&#xff0c;键盘敲烂了 都没反应&#xff0c;这是为什么呢&#xff1f; 肯定不是idea本身的原因&#xff0c;那么就是其它外在因素影响到了idea的快捷键&#xff0c;那么其它的快捷键为什么没失效呢&#xff0c;原因只有…

IDEA简单拷贝一份新项目记录

IDEA简单拷贝项目记录 拷贝后改项目名&#xff0c;然后iml 配置文件改项目名&#xff0c;然后 .idea 中的compiler.xml 里面的name标签改项目名。 就可以了

ubuntu中安装python

最简单方便的是 apt 使用第三方的 ppa 源&#xff0c;然后直接 apt 安装 python3.9 安装 software-properties-common 获取add-apt-repository命令&#xff1a;apt install -y software-properties-common添加第三方的 ppa 源&#xff1a;add-apt-repository ppa:deadsnakes/p…

el-table分页后序号连续的两种方法

实现效果&#xff1a; 第一页排序到10&#xff0c;第二页的排序应从11开始 实现方法一&#xff1a; 在el-table的序号列中使用template定义 <el-table><el-table-columnmin-width"10%"label"序号"><template slot-scope"scope"…

平板选择什么电容笔比较好?ipad手写笔推荐品牌

在现在的生活上&#xff0c;有了iPad平板&#xff0c;一切都变得简单了许多&#xff0c;也让我们的学习以及工作都更加的便利。这其中&#xff0c;电容笔就起到了很大的作用&#xff0c;很多人都不知道&#xff0c;到底要买什么牌子的电容笔&#xff1f;哪些电容笔的性价比比较…

uniApp引入vant2

uniApp引入vant2 1、cnpm 下载&#xff1a;cnpm i vantlatest-v2 -S2、main.js文件引入 import Vant from ./node_modules/vant/lib/vant;Vue.use(Vant);3.app.vue中引入vant 样式文件 import /node_modules/vant/lib/index.css;

静态网页和动态网页区别

1&#xff0c;静态网页和动态网页有何区别 1) 更新和维护 静态网页内容一经发布到网站服务器上&#xff0c;无论是否有用户访问&#xff0c;这些网页内容都是保存在网站服务器上的。如果要修改网页的内容&#xff0c;就必须修改其源文件&#xff0c;然后重新上传到服务器上。…

软考高级架构师下篇-11信息系统架构设计理论与实践

目录 1. 考情分析2. 基本概念3. 信息系统架构风格与分类4. 信息系统常用架构模型5. 企业信息系统总体框架6. 信息系统架构设计方法7. 前文回顾1. 考情分析 下半年软考要改成机考了,已经有几个省份确认了机考信息,虽然解决了论文手写不好修改的问题,但是考试的难度肯定加大了…

mysql 索引 区分字符大小写

mysql 建立索引&#xff0c;特别是unique索引&#xff0c;是跟字符集、字符排序规则有关的。 对于utf8mb4_0900_ai_ci来说&#xff0c;0900代表Unicode 9.0的规范&#xff0c;ai表示accent insensitivity&#xff0c;也就是“不区分音调”&#xff0c;而ci表示case insensitiv…

Unity 实现2D地面挖洞!涂抹地形(碰撞部分,方法二)

文章目录 前言一、初始化虚拟点1.1点结构:1.2每个点有的状态:1.3生成点结构: 二、实例化边缘碰撞盒2.1计算生成边缘碰撞盒 三、涂抹部分3.1.虚拟点3.2.鼠标点3.3.内圈3.4.外圈 四、关于优化结语: 前言 老规矩先上效果图 继上一篇涂抹地形文章讲解发出后&#xff0c;有不少网友…

文献综述|NLP领域后门攻击、检测与防御

前言&#xff1a;在信息安全中后门攻击&#xff08;Backdoor Attack&#xff09;是指绕过安全控制而获取对程序或系统访问权的方法。而随着深度学习以及各种神经网络模型的广泛应用&#xff0c;神经网络中存在的后门问题也引起了研究人员的广泛关注。神经网络后门攻击就是使网络…

机器学习深度学习——循环神经网络RNN

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习—语言模型和数据集 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助…

ASP.NET Core - 缓存之分布式缓存

分布式缓存是由多个应用服务器共享的缓存&#xff0c;通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性&#xff0c;尤其是当应用由云服务或服务器场托管时。 与其他将缓存数据存储在单个应用服务器上的缓存方案相比&am…

如何保证数据传输的安全?

要确保数据传输的安全&#xff0c;您可以采取以下措施&#xff1a; 使用加密协议&#xff1a;使用安全的传输协议&#xff0c;如HTTPS(HTTP over SSL/TLS)或其他安全协议&#xff0c;以保护数据在传输过程中的安全性。加密协议可以有效防止数据被窃听或篡改。 强化身份验证&…

克服多语言语音技术的障碍:五大挑战和创新解决方案

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 介绍 在用西班牙语&#xff08;您的首选语言&#xff09;向语音助手询问某些内容后&#xff0c;您有多少次不得不暂停&#xff0c;然后用语音助手理解的语言&#xff08;可能是英语&#xff09;重述…