学习Spring Boot:(二十三)Spring Boot 中使用 Docker

前言

简单的学习下怎么在 Spring Boot 中使用 Docker 进行构建,发布一个镜像,现在我们通过远程的 docker api 构建镜像,运行容器,发布镜像等操作。

这里只介绍两种方式:

  1. 远程命令 api (需要知道 Docker 命令)
  2. maven 插件 (不需要了解 Docker 命令)

开启 Docker api 远程访问

开启 docker api 远程操作的功能,
例如,centos 7 中在 /usr/lib/systemd/system/docker.service,文件中,修改 ExecStart 的参数:

ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

端口自定义设置即可。

重载所有修改过的配置文件,并且重启 docker,

systemctl daemon-reload    
systemctl restart docker.service 

需要注意的是,由于没有密码登陆任何权限验证,外网或者生产环境需要上证书使用。

命令方式构建镜像

这种方式其实非常简单,就是需要懂得 docker 命令,才能操作。

经过上面开启 Docker Api 后,我们可以使用网络环境操作 Docker 引擎了。

  1. 新建 Dockerfile 构建镜像文件,新创建一个文件夹,专门放构建镜像需要的文件,我创建的是 /src/docker/

    FROM java:8
    EXPOSE 8080VOLUME /tmp
    ADD springboot-docker.jar app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    
  2. 执行 maven 命令 ,将项目打包 mvn clean package --DskipTests,然后将打好的 jar 包,也放入到 Dockerfile项目目录中。

  3. 然后进入 src/docker 目录下执行 :

    docker -H tcp://xxx.xxx.xxx.xxx:2375 build -t test .
    

    开始构建镜像:

    Sending build context to Docker daemon  31.74MB
    Step 1/5 : FROM java:8---> d23bdf5b1b1b
    Step 2/5 : EXPOSE 8080---> Using cache---> 060a43a42146
    Step 3/5 : VOLUME /tmp---> Using cache---> b4f88fde6181
    Step 4/5 : ADD springboot-docker.jar app.jar---> 3a40188825b0
    Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]---> Running in ab093916fc4c
    Removing intermediate container ab093916fc4c---> 45a3966feb60
    Successfully built 45a3966feb60
    Successfully tagged test:latest
    

    ?

使用 docker-maven-plugin构建镜像

在 maven 项目下加入 docker-maven-plugin

            <!--打包docker插件相关参数的配置--><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.14</version><configuration><!--打包的镜像名--><imageName>${project.groupId}/${project.artifactId}</imageName><!--Dockerfile文件位置,以项目的 root 目录为根节点,建议到单独建立一个目录--><dockerDirectory>./src/docker/</dockerDirectory><!--Docker 远程的 API 地址及端口--><dockerHost>http://xxx.xxx.xxx.199:2375</dockerHost><imageTags><imageTag>latest</imageTag></imageTags><!--执行构建docker镜像的时候需要哪些文件,springboot项目指定 打包好的jar 镜像就好--><resources><resource><!--这里指定的文件是target中的jar文件--><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>

创建 Dockerfile

需要跟pom.xml 上面配置的路径保持一致,所以我的路径是 ${baseProjectFolder}/src/docker的文件夹下新建一个文件 Dockerfile,添加构建 docker 相关命令参数:

FROM java:8
EXPOSE 8080VOLUME /tmp 
ADD springboot-docker.jar app.jar # 根据打包的jar 包文件名进行修改
ENTRYPOINT ["java","-jar","/app.jar"]

打包

在应用的根目录下执行命令(打包加 dokcer build):

$ mvn clean package docker:build -DskipTests

比如使用我的工程,进行打包后完成了 docker 的构建的信息:

[INFO] Building image com.wuwii/springboot-docker
Step 1/5 : FROM java:8---> d23bdf5b1b1b
Step 2/5 : EXPOSE 8080---> Running in b7936baae57f
Removing intermediate container b7936baae57f---> 060a43a42146
Step 3/5 : VOLUME /tmp---> Running in 65e2b8ac44d3
Removing intermediate container 65e2b8ac44d3---> b4f88fde6181
Step 4/5 : ADD springboot-docker.jar app.jar---> aa3762cda143
Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]---> Running in d9f5f63b9736
Removing intermediate container d9f5f63b9736---> 622a7d1e315c
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 622a7d1e315c
Successfully tagged com.wuwii/springboot-docker:latest

