Spring boot 与 Docker-compose构建微服务应用(2)
Spring boot 与 Docker-compose构建微服务应用(2)mysql相关spring boot应用docker-compose管理应用运行综合上一篇博客说的是spring boot应用使用mongodb后,使用docker分别创建springboot应用镜像和mongodb镜像,然后使用docker-compose进行统一管理,是一个简单
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镜像我基础镜像即可。
更多推荐
所有评论(0)