docker-compose 实战使用,集成编排Redis、MySQL、微服务,服务容器化
微服务项目搭建
搭建一个小型项目,使用spring-boot,redis,mysql,mybatis,mybatis自动生成工具技术栈pom.xml文件依赖,spring-boot使用2.0.5.RELEASE版本,jdk1.8
https://github.com/nature-key/docker-service.git(项目地址)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
mybaits自动生成代码mavan配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/gen.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
gen.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
<classPathEntry location="/Users/wangxuan/.m2/repository/com/mysql/mysql-connector-j/8.0.32/mysql-connector-j-8.0.32.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 :false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://172.17.0.2/mysql" userId="root" password="123456">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.example.demo.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.demo.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="student"
domainObjectName="StudentPO">
</table>
</context>
</generatorConfiguration>
建表语句,根据表自动生成mybait代码
create table student(
id int(13),
name varchar(255),
pwd varchar(3)
);
服务配置application.yml
server:
port: 80
spring:
redis:
#redis容器名称
host: redis
port: 6379
datasource:
#ip使用mysql容器名称
url: jdbc:mysql://mysql:3306/mysql?userSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations:
- classpath:mapper/*.xml
接口实现
@RestController
public class DockerController {
@Autowired
StudentService studentService;
@RequestMapping("/docker/{id}")
public StudentPO getStudent(@PathVariable("id") Integer id) {
return studentService.getStudent(id);
}
@PostMapping("/docker/add")
public void addStudent(@RequestBody StudentPO studentPO) {
studentService.addStudent(studentPO);
}
}
微服务镜像构建
把微服务进行打包
编写Dockerfile文件
# 基础镜像使用java8,需要先构建
FROM java:8
# 作者
MAINTAINER wuyi
# 容器卷,指定临时文件的目录为/tmp
VOLUME /tmp
# 指定工作目录
WORKDIR /tmp
# 重命名可选操作,方便docker ps查看
add demo-0.0.1-SNAPSHOT.jar docker_service.jar
# 运行jar包
ENTRYPOINT ["java", "-jar", "docker_service.jar"]
# 暴露80端口作为服务端口
EXPOSE 80
jar包和dockerfile放到一个目录下,构建镜像
$ ls(同一个目录下)
Dockerfile demo-0.0.1-SNAPSHOT.jar
$ docker build -t docker_service:1.0 . (docker进行构建,-t指定标签)
$ docker images docker_service (查看构建结果)
REPOSITORY TAG IMAGE ID CREATED SIZE
docker_service 1.0 4bd38dc72cbb 10 hours ago 672MB
docker-compose 编排
docker-composer.yml
version: "3"
services:
macro_server:
image: docker_service:1.0
container_name: docker_service
ports:
- "8081:80"
volumes:
- /Users/wuyi/Downloads/docker/data:/data
# 依赖于redis和mysql,在启动本服务之前会先启动依赖的服务
depends_on:
- redis
- mysql
# Redis服务
redis:
container_name: redis
image: redis:latest
ports:
- "6379:6379"
volumes:
- /Users/wuyi/Downloads/docker/redis/redis.conf:/etc/redis/redis.conf
- /Users/wuyi/Downloads/docker/redis/data:/data
command: redis-server /etc/redis/redis.conf
# MySQL服务,上面的构建服务直接拷贝下来即可
mysql:
container_name: mysql
image: mysql:5.6
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'mysql'
MYSQL_USER: 'admin'
MYSQL_PASSWORD: 'admin'
volumes:
- /Users/wuyi/Downloads/docker/mysql/data:/var/lib/mysql
- /Users/wuyi/Downloads/docker/mysql/conf:/etc/mysql
command: --default-authentication-plugin=mysql_native_password
直接启动服务
$ ls
data docker-compose.yml mysql redis service tmp
$ docker compose up (启动)
$ docker ps (查看服务是否启动)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86d8fdd2e022 docker_service:1.0 "java -jar docker_se…" 10 hours ago Up 20 seconds 0.0.0.0:8081->80/tcp docker_service
dd5dbec730e9 mysql:5.6 "docker-entrypoint.s…" 10 hours ago Up 21 seconds 0.0.0.0:3307->3306/tcp mysql
72aabd353c52 redis:latest "docker-entrypoint.s…" 10 hours ago Up 21 seconds 0.0.0.0:6379->6379/tcp redis
数据库脚本执行
由于我们的数据库是新建的容器,脚本还没有生成,此时我们可以连接容器执行脚本,使用默认的数据库mysql,执行下面脚本
create table student(
id int(13),
name varchar(255),
pwd varchar(3)
);
验证服务是否在正常
查看redis是否有正产缓存数据
$ docker exec -it 72aabd353c52 bash
root@72aabd353c52:/data# redis-cli
127.0.0.1:6379> get 1
"{\"id\":1,\"name\":\"test\",\"pwd\":\"123\"}"