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-server

MAINTAINER bingwenwuhen bingwenwuhen@163.com

# Copy the database initialize script:
# Contents of /docker-entrypoint-initdb.d are run on mysqld startup
ADD  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.
 */
@SpringBootApplication
public 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 password
spring.datasource.username = myuser
spring.datasource.password = mypassword

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.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 query
spring.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 project
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Allows Hibernate to generate SQL optimized for a particular DBMS
spring.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 image
FROM java:8

# maintainer
MAINTAINER bingwenwuhen bingwenwuhen@163.com

# update packages and install maven

RUN  \
  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 volumes
VOLUME /vol/development

# create working directory
RUN mkdir -p /vol/development
WORKDIR /vol/development

# maven exec
CMD ["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: mysqldbserver

networks:
  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镜像我基础镜像即可。

源码下载地址

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