Spring boot 与 Docker-compose构建微服务应用(2)

来源:互联网 发布:java导出word文档 编辑:程序博客网 时间:2024/04/29 17:45

Spring boot 与 Docker-compose构建微服务应用(2)


  • mysql相关

  • spring boot应用

  • docker-compose管理

  • 应用运行

  • 综合


上一篇博客说的是spring boot应用使用mongodb后,使用docker分别创建springboot应用镜像和mongodb镜像,然后使用docker-compose进行统一管理,是一个简单的,运用了docker、docker-compse、springboot、mongodb的综合应用,这一次使用的是相同的技术,但是不再是springboot和mongodb,而是普通使用的mysql,并且内置一部分数据。

1. mysql相关


这其中有两个部分,一个是使用的Dockerfile构建mysql镜像,一个是内置的mysql数据,其中Dockerfile中在构建mysql镜像的时候会将sql文件中数据同时初始化。

1.1 mysql数据


这一块其实相当简单,就是一个简单的sql文件,内容如下:

use testdb;CREATE TABLE person (  id int(11) NOT NULL AUTO_INCREMENT,  first varchar(100) NOT NULL,  last varchar(100) NOT NULL,  dateofbirth DATE DEFAULT null,  placeofbirth varchar(100) not null,  PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into person (first,last,dateofbirth,placeofbirth) values('Dursun','KOC', STR_TO_DATE('02/10/1982', '%m/%d/%Y'),'Erzincan');

就是简单的创建一个person表,同时insert进一条数据。

1.2 Dockerfile


直接展示出dockerfile文件后再来讲解其中的作用,
mysqldb-dockerfile:

FROM mysql/mysql-serverMAINTAINER bingwenwuhen bingwenwuhen@163.com# Copy the database initialize script:# Contents of /docker-entrypoint-initdb.d are run on mysqld startupADD  mysql/ /docker-entrypoint-initdb.d/

这个dockerfile内容相当简单,就是简简单单的拉取mysql镜像,但是会将上述提到的将mysql中的sql文件至于初始化目录中,并生成数据,这样在构建应用的时候便会自动的生成person表和插入数据。

2. spring boot应用


2.1 spring boot应用源码


这里的springboot应用相当简单,就是一个简单的使用spring boot和spring data操控mysqldb,并提供一个简单的controller,在此仅展示简单的几个文件。

启动类Application:

package cn.com;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;import java.util.Arrays;/** * Created by xiaxuan on 16/11/29. */@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        ApplicationContext ctx = SpringApplication.run(Application.class, args);        System.out.println("Let's inspect the beans provided by Spring Boot:");        String[] beanNames = ctx.getBeanDefinitionNames();        Arrays.sort(beanNames);        for (String beanName : beanNames) {            System.out.println(beanName);        }        System.out.println("Show time!");    }}

配置文件application.properties

# ===============================# = DATA SOURCE# ===============================# Set here configurations for the database connection# Connection url for the database "testdb"spring.datasource.url = jdbc:mysql://mysqldbserver:3306/testdb# Username and passwordspring.datasource.username = myuserspring.datasource.password = mypassword# Keep the connection alive if idle for a long time (needed in production)spring.datasource.testWhileIdle = truespring.datasource.validationQuery = SELECT 1# ===============================# = JPA / HIBERNATE# ===============================# Use spring.jpa.properties.* for Hibernate native properties (the prefix is# stripped before adding them to the entity manager).# Show or not log for each sql queryspring.jpa.show-sql = true# Hibernate ddl auto (create, create-drop, update): with "update" the database# schema will be automatically updated accordingly to java entities found in# the projectspring.jpa.hibernate.ddl-auto = update# Naming strategyspring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy# Allows Hibernate to generate SQL optimized for a particular DBMSspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

这上面仅仅只需要提一点,就是mysql的连接为:

spring.datasource.url = jdbc:mysql://mysqldbserver:3306/testdb

这里的mysql地址并不是ip地址,写上mysqlserver是因为在两个容器互相连接的时候,指定了名称。

2.2 springapp.dockerfile


以下就是将springboot应用打成镜像的文件,同样,内容十分简单,如下:

# base imageFROM java:8# maintainerMAINTAINER bingwenwuhen bingwenwuhen@163.com# update packages and install mavenRUN  \  export DEBIAN_FRONTEND=noninteractive && \  sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list && \  apt-get update && \  apt-get -y upgrade && \  apt-get install -y vim wget curl maven# attach volumesVOLUME /vol/development# create working directoryRUN mkdir -p /vol/developmentWORKDIR /vol/development# maven execCMD ["mvn", "clean", "install", "spring-boot:run"]

在这里,仍然没有直接将本地的jar打进镜像之中,使用的是下载maven,然后在容器中编译打包,然后运行,这个方法在拉取公网jar的时候十分缓慢,还是要在下次解决。

3. docker-compose.yml


在这里管理两个容器并非是使用docker build、run等命令,而是使用docker-compose进行整体的管理,docker-compose.yml文件如下:

version : '2'services:  springappserver:    build:      context: .      dockerfile: springapp.dockerfile    ports:      - "8080:8080"    networks:      - net-spring-db    volumes:      - .:/vol/development    depends_on:      - mysqldbserver  mysqldbserver:    build:      context: .      dockerfile: mysqldb.dockerfile    ports:      - "3306:3306"    networks:      - net-spring-db    environment:      MYSQL_DATABASE: testdb      MYSQL_USER: myuser      MYSQL_PASSWORD: mypassword      MYSQL_ROOT_PASSWORD: myrootpassword    container_name: mysqldbservernetworks:  net-spring-db:    driver: bridge

以上定义两个容器名称,端口等等,并指定两个容器的连接方式为桥接。

4. 应用运行


在控制台中运行命令,docker-compose up -d启动项目,观察控制台,如下:

在这里,两个容器已经成功运行起来,现在运行命令*docker exec -it 8ccb451d53c0 /bin/bash进入mysql容器内,看看是否有正常的数据,如下图:

已经初始化一条记录,现在在web请求,接口,如下图:

响应成功,整个应用完全运行起来,其他几个接口就不再测试了。

5. 综合


  • 本质上还是一个使用docker-compose管理两个容器的一个小应用,比较简单。

  • 在打spring boot应用镜像的时候,方法应该还能得到改进,不必再进行下载maven,直接以java8镜像我基础镜像即可。

源码下载地址

1 0
原创粉丝点击