docker连接spring boot和mysql容器方法介绍
在之前使用docker部署运行了SpringBoot的小例子,但是没有使用数据库。在这一篇中,介绍docker如何启动mysql容器,以及如何将SpringBoot容器与mysql容器连接起来运行。
docker基本命令
首先熟悉一下在操作过程中常用的docker基本命令:
dockerimages:列出所有docker镜像 dockerps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 dockerstopcontainer_id:停止容器 dockerstartcontainer_name:启动已被停止的容器 dockerrmcontainer_id:删除已经停止的容器,加-f选项可以强制删除正在运行的容器 dockerrmiimage_id:删除镜像,前提是该镜像没有对应的容器 docker运行mysql容器
首先是新建Dockerfile:
FROMubuntu:14.04 MAINTAINERloveqh RUNapt-getupdate RUNapt-get-yinstallmysql-server RUN/etc/init.d/mysqlstart\ &&mysql-uroot-e"grantallprivilegeson*.*to'root'@'%'identifiedby'123456';"\ &&mysql-uroot-e"grantallprivilegeson*.*to'root'@'localhost'identifiedby'123456';" RUNsed-Ei's/^(bind-address|log)/#&/'/etc/mysql/my.cnf\ &&echo'skip-host-cache\nskip-name-resolve'|awk'{print}$1=="[mysqld]"&&c==0{c=1;system("cat")}'/etc/mysql/my.cnf>/tmp/my.cnf\ &&mv/tmp/my.cnf/etc/mysql/my.cnf EXPOSE3306 CMD["/usr/bin/mysqld_safe"]
然后创建mysql镜像:
dockerbuild-tloveqh/mysql.
下一步便是由该镜像启动一个容器:
dockerrun-d-P--namedocker-mysqlloveqh/mysql
其中,
-d表示在后台运行容器,并会返回容器id
-P是将容器所有暴露的端口映射到主机的随机端口号上,也可以使用-p是指定一容器端口的映射关系,如-p33060:3306,就是把容器的3306端口映射到宿主机的33060端口上
可以通过dockerps查看容器端口映射关系,在PORTS那一列显示
0.0.0.0:32770->3306/tcp
也就是mysql映射到了宿主机的32770端口上了,那么就可以通过
mysql-h0.0.0.0-P32770-uroot-p
连接到mysql容器了。
docker连接springboot和mysql容器
之前的文章中已经在docker中运行了SpringBoot的实例,但是没有用到数据库。接下来我们在项目基础上添加数据库操作。
首先在resources下新建application.properties文件来配置数据库:
spring.datasource.url=jdbc:mysql://localhost:3306/spring spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
注:这里的url会在稍后连接mysql容器后进行修改。
新建schema.sql文件,SpringBoot在启动时会自动执行该文件,因此可以在该文件里创建数据表和插入测试数据等操作:
usespring; createtableifNOTEXISTSuser( idintPRIMARYKEYNOTNULLauto_increment, nameVARCHAR(30), passwordVARCHAR(10), emailVARCHAR(30) ); --INSERTINTOuser(name,password,email)values("test","001","test@163.com"); INSERTINTOuser(name,password,email) SELECT*FROM(SELECT"test","001","test@163.com")AStmp WHERENOTEXISTS( SELECTnameFROMuserWHEREname='test'ANDemail='test@163.com' )limit1;
在该文件里,指定了所使用的数据库spring,然后如果没有user表则新建。接下来插入测试数据时,注释了简单的插入命令,因为这样会在每次启动项目时都会插入一条相同的记录,因此用下面的语句代替。
按照之前的步骤创建SpringBoot镜像:
dockerbuild-tloveqh/spring-boot-mysql-docker.
下面是连接运行SpringBoot容器并连接到mysql数据库:
dockerrun-d-p8088:8080–namespring-web–linkdocker-mysql:mysqlloveqh/spring-boot-mysql-docker
其中,
-d仍然是在后台运行,如何不想后台运行,可以将-d参数替换为-it,这样可以看到项目的输出信息。当然,也可以通过dockerlogscontainer-name/container-id查看容器日志。
-p参数将容器中SpringBoot默认的8080端口映射到了宿主机的8088端口
–name指定了容器的名字,这样在容器停止后可以通过dockerstartspring-web重启
–link参数连接到了docker-mysql容器,并使用了别名mysql
刚开始一直纠结springboot项目如何配置mysql地址,因为在运行mysql容器时没有指定端口映射,是随机映射的,并且如果我们在mysql的url中写localhost:映射端口的话,那么我们使用link连接这两个容器的作用也就没有了。终于在看了一些资料后突然醒悟了,使用–link之后,docker会在子容器(这里的springboot容器)的/etc/hosts中将父容器(这里的mysql容器)与父容器的ip地址绑定,那么我们就可以mysql:3306来访问数据库了。也就是把application.properties中数据库url改为:
spring.datasource.url=jdbc:mysql://mysql:3306/spring
第二个mysql是我们之前设置的别名。
接下来访问http://localhost:8088就可以看到运行结果了。
项目代码
因为本文主要是讲docker连接两个容器的,因此没有对代码进行说明,下面只是简单地粘贴出关键代码。
Index-首页name:password:email:
//UserController.java packagecom.xxx; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.ui.Model; importorg.springframework.web.bind.annotation.ModelAttribute; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; importjava.util.List; /** *Createdbywanglon17-5-16. */ @Controller @RequestMapping("/user") publicclassUserController{ @Autowired privateUserDaouserDao; @RequestMapping(method=RequestMethod.GET) publicStringindex(Modelmodel){ model.addAttribute("user",newUser()); return"index"; } @RequestMapping("/list") publicStringlist(Modelmodel){ Listusers=userDao.findAll(); model.addAttribute("users",users); return"list"; } @RequestMapping(value="/registry",method=RequestMethod.POST) publicStringregistry(@ModelAttribute(value="user")Useruser,Modelmodel){ booleanflag=userDao.save(user); if(flag){ Listusers=userDao.findAll(); model.addAttribute("users",users); return"list"; } model.addAttribute("info","注册失败!"); return"fail"; } }
//UserDao.java packagecom.xxx; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.jdbc.core.JdbcTemplate; importorg.springframework.jdbc.core.RowMapper; importorg.springframework.stereotype.Repository; importjava.util.List; /** *Createdbywanglon17-5-16. */ @Repository publicclassUserDao{ @Autowired privateJdbcTemplatejdbcTemplate; publicListfindAll(){ Stringsql="selectid,name,emailfromuser"; RowMappermapper=(rs,rowNum)->{ Useruser=newUser(); user.setId(rs.getLong(1)); user.setName(rs.getString(2)); user.setEmail(rs.getString(3)); returnuser; }; returnjdbcTemplate.query(sql,mapper); } publicbooleansave(Useruser){ booleanexists=exists(user); if(exists){ returnfalse; } Stringsql="insertintouser(name,password,email)values(?,?,?)"; intcount=jdbcTemplate.update(sql,user.getName(),user.getPassword(),user.getEmail()); returncount==1; } publicbooleanexists(Useruser){ Stringsql="selectcount(*)fromuserwherename=?"; intcount=jdbcTemplate.queryForObject(sql,newObject[]{user.getName()},int.class); returncount!=0; } }
list-用户列表 id name email stat:index stat:count stat:size stat:current stat:even stat:odd stat:first stat:last id,error name,error email,error error error error error error error error error
问题记录
在做的过程中遇到了很多问题,经过查资料解决了,现在将其记录下来。
在使用thymeleaf模板引擎时遇到报错:org.xml.sax.SAXParseException:Theelementtype“THYMELEAF_ROOT”mustbeterminatedbythematchingend-tag
之前遇到很多thymeleaf报错,都是html标签的闭合问题,仔细检查html文件中标签是否都闭合以及是否对应
在访问index的注册页面时,遇到报错:java.lang.IllegalStateException:NeitherBindingResultnorplaintargetobjectforbeanname‘user'availableasrequestattribute
这里使用了thymeleaf自动绑定表单进行提交,花了好长时间去检查registry方法和index.html,结果怎么改都出错。后来才发现,原来index页面中有th:object=”${user}”,但是刚开始index方法并没有在model中添加该对象,因此会出现不能获得user的错误。解决办法就是在所有返回index的方法中,都对model添加user对象:
model.addAttribute("user",newUser());
以上就是本文关于docker连接springboot和mysql容器方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈Docker安全机制内核安全与容器之间的网络安全、详解Docker使用Linuxiptables和Interfaces管理容器网络、Windows使用docker打开新窗口error解决办法等,有什么问题可以随时留言,小编会及时回复大家的。这里推荐几本学习docker的相关书籍,供广大docker爱好者学习参考:
第一本Docker书带书签目录完整pdf扫描版
https://www.nhooo.com/books/514869.html
Docker容器与容器云(第2版)完整pdf扫描版
https://www.nhooo.com/books/569549.html
希望大家喜欢!