您的位置:首页 > 运维架构 > Docker

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

2017-01-16 10:04 609 查看

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

源码下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: