在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在之前使用docker部署运行了Spring Boot的小例子,但是没有使用数据库。在这一篇中,介绍docker如何启动mysql容器,以及如何将Spring Boot容器与mysql容器连接起来运行。 docker基本命令 首先熟悉一下在操作过程中常用的docker基本命令: docker images:列出所有docker镜像 docker ps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 docker stop container_id:停止容器 docker start container_name:启动已被停止的容器 docker rm container_id:删除已经停止的容器,加-f选项可以强制删除正在运行的容器 docker rmi image_id:删除镜像,前提是该镜像没有对应的容器 docker运行mysql容器 首先是新建Dockerfile: FROM ubuntu:14.04 MAINTAINER loveqh RUN apt-get update RUN apt-get -y install mysql-server RUN /etc/init.d/mysql start \ && mysql -uroot -e "grant all privileges on *.* to 'root'@'%' identified by '123456';" \ && mysql -uroot -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';" RUN sed -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 EXPOSE 3306 CMD ["/usr/bin/mysqld_safe"] 然后创建mysql镜像: docker build -t loveqh/mysql . 下一步便是由该镜像启动一个容器: docker run -d -P --name docker-mysql loveqh/mysql 其中, -d表示在后台运行容器,并会返回容器id 可以通过docker ps查看容器端口映射关系,在PORTS那一列显示 0.0.0.0:32770->3306/tcp 也就是mysql映射到了宿主机的32770端口上了,那么就可以通过 mysql -h 0.0.0.0 -P 32770 -uroot -p 连接到mysql容器了。 docker连接spring boot和mysql容器 之前的文章中已经在docker中运行了Spring Boot的实例,但是没有用到数据库。接下来我们在项目基础上添加数据库操作。 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文件,Spring Boot在启动时会自动执行该文件,因此可以在该文件里创建数据表和插入测试数据等操作: use spring; create table if NOT EXISTS user ( id int PRIMARY KEY NOT NULL auto_increment, name VARCHAR(30), password VARCHAR(10), email VARCHAR(30) ); -- INSERT INTO user(name, password, email) values("test", "001", "[email protected]"); INSERT INTO user(name, password, email) SELECT * FROM (SELECT "test", "001", "[email protected]") AS tmp WHERE NOT EXISTS ( SELECT name FROM user WHERE name='test' AND email='[email protected]' ) limit 1; 在该文件里,指定了所使用的数据库spring,然后如果没有user表则新建。接下来插入测试数据时,注释了简单的插入命令,因为这样会在每次启动项目时都会插入一条相同的记录,因此用下面的语句代替。 按照之前的步骤创建Spring Boot镜像: docker build -t loveqh/spring-boot-mysql-docker . 下面是连接运行Spring Boot容器并连接到mysql数据库: docker run -d -p 8088:8080 –name spring-web –link docker-mysql:mysql loveqh/spring-boot-mysql-docker 其中, -d仍然是在后台运行,如何不想后台运行,可以将-d参数替换为-it,这样可以看到项目的输出信息。当然,也可以通过docker logs container-name/container-id查看容器日志。 刚开始一直纠结spring boot项目如何配置mysql地址,因为在运行mysql容器时没有指定端口映射,是随机映射的,并且如果我们在mysql的url中写localhost:映射端口的话,那么我们使用link连接这两个容器的作用也就没有了。终于在看了一些资料后突然醒悟了,使用–link之后,docker会在子容器(这里的spring boot容器)的/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 package com.xxx; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.util.List; /** * Created by wangl on 17-5-16. */ @Controller @RequestMapping("/user") public class UserController { @Autowired private UserDao userDao; @RequestMapping(method = RequestMethod.GET) public String index(Model model) { model.addAttribute("user", new User()); return "index"; } @RequestMapping("/list") public String list(Model model) { Listusers = userDao.findAll(); model.addAttribute("users", users); return "list"; } @RequestMapping(value = "/registry", method = RequestMethod.POST) public String registry(@ModelAttribute(value = "user") User user, Model model) { boolean flag = userDao.save(user); if(flag) { Listusers = userDao.findAll(); model.addAttribute("users", users); return "list"; } model.addAttribute("info", "注册失败!"); return "fail"; } } //UserDao.java package com.xxx; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import java.util.List; /** * Created by wangl on 17-5-16. */ @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public ListfindAll() { String sql = "select id, name, email from user"; RowMappermapper = (rs, rowNum) -> { User user = new User(); user.setId(rs.getLong(1)); user.setName(rs.getString(2)); user.setEmail(rs.getString(3)); return user; }; return jdbcTemplate.query(sql, mapper); } public boolean save(User user) { boolean exists = exists(user); if(exists) { return false; } String sql = "insert into user(name, password, email) values(?, ?, ?)"; int count = jdbcTemplate.update(sql, user.getName(), user.getPassword(), user.getEmail()); return count == 1; } public boolean exists(User user) { String sql = "select count(*) from user where name=?"; int count = jdbcTemplate.queryForObject(sql, new Object[]{user.getName()},int.class); return count != 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: The element type “THYMELEAF_ROOT” must be terminated by the matching end-tag 之前遇到很多thymeleaf报错,都是html标签的闭合问题,仔细检查html文件中标签是否都闭合以及是否对应 这里使用了thymeleaf自动绑定表单进行提交,花了好长时间去检查registry方法和index.html,结果怎么改都出错。后来才发现,原来index页面中有th:object=”${user}”,但是刚开始index方法并没有在model中添加该对象,因此会出现不能获得user的错误。解决办法就是在所有返回index的方法中,都对model添加user对象: model.addAttribute("user", new User()); 总结 以上就是本文关于docker连接spring boot和mysql容器方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈Docker安全机制内核安全与容器之间的网络安全、详解Docker使用Linux iptables 和 Interfaces管理容器网络、Windows使用docker打开新窗口error解决办法等,有什么问题可以随时留言,小编会及时回复大家的。这里推荐几本学习docker的相关书籍,供广大docker爱好者学习参考: 第一本Docker书 带书签目录 完整pdf扫描版 https://www.ogeek.net/books/514869.html Docker容器与容器云(第2版) 完整pdf扫描版 https://www.ogeek.net/books/569549.html 希望大家喜欢! |
请发表评论