docker连接spring boot和mysql容器方法介绍

在之前使用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
-P是将容器所有暴露的端口映射到主机的随机端口号上,也可以使用-p是指定一容器端口的映射关系,如-p 33060:3306,就是把容器的3306端口映射到宿主机的33060端口上

可以通过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的实例,但是没有用到数据库。接下来我们在项目基础上添加数据库操作。
首先在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文件,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", "test@163.com");
INSERT INTO user(name, password, email)
SELECT * FROM (SELECT "test", "001", "test@163.com") AS tmp
WHERE NOT EXISTS (
  SELECT name FROM user WHERE name='test' AND email='test@163.com'
) 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查看容器日志。
-p参数将容器中Spring Boot默认的8080端口映射到了宿主机的8088端口
–name指定了容器的名字,这样在容器停止后可以通过docker start spring-web重启
–link参数连接到了docker-mysql容器,并使用了别名mysql

刚开始一直纠结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文件中标签是否都闭合以及是否对应
在访问index的注册页面时,遇到报错:java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name ‘user' available as request attribute

这里使用了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扫描版

http://www.jb51.net/books/514869.html

Docker容器与容器云(第2版) 完整pdf扫描版

http://www.jb51.net/books/569549.html

希望大家喜欢!

(0)

相关推荐

  • MySQL操作之JSON数据类型操作详解

    上一篇文章我们介绍了mysql数据存储过程参数实例详解,今天我们看看MySQL操作之JSON数据类型的相关内容. 概述 mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点.但mysql毕竟是关系型数据库,在处理json这种非结构化的数据时,还是比较别扭的. 创建一个JSON字段的表 首先先创建一个表,这个表包含一个json格式的字段: CREATE TABLE table_name ( id INT NOT NULL

  • JDBC连接mysql处理中文时乱码解决办法详解

    JDBC连接mysql处理中文时乱码解决办法详解 近日,整合的项目需要跟一个比较老版本的mysql服务器连接,使用navicat查看,发现此mysql服务器貌似没有设置默认编码,而且从操作此mysql的部分php文件看,应该是使用的gb2312的编码,但是,直接使用jdbc操作,从库中读取出来的中文全都是乱码. 一开始,使用类似entity.setDepartName(new String(rs.getString("hg").getBytes("gbk"), &q

  • MySQL分区字段列有必要再单独建索引吗?

    前言 大家都知道对于分区字段必须是主键的一部分,那么建了复合主键之后,是否需要对分许字段再单独添加一个索引呢?有没有效果?来验证一下,下面话不多说了,来一起看看详细的介绍吧. 1.新建表effect_new(以创建时间按月分区) CREATE TABLE `effect_new` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `type` tinyint(4) NOT NULL DEFAULT '0', `timezone` varchar(10) DEF

  • MySQL启用SSD存储的实例详解

    MySQL启用SSD存储的实例详解 有时OS读写慢会降低MySQL服务器的性能,尤其是OS与MySQL使用同一磁盘时.故最好是让MySQL使用单独的磁盘,能使用SSD更好.要做到这一点,需要把SSD新磁盘挂载到服务器上,假定新磁盘在/dev/sdb. 1.准备新磁盘: # fdisk /dev/sdb 按下"n"将创建一个新分区:按下"p"将创建新的主分区.接着设置分区号(从1-4),再选择分区的尺寸,按下回车键. 如果不想使用整个磁盘作为一个分区,那么还需要继续创

  • MySQL数据类型中DECIMAL的用法实例详解

    MySQL数据类型中DECIMAL的用法实例详解 在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮点列的值被四舍五入到这个列所指定的十进制数.如果在一个FLOAT(8, 1)的列中存储1. 2 3 4 5 6,则结果为1. 2.如果将相同的值存入FLOAT(8, 4) 的列中,则结果为1. 2 3 4 6. 这表示应该定义具有足够位数的浮点列以便

  • MySQL 清除表空间碎片的实例详解

    MySQL 清除表空间碎片的实例详解 碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大: (2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片: (3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分: 例如: 一个表有1万行

  • MySQL如何查看元数据锁阻塞在哪里

    MySQL如何查看元数据锁阻塞在哪里 操作步骤: 1.session 1 执行: start transaction; select *from t1; 2.session 2 在第1步执行完后执行: drop table t1; 此时session 2的drop语句被阻塞.那么怎么分析查看元数据锁呢? 方法: 1)执行show processlist;,可以看到drop语句在等待元数据锁 mysql> show processlist; +----+-------------+--------

  • docker连接spring boot和mysql容器方法介绍

    在之前使用docker部署运行了Spring Boot的小例子,但是没有使用数据库.在这一篇中,介绍docker如何启动mysql容器,以及如何将Spring Boot容器与mysql容器连接起来运行. docker基本命令 首先熟悉一下在操作过程中常用的docker基本命令: docker images:列出所有docker镜像 docker ps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 docker stop container_id:停止容器 docker start

  • 使用Docker部署Spring Boot的应用示例

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署. 一个简单 Spring Boot 项目 在 pom.xml 中 ,使用 Spring Boot 2.0 相关依赖 <parent> <groupId>org.springframework.boot</groupId>

  • IDEA连接远程服务器Docker部署Spring Boot项目的详细教程

    开始前的准备工作 拥有一台云服务器,我的是腾讯云服务器(CentOS7) 腾讯云服务器安装Docker,我的版本是Docker 19.03.9,关于安装和配置镜像加速器可以查阅我的另一篇博文:https://www.jb51.net/article/188048.htm,其中有详细的讲解 Windows上有安装IDEA 正式开始工作 第一步:配置Docker,开启远程访问(注:仅供学习参考,实际生产环境万万不可,会产生很大的安全风险),默认端口是2375,也可以修改为其他端口 1.修改/lib/

  • spring boot配置MySQL数据库连接、Hikari连接池和Mybatis的简单配置方法

    此方法为极简配置,支持MySQL数据库多库连接.支持Hikari连接池.支持MyBatis(包括Dao类和xml文件位置的配置). 1.pom.xml中引入依赖: <!-- Begin of DB related --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId>

  • 使用docker部署spring boot并接入skywalking的方法

    一.概述 最近在研究skywalking,打算使用k8s部署 skywalking 并将 pod 中的应用接入 skywalking 进行服务链路追踪.这篇文章先不介绍 skywalking 在k8s中的部署和使用,而是先介绍如何使用手动和docker的方式使用 skywalking.在整个实践过程中查阅了大量文档,遇到了各种问题,这里将我自己的实践过程记录下来,希望对有同样需求的小伙伴提供一些帮助. 1.skywalking 简介 SkyWalking是一款广受欢迎的国产APM(Applica

  • 使用Docker部署Spring Boot的实现方法

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署. 一个简单 Spring Boot 项目 在 pom.xml 中 ,使用 Spring Boot 2.0 相关依赖 <parent> <groupId>org.springframework.boot</groupId>

  • 在Docker中开发Java 8 Spring Boot应用程序的方法

    在本文中,我将向您展示如何使用Java 8开发和运行简单的Spring Web应用程序,而无需在本地计算机上安装Java 8. Python开发人员使用虚拟环境为不同项目创建和管理单独的环境,每个环境使用不同版本的Python来执行,存储和解析Python依赖项.Java和许多其他技术不支持虚拟环境概念.在这一点上,Docker来帮助我们. Docker是一个虚拟化平台.您可以从Docker官方网站上找到基本信息和安装指南. 一旦安装了Docker工具箱,就不需要安装我们的示例应用程序中所需的J

  • 使用 Spring Boot 内嵌容器 Undertow创建服务器的方法

    Undertow是一个Web服务器,那么它就需要具备的现代Web服务器的基本特性,比如Servlet,JSP,文件服务器,代理服务器,安全认证等.undertow目前已经实现了绝大多数功能,并且因为wildfly通过了JavaEE7 TCK认证,所以可以说Undertow是一个通过Servlet 3.1认证的Web服务器和容器.这篇文章只分析Undertow的主干流程上的主要功能,即undertow-core和undertow-servlet. 1.简介 Undertow是一个非常轻量并高性能的

  • Spring Boot 与 mybatis配置方法

    1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spring Boot 启动父依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </

  • Spring Boot启动端口修改方法

    spring boot是个好东西,可以不用容器直接在main方法中启动,而且无需配置文件,方便快速搭建环境.可是当我们要同时启动2个springboot工程时,就会有问题,有可能会因为8080端口被第一个应用占用而导致第二个应用无法启动,这时就需要修改其中一个工程的启动端口. 1.可以通过实现EmbeddedServletContainerCustomizer接口来实现: public class Application extends SpringBootServletInitializer

随机推荐