亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

docker連接spring boot和mysql容器方法介紹

2024-09-01 13:53:11
字體:
來源:轉載
供稿:網友

在之前使用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.04MAINTAINER loveqhRUN apt-get updateRUN apt-get -y install mysql-serverRUN /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.cnfEXPOSE 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/springspring.datasource.username = rootspring.datasource.password = 123456spring.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 tmpWHERE 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.javapackage 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.javapackage 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. */@Repositorypublic 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容器方法介紹的全部內容,希望對大家有所幫助.有什么問題可以隨時留言,小編會及時回復大家的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
xxx成人少妇69| 成人羞羞国产免费| 18性欧美xxxⅹ性满足| 日韩av电影手机在线| 欧美俄罗斯性视频| 亚洲视频在线免费看| 国产精品久久久久久久7电影| 精品国产鲁一鲁一区二区张丽| 国产精品丝袜高跟| 亚洲无线码在线一区观看| 成人黄色免费网站在线观看| 色777狠狠综合秋免鲁丝| 成人激情视频免费在线| 在线观看欧美成人| 日韩在线观看免费全集电视剧网站| 久久深夜福利免费观看| 麻豆国产精品va在线观看不卡| 久久久久久国产三级电影| 亚洲日韩欧美视频| 日韩成人中文字幕在线观看| 久久久久久久999精品视频| 日韩三级影视基地| 最近2019免费中文字幕视频三| 亚洲free嫩bbb| 午夜免费日韩视频| 亚洲第一天堂无码专区| 亚洲性视频网址| 成人国产精品一区二区| 久久久久一本一区二区青青蜜月| 亚洲欧洲日产国码av系列天堂| 91精品视频免费| 亚洲加勒比久久88色综合| 久久在线免费观看视频| 成人激情在线播放| 国产suv精品一区二区| 国产亚洲精品高潮| 日韩视频永久免费观看| 一区二区三区黄色| 久久精品2019中文字幕| 日韩在线小视频| 欧亚精品在线观看| 精品久久久一区二区| 久久免费视频在线观看| 精品中文视频在线| 亚洲欧美精品中文字幕在线| 国产欧美 在线欧美| 日韩av在线看| 亚洲电影免费观看高清完整版在线| 欧美日韩国产麻豆| 中文字幕亚洲无线码a| 亚洲天堂成人在线| 亚洲精品动漫久久久久| 美女撒尿一区二区三区| 欧美成人免费在线视频| 超碰精品一区二区三区乱码| 精品亚洲国产视频| 亚洲偷欧美偷国内偷| 亚洲免费av片| 中文字幕亚洲情99在线| 亚洲免费一在线| 伊人精品在线观看| 综合国产在线视频| 欧美黄色片在线观看| 亚洲女人初尝黑人巨大| 亚洲视频网站在线观看| 欧美激情免费视频| 黄色一区二区在线| 欧美国产一区二区三区| 国产精品成人播放| 一本大道久久加勒比香蕉| 欧美激情一区二区三区高清视频| 日韩av成人在线| 久久国产精品久久久久久| 另类天堂视频在线观看| 亚洲视频电影图片偷拍一区| 欧美日韩国产999| 亚洲国产欧美精品| 欧美中文字幕第一页| 成人国产精品av| 秋霞午夜一区二区| 91在线无精精品一区二区| 亚洲男人天堂2019| 日日骚av一区| 最新中文字幕亚洲| 亚洲激情电影中文字幕| 久久视频中文字幕| 成人疯狂猛交xxx| 久久电影一区二区| 国产亚洲精品91在线| 午夜精品久久久久久久久久久久久| 98视频在线噜噜噜国产| 日韩亚洲在线观看| 成人国产精品一区| 日韩精品中文字幕久久臀| 久久天天躁狠狠躁夜夜躁2014| 九九热视频这里只有精品| 国产一区二区三区精品久久久| 亚洲综合在线播放| 国产999精品久久久影片官网| 91网站在线免费观看| 中文字幕最新精品| 久久影视电视剧免费网站清宫辞电视| 91久久久久久久久久久| 欧美性猛交xxxx免费看| 在线亚洲国产精品网| 国产亚洲人成网站在线观看| 日韩色av导航| 日韩暖暖在线视频| 欧美日本精品在线| 欧美理论电影在线播放| 成人中文字幕+乱码+中文字幕| 亚洲男人的天堂在线| 亚洲成人动漫在线播放| 欧美xxxwww| 亚洲欧美日韩精品久久亚洲区| 国模精品视频一区二区三区| 大量国产精品视频| 国产91|九色| 成人有码在线播放| 国产精品欧美激情| 国产精品专区一| 亚洲欧美日韩视频一区| 午夜精品一区二区三区视频免费看| 色妞在线综合亚洲欧美| 久久久免费在线观看| 国产日韩欧美电影在线观看| 日本久久久久久久久久久| 亚洲人成电影在线播放| 国产91在线高潮白浆在线观看| 久久视频在线播放| 97av视频在线| 日韩av高清不卡| 亚洲第一二三四五区| 欧美性猛交xxxx免费看| 欧美激情一二三| 国产成+人+综合+亚洲欧洲| 欧美激情在线有限公司| 久久久国产一区二区三区| 中文字幕欧美在线| 精品亚洲一区二区三区四区五区| 精品欧美aⅴ在线网站| 亚洲精品一区二区久| 亚洲精品国产精品自产a区红杏吧| 久久久欧美一区二区| 91在线高清视频| 欧美性xxxxhd| 国产欧美日韩亚洲精品| 国产欧美一区二区三区视频| 91av视频导航| 色综合视频网站| 中文字幕精品一区久久久久| 一本一本久久a久久精品综合小说| 尤物精品国产第一福利三区| 国产99久久精品一区二区| 国内成人精品一区| 日韩精品在线观看视频| 久久久久久久久91| 亚洲一区亚洲二区| 亚洲欧美另类在线观看| 国内精品久久久久久影视8| 成人h片在线播放免费网站| 国产亚洲精品91在线| 日韩精品中文字幕在线| 97成人超碰免|