使用镜像

  1. 进入安装 docker 的主机中,使用命令查看镜像(IMAGE ID 和上面是一致的):

    $ docker image ls com.wuwii/springboot-docker
    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    com.wuwii/springboot-docker   latest              622a7d1e315c        22 minutes ago      659MB
    
  2. 运行容器:

    $ docker run -d -p 8080:8080 --name learn  com.wuwii/springboot-docker180fe4a7ddfc10c0cf2c37649ae1628e804564bfe1594ef05840e707801e6da3   
    

    监听 8080 端口,测试是否成功。

服务编排 compose

一般的我们的 WEB 项目会使用到很多外部工具,例如 Redis ,MYSQL, ES等,如果一个一个启动搭建部署,太麻烦了,还要测试如果把这个一套环境拿到别的地方还能用吗?

使用服务编排可以避免这些坑。

加入我们的项目中增加了 Mysql 的数据库,在根目录新建一个 docker-compose.yml

version: '3'
services:web:depends_on:- dbports:- "8080:8080" # 建议加上引号,如果单独两位数的数字,可能出现解析问题restart: always# build:#  context: ./src/docker # Dockerfile 文件的目录,可以远程地址,绝对 or 相对# dockerfile: Dockerfile # 如果你的 Dockerfile 重命名了,需要指定image: test:latestenvironment:DB_HOST: db:3306DATABASE: learnDB_USERNAME: root # 测试用下 rootDB_PASSWORD: 123456 #  # 建议使用 secretdb:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: learnMYSQL_USER: kronchanMYSQL_PASSWORD: 123456volumes:db_data:  # 使用的数据卷必须声明

上面我使用的是前面已经构建好的镜像,然后执行的编排,更好的是直接使用 build 让它自己编排服务。

系统配置文件application.yml使用缺省值的方式,不影响开发的使用:

spring:datasource:url: jdbc:mysql://${DB_HOST:localhost:3306}/${DATABASE:learn}?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8username: ${DB_USERNAME:root}password: ${DB_PASSWORD:123456}driver-class-name: com.mysql.jdbc.Driverjpa:show-sql: truedatabase: mysqlhibernate:ddl-auto: updateproperties:hibernate:dialect: org.hibernate.dialect.MySQL57Dialect # 方言根据 数据库版本选择吧

也可以使用不同的 spring.profiles指定不同的环境,在 docker-compose.yml 中覆盖执行命令指定环境也是常见做法的:command: mvn clean spring-boot:run -Dspring-boot.run.profiles=xxx

最后启动,在 docker-compose.yml目录下执行 : docker-compose up

关闭服务 docker-compose down

注意

docker-compose 顺序的问题,这个是开始学习编排的时候需要注意的问题,如果上面的服务编排中 mysql 启动的慢, web 项目就会启动失败,它启动的时候不知道被依赖的服务是否启动完成,就会出现这样的问题。

解决的办法有以下几种:

  • 足够的容错和重试机制,比如连接数据库,在初次连接不上的时候,服务消费者可以不断重试,直到连接上位置
  • docker-compose拆分,分成两部分部署,将要先启动的服务放在一个docker-compose中,后启动的服务放在两一个docker-compose中,启动两次,两者使用同一个网络。
  • 同步等待,使用wait-for-it.sh或者其他shell脚本将当前服务启动阻塞,直到被依赖的服务加载完毕
    wait-for-it的github地址为:wait-for-it

总结

  1. 主要是写 Dockerfile 的时候最好单独的拿出一个文件夹来放它,我开始的时候就是直接放在项目的根路径,结果构建镜像的时候总是出现了将其他的文件也一起复制到了 Docker 目录中,WINDOW下使用 maven 插件操作这个需要注意这个上下文环境,不然很容易将一个磁盘的文件都拷贝进来了,初学者血的教训。解决办法就是单独创建一个文件夹,将需要的东西单独放置,就不用考虑这么多问题。

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

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

相关文章

nginx php大文件上传,Nginx+PHP上传大文件设置

nginx的修改send_timeout 60;fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;client_max_body_size 30m; 可以全局设置也可以每个网站单独设置php的修改upload_max_filesize 10Mpost_max_size 15M 该项应该要大于 upload_max_filesizemax_inp…

学习Spring Boot:(二十四)多数据源配置与使用

前言 随着业务量增大&#xff0c;可能有些业务不是放在同一个数据库中&#xff0c;所以系统有需求使用多个数据库完成业务需求&#xff0c;我们需要配置多个数据源&#xff0c;从而进行操作不同数据库中数据。 正文 JdbcTemplate 多数据源 配置 需要在 Spring Boot 中配置…

matlab 超限像素平滑法,matlab超限像素平滑法_图像增强技术.ppt

主讲&#xff1a;苏菡 susuhansicnu.edu.cn 图象增强技术概述 目标&#xff1a;“视觉”效果更好&#xff0c;图象保真度不是首要目标 方法&#xff1a; 空间域增强&#xff1a;直接处理图象的象素 频率域增强&#xff1a;修改图象的傅立叶变换 评价&#xff1a;高度主观 视觉解…

学习Spring Boot:(二十五)使用 Redis 实现数据缓存

前言 由于 Ehcache 存在于单个 java 程序的进程中&#xff0c;无法满足多个程序分布式的情况&#xff0c;需要将多个服务器的缓存集中起来进行管理&#xff0c;需要一个缓存的寄存器&#xff0c;这里使用的是 Redis。 正文 当应用程序要去缓存中读取数据&#xff0c;但是缓存…

php ai库,收藏 | 深度学习框架、AI库、ML库、NLP库、CV库汇总!

一份包含深度学习框架、AI工具/库、机器学习工具/库、NLP工具/库、CV工具/库的汇总&#xff0c;并附有说明文档(有些是中英文文档都有)。之所以附带文档而不是源码&#xff0c;有两方面原因&#xff1a;先看文档&#xff0c;找出最适合自己的一个或两个(太多没必要&#xff0c;…

学习Spring Boot:(二十六)使用 RabbitMQ 消息队列

前言 前面学习了 RabbitMQ 基础&#xff0c;现在主要记录下学习 Spring Boot 整合 RabbitMQ &#xff0c;调用它的 API &#xff0c;以及中间使用的相关功能的记录。 相关的可以去[我的博客/RabbitMQ] 正文 我这里测试都是使用的是 topic 交换器&#xff0c;Spring Boot 2.…

appnode php,环境软件路径参考

[TOC]## Nginx* 主程序路径&#xff1a;/usr/sbin/nginx* 配置文件路径&#xff1a;/etc/nginx.conf* 服务控制命令&#xff1a;* CentOS 6&#xff1a;service nginx start|stop|reload|restart* CentOS 7&#xff1a;systemctl start|stop|reload|restart nginx.service## PH…

学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator

前言 主要是完成微服务的监控&#xff0c;完成监控治理。可以查看微服务间的数据处理和调用&#xff0c;当它们之间出现了异常&#xff0c;就可以快速定位到出现问题的地方。 springboot - version: 2.0 正文 依赖 maven 项目 在 pom.xml 文件中加入 actuator 的依赖&…

php实现注销功能,laravel 实现用户登录注销并限制功能

在项目根目录输入&#xff1a; php artisan make:controller Admin/LoginControllerphp artisan make:model Model/Admin -m运行之后 项目中会新增两个PHP文件新创建了admins用户表&#xff0c;此用户表默认新建中只有主键&#xff0c;创建时间&#xff0c;编辑时间。我们接下来…

将ipynb文件转为py的简单方法(图文并茂)

打开可以使用jupyter命令的命令窗口&#xff08;如果没有jupyter则需要先安装jupyter&#xff09;&#xff0c;cd 命令进入到 ipynb 文件所在的文件夹&#xff0c;执行 jupyter nbconvert --to script xxx.ipynb 即可完成 ipynb 文件到 py 文件的转化&#xff0c;执行 jupyter …

