• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > docker连接spring boot和mysql容器方法介绍

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

作者:124****@qq.com 字体:[增加 减小] 来源:互联网

本文主要包含docker,spring,boot,docker,启动mysql容器等服务器相关知识,124****@qq.com 希望可以进行参考

在之前使用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
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Docker实践8:Compose,docker实践compose
  • Docker buildx构建多平台镜像并推送到私有仓库的方法
  • Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)
  • 什么是Docker?为什么要使用Docker
  • docker 开源的应用容器引擎
  • 如何给docker设置http代理
  • docker官方mysql镜像自定义配置详解
  • 详解Docker数据管理(数据卷&数据卷容器)
  • 如何利用Docker容器实现代理转发与数据备份详解
  • 详解Docker Swarm 在持续集成测试中的应用

相关文章

  • Docker高级教程之智能添加与修改防火墙规则
  • Docker镜像制作详解介绍
  • virtualbox虚拟机上安装centOS的网络配置详解
  • 浅谈docker学习之docker数据卷(volume)
  • Docker安装(Ubuntu 64bit)的方法步骤
  • 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法
  • VMware workstation 9安装配置图文教程
  • 存储虚拟化与服务器虚拟化相辅相成
  • 通过UI管理docker的方法
  • VMware Workstation安装配置方法图文教程

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • VMware中CentOS设置静态IP与外网互动设置的图文教程
    • Docker构建pinpoint部署的方法
    • Docker的理解和基本命令详解
    • KVM虚拟机的创建、管理与迁移介绍
    • docker images,info,-d等命令报错的解决方法
    • 详解使用docker 1.12 搭建多主机docker swarm集群
    • 用Docker作为PaaS的替代方案是否完美无缺
    • Docker学习笔记之Weave实现跨主机容器互联
    • 详解QEMU网络配置的方法
    • 存储虚拟化与服务器虚拟化相辅相成

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有