一、docker环境配置

首先需要一个安装了docker的服务器(本地或者云服务器),如果没有请看上文,传送门---https://www.cnblogs.com/wdfordream/p/12737389.html

我这里是直接在云服务器上搭建了docker

云环境:CentOS 7.6 64位

二、构建镜像

1、 用DockerFile构建镜像

通过DockerFile以及springboot.jar包构建镜像。jar包可以通过本地打jar包上传到服务器也可以在服务器上拉取代码通过maven打包。

这里我是直接在云服务器上拉取github上的代码,利用maven打包成jar包的。代码传送门---https://github.com/DreamsChaser/spring-boot-basic

具体步骤:

(1) 从github上拉取spring-boot项目

  1. git clone git@github.com:DreamsChaser/spring-boot-basic.git

这个项目里写了一个简单的rest用于测试

(2) maven 打包

  1. #进入项目根目录
    cd spring-boot-basic
    #maven 打包
    mvn clean package

BUILD SUCCESS显示打包成功

(3)运行jar

  1. #进入jar包所在目录
  2. cd spring-boot-basic-web/target/
    #运行jar包(& 表示将启动进程后台运行 如果不用& 可以运行后ctrl + z 暂停返回命令行后 通过bg 后台运行)
    java -jar spring-boot-basic.jar &

打印日志 启动成功 端口8080

(4)测试jar

通过curl命令或者直接在浏览器访问调用rest接口

  1. #curl调用
  2. curl http://localhost:8080/spring-boot-basic/demo/test

直接在浏览器输入 ip:port+访问url 下面的ip是我云服务器的ip 端口就是启动的端口

到这里说明jar是没问题的 接下来通过docker创建镜像启动容器来运行jar

(5)创建Dockerfile文件

在项目根目录新建Dockerfile

  1. #定制的镜像都是基于 FROM 的镜像(可以从docker hub上找)
  2. FROM openjdk
  3.  
  4. #VOLUME ,VOLUME 指向了一个/tmp的目录,由于Spring Boot使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录
  5. VOLUME /tmp
  6.  
  7. #拷贝并且重命名(jar必须在dockerFile所在文件夹或者子文件夹 否则会报错Forbidden path outside the build context)
  8. ADD /spring-boot-basic-web/target/spring-boot-basic.jar spring-boot-basic.jar
  9.  
  10. #容器启动命令 也可以用CMD 但CMD会被docker run的指令覆盖
  11. ENTRYPOINT ["java","-jar","/spring-boot-basic.jar"]

(6)创建镜像

  1. #创建镜像
    #-t:镜像的名字及标签 -t name:tag或者 -t name
    #-f :指定要使用的Dockerfile路径 在Dockerfile所在目录不需要指定
    #最后有个 .
  2. docker build -t spring-boot-basic:1.0 .

出现Step 1/4等表示正在构建 需要从docker hub拉取openjdk镜像

(7)查看镜像

  1. #查看所有镜像
  2. docker image ls

可以看到刚刚创建的 spring-boot-basic:1.0 镜像 以及openjdk镜像

2、利用maven插件构建镜像

maven插件构建镜像有两种 一种是写好dockerFile后再maven中配置dockerFile路径,另一种是把dockerFile中相关配置按照一定属性配置在maven。

(1)写Dockerfile然后在pom中配置<dockerDirectory>

用这种方式的时候遇到了一个问题Error: Exception caught: xx/target does not exist 一开始我以为是路径配置问题 因为我用的是pom自带的一些属性比如${basdir} 后来全部替换之后发现依然找不到

但是 只要我先执行mvn package 生成target之后在执行mvn clean package docker:build之后就能生成镜像 但是会生成两个镜像 查看了一下输出日志后 我发现问题所在

我的spirng-boot项目配置了一个子module这个子module里是我的rest服务并且打包类型是jar ,parent pom打包类型是pom 每次都会打一个pom和一个jar 我的maven docker配置是在父pom中 所以在打外层pom时也会build镜像,而真正的jar包还没生成索引失败了,把配置移动到子module的pom中问题就解决了。

接下来讲一下 配置方式

在子module根目录写一份Dockerfile

  1. FROM openjdk
  2. VOLUME ./tmp
    #和上面的ADD不同 是因为我Dockerfile是在子module下的
  3. ADD ./target/spring-boot-basic.jar spring-boot-basic.jar
  4. ENTRYPOINT ["java","-jar","/spring-boot-basic.jar"]