学习Spring Boot:(二十八)Spring Security 权限认证

前言 主要实现 Spring Security 的安全认证&#xff0c;结合 RESTful API 的风格&#xff0c;使用无状态的环境。 主要实现是通过请求的 URL &#xff0c;通过过滤器来做不同的授权策略操作&#xff0c;为该请求提供某个认证的方法&#xff0c;然后进行认证&#xff0c;授权成…

在PHP中如何要json中的数据,如何在不知道键值的情况下在php中读取JSON数据

我需要在php中读取firebase JSON URL然后显示它.我的firebase得到了以下.json数据&#xff1a;{"dDsdE4AlB7P5YYd4fWbYTQKCLPh1":{"email":"abhigmail.com","name":"abhishek"},"z1ceiLhdh9YVu7lGnVvqDWoWHFH3":{…

oracle 分区字符转换,Oracle 普通表与分区表转换

oracle 9i提供了dbms_redefinition包来实现数据库的表的在线重定义功能。在实际的应用上&#xff0c;我们可以利用这个包来进行&#xff1a;(1)堆表与分区之间进行转换。(2)重建表以减少HWM。10g能shrink&#xff0c;9i如果用move tablespace and rebuild index在move的时候会锁…

Java中使用有返回值的线程

在创建多线程程序的时候&#xff0c;我们常实现Runnable接口&#xff0c;Runnable没有返回值&#xff0c;要想获得返回值&#xff0c;Java5提供了一个新的接口Callable&#xff0c;可以获取线程中的返回值&#xff0c;但是获取线程的返回值的时候&#xff0c;需要注意&#xff…

Mybatis 插入时获取主键的方式

mybatis 作为一个主流的 ORM 框架&#xff0c;深受广大开发者的喜爱。有人的地方就有江湖&#xff0c;有代码的地方自然有坑&#xff0c;下面来说说获取 mybatis 的插入后返回的主键。 我们可以想一下自动增长的主键特性&#xff0c;在数据库里面肯定有某个地方管理 ID 的自增…

linux脚本怎么把文件地址变成动态地址,Linux脚本程序自动修改网卡配置文件中的MAC地址...

在玩Linux虚拟机的时候&#xff0c;一个安装好linux系统的virtual HDD会用于创建多个虚拟机&#xff0c;这样就不需要在创建每个虚拟机都安装一遍系统了。virtual HDD加载到虚拟机后&#xff0c;新的虚拟机的MAC地址就会和virtual系统中ifcfg-eth[0&#xff0d;9]中的MAC地址不…

MySQL + MyBatis 批量插入时存在则忽略或更新记录

一、存在时则忽略 为什么在发现重复时会忽略&#xff1f;这里面涉及到两个地方。 1、重复则忽略。那么首先是需要判断是否重复&#xff0c;这里是通过唯一索引判断是否重复的。如果表中唯一索引的字段已经存在与将要插入的记录行中唯一索引的字段值相同&#xff0c;则标识为重…

Linux 目录所属组设置,Linux系统用户与组管理命令及配置文件总结

一、Linux系统用户及组分类1、用户类别Linux系统中的用户大致可分为三类&#xff1a;root用户、系统用户、普通用户。每一个用户都拥有一个唯一的身份标识UID。2、组分类与用户信息对应的&#xff0c;Linux系统中的组也可分为三类&#xff1a;root组、系统组、普通组。每一个组…

linux 字符串 空,linux – bash空字符串/命令

你似乎把bash与其他一些编程语言混淆了.变量被替换,然后左边的内容被执行."$a"这是引号之间的a的内容. a是空的,所以这相当于&#xff1a;""那不是命令. “没有找到指令.”由于存在错误,执行不成功(shell返回代码不为0),因此命令的后半部分 – && …

@GetMapping和@PostMapping详解

首先要了解一下RequestMapping注解。 RequestMapping用于映射url到控制器类的一个特定处理程序方法。可用于方法或者类上面。也就是可以通过url找到对应的方法。 RequestMapping有8个属性。 value&#xff1a;指定请求的实际地址。 method&#xff1a;指定请求的method类型&…