在子module spring-boot-basic-web 的pom.xml中配置

  1. <build>
  2. <finalName>spring-boot-basic</finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>
  8. <!-- docker plugin -->
  9. <plugin>
  10. <groupId>com.spotify</groupId>
  11. <artifactId>docker-maven-plugin</artifactId>
  12. <version>1.0.0</version>
  13. <!-- docker config -->
  14. <configuration>
  15. <!-- image name -->
  16. <imageName>${project.build.finalName}</imageName>
  17. <dockerDirectory>${project.basedir}</dockerDirectory>
  18. </configuration>
  19. </plugin>
  20. </plugins>
  21. </build>

在项目根目录中执行 mvn clean package docker:build

可以看到构建完成 可以通过docker image ls查看镜像

(2)不用Dockerfile

省略Dockerfile把Dockerfile中的相关配置 按照pom里的一些标签进行配置

在子module spring-boot-basic-web的pom中配置

  1. <build>
  2. <finalName>spring-boot-basic</finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>
  8. <!-- docker plugin -->
  9. <plugin>
  10. <groupId>com.spotify</groupId>
  11. <artifactId>docker-maven-plugin</artifactId>
  12. <version>1.0.0</version>
  13. <!-- docker config -->
  14. <configuration>
  15. <!-- image name -->
  16. <imageName>${project.build.finalName}</imageName>
  17.  
  18. <!-- Dockerfile配置路径
  19. <dockerDirectory>${project.basedir}</dockerDirectory>
  20. -->
  21.  
  22. <!-- 非Dockerfile配置-->
  23. <workdir>/tmp</workdir>
  24. <baseImage>openjdk</baseImage>
  25. <entryPoint>["java", "-jar", "/spring-boot-basic.jar"]</entryPoint>
  26. <resources>
  27. <resource>
  28. <targetPath>/</targetPath>
  29. <directory>${project.build.directory}</directory>
  30. <include>${project.build.finalName}.jar</include>
  31. </resource>
  32. </resources>
  33.  
  34. </configuration>
  35. </plugin>
  36. </plugins>
  37. </build>

注意这里resource复制的时候复制到了/ 所以在entryPoint 写java启动命令时对应的jar要在/下

三、启动容器

1、启动容器

  1. #启动容器
    #参数1 --name 指定容器名
    #参数2 -d 以后台方式执行
    #最后是 镜像name:tag/name
    docker run --name test -d spring-boot-basic:1.0

2、查看容器

  1. #查看所有容器(包括关闭的)
  2. docker ps -a

显示刚刚运行中 Up

3、进入容器

  1. #进入容器(以容器id或者name都可以进入)
    #/bin/bash 进入后打开bash命令行
  2. docker exec -it 2de6fd561c9a /bin/bash

进入之后可以命令行输入

4、测试jar是否正常

(1)通过容器ip和端口访问

进入容器命令行后 查看容器ip

找到ip是 172.18.0.2

离开容器 容器bash命令行输入 exit

通过容器ip和端口访问rest接口

  1. #curl
  2. curl http://172.18.0.2:8080/spring-boot-basic/demo/test

请求成功,返回hello world。

这种方式只能在部署docker的服务器上才能请求成功,在其他机器无法访问,这时候需要做端口映射。

(2)通过端口映射访问

关闭并删除之前启动的容器

  1. #关闭容器(id name都可以)
  2. docker stop 2de6fd561c9a
    #删除容器(id name都可以)
    docker rm 2de6fd561c9a

docker ps -a后发现容器已经删除

以端口映射方式启动容器

  1. #-p设置端口 本地端口:容器端口
  2. docker run --name test -d -p 7001:8080 spring-boot-basic:1.0

启动完成之后 通过docker ps -a查看启动的容器 端口做了映射处理 可以通过本机(云服务器)端口访问到 容器内部端口

通过curl测试

通过本机7001端口请求成功 返回hello world

同时在其他服务器通过访问docker所在服务器的ip 和映射端口可以访问容器内部的服务

122.51.103.239是我云服务器的公网ip,请求成功,返回hello world

四、异常汇总

  1. [ERROR] No plugin found for prefix 'docker' in the current project
  2. and in the plugin groups [org.sonatype.plugins, org.apache.maven.plugins, org.codehaus.mojo] available from the repositories

解决:在maven配置文件 setting.xml中配置

<pluginGroups>

  <pluginGroup>com.spotify</pluginGroup>

</pluginGroups>

  1. [ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project spring-boot-basic: Exception caught:
    java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException:
    org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
    failed: Connection refused: connect -> [Help 1]

这个异常是我在window10构建镜像的时候出现的 需要修改docker配置

这个地方选中 然后重启就可以了

五、常用命令汇总

1、镜像相关

  1. #查看所有镜像
    docker image ls
    #删除镜像 id或者name删除
    docker image rm 'id'/'name'
    #构建镜像 tag可以不填 默认latest
    docker build -t 'name':'tag' .

2、容器相关

  1. #查看所有容器
    docker ps -a
    #关闭容器
    docker stop 'id'/'name'
    #重启容器
    docker restart 'id'/'name'
    #进入容器 并打开bash命令行
    docker exec -it 'id' /bin/bash
  2. #启动容器 -d后台运行 -p端口映射
    docker run --name 'name' -d -p 'port1':'port2' 'imageName':'imageTag'

从零开始学习docker之在docker中运行springboot项目的更多相关文章

  1. Linux中运行SpringBoot项目,永久运行

    将写好的springboot项目打成jar包: 项目右键 -- Run As -- Maven build... ---此时出现下图 1.Goals 中填写:install 2.Skip Tests复 ...

  2. Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  3. 使用docker运行springboot项目

    本文主要讲的是使用docker运行springboot项目 获取一个springboot项目 这里我没有重新构建,用的之前写的一个项目,直接从github上下载下来,地址:https://github ...

  4. linux安装docker,并在docker上运行springboot项目

    docker架构示例图 仓库---> 镜像 --->  容器 一.安装docker 1.通过 uname -r 命令查看你当前的内核版本 uname -r 2使用 root 权限登录 Ce ...

  5. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  6. 使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中

    前言:本项目基于maven构建 spring-boot项目可以快速构建web应用,其内置的tomcat容器也十分方便我们的测试运行: spring-boot项目需要部署在外部容器中的时候,spring ...

  7. 在Eclipse中运行Web项目Jsp网页时提示端口被占用的解决办法:Several ports (8005, 8888, 8009) required by Tomcat v9.0 Server at localhost are already in use.

    问题: 在Eclipse中运行Web项目Jsp网页启动Tomcat时提示端口被占用: Several ports (8005, 8080, 8009) required by Tomcat v9.0 ...

  8. django第8天(在测试文件中运行django项目|单表操作)

    django第8天 在测试文件中运行django项目 1.将项目配置文件数据库该为mysql,修改配置信息 PORT = '127.0.0.1' DATABASES = { 'default': { ...

  9. SpringBoot(十六)-- 使用外部容器运行springBoot项目

    spring-boot项目需要部署在外部容器中的时候,spring-boot导出的war包无法再外部容器(tomcat)中运行或运行报错. 为了解决这个问题,需要移除springBoot自带的tomc ...

随机推荐

  1. 万字综述,核心开发者全面解读PyTorch内部机制

    斯坦福大学博士生与 Facebook 人工智能研究所研究工程师 Edward Z. Yang 是 PyTorch 开源项目的核心开发者之一.他在 5 月 14 日的 PyTorch 纽约聚会上做了一个 ...

  2. 服务器上安装.NET Framework 3.5 sp1

    操作系统是Windows Server 2008 R2 或 Windows Server 2012 或 Windows Server 2012 R2,可以直接进入“服务器管理器”添加“功能”.

  3. Lack of free swap space on Zabbix server

    在模板(Template)里找到Linux OS模板,修改触发器 配置>模板>Template OS Linux>触发器 找到swap关键字 修改 {Template OS Linu ...

  4. 树莓派 Raspberry PI基础

    树莓派 Raspberry PI基础 官网网址:https://www.raspberrypi.org 下载地址:https://www.raspberrypi.org/downloads/ 官方系统 ...

  5. Vertica的这些事(三)——Vertica中实现Oracle中的ws_concat功能

    vertica中没有类似Oracle中的ws_concat函数功能,需要开发UDF,自己对C++不熟悉,所有只有想其他方法解决了. 上代码: SELECT node_state, MAX(DECODE ...

  6. error: cannot bind non-const lvalue reference of type

    这种问题一般是因为引用了匿名变量.涉及左值和右值的区别.一般函数的参数如果是一个表达式,那将会产生一个第3方的匿名变量传入这个函数中,此时如果引用,没用什么实际意义. c++中临时变量不能作为非con ...

  7. PTA 7-42 整型关键字的散列映射(手写哈希表的线性探测法)

    本题考点: 整型哈希表的线性探测法 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中.用线性探测法解决冲突. 输入格式: 输入第一行首先给出两个正整数N(≤10 ...

  8. Redis 笔记(三)—— LIST 常用命令

    常用命令 命令 用例和描述 RPUSH RPUSH key value [value ...] —— 将一个或多个值推入列表的右端 LPUSH LPUSH key value [value ...] ...

  9. MyBatis(七):使用注解替代xml文件

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  10. .NET MVC中登录过滤器拦截的两种方法

    今天给大家介绍两种ASP中过滤器拦截的两种方法. 一种是EF 的HtppModule,另一种则是灵活很多针对MVC的特性类 Attribute 具体什么是特性类可以参考着篇文章:https://www ...