本文实现实现一个简单的springboot+mysql应用(基于用户访问情况进行ip计数,并存储到mysql数据库),为该应用构建docker镜像,实现docker容器部署,以及与mysql容器的对接
Docker 安装
直接安装 docker desktop for windows即可,其中还会包含了docker compose。可通过
docker-compose version
来验证结果,一般会输出如下信息:
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.1c 28 May 2019
docker image相关命令:
-
docker images
查看本地所有镜像 -
docker rmi XXX
删除制定名称的镜像
docker container 容器相关命令:
-
docker ps -a
显示全部容器 -
docker ps
显示当前运行中容器 -
docker start mysql
再次启动之前名称为mysql的容器 -
docker stop mysql
停止msyql容器
编写Visitor应用
对于多模块应用,可以手工在创建model时,制定将路径放置到非工程根目录下,例如创建名称为
test
的module时,手工修改路径为
D:\dev2\project\backends\docker\test
则此时会增加一个目录层级docker,以便于在同目录增加nginx、mysql等目录进行统一管理,实现docker化改造
当前父工程为backends,则模块创建完成后,其pom.xml文件示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>backends</artifactId>
<groupId>pers.techlmm</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dockercomp</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
该程序基于jpa来实现自动创建ddl语句,实现的功能是根据访问值ip进行访问次数计数:
@RestController
@RequestMapping("/api/v")
public class VisitorController {
@Autowired
private VisitorRepository repository;
@RequestMapping("/")
public String index(HttpServletRequest request) {
String ip = request.getRemoteAddr();
Visitor visitor = repository.findByIp(ip);
if (visitor == null) {
visitor = Visitor.builder().ip(ip).times(1L).build();
} else {
// 对访问次数+1
visitor.setTimes(visitor.getTimes() + 1);
}
repository.save(visitor);
return "ip " + ip + "access times:" + visitor.getTimes();
}
}
最终,通过
curl http://localhost:8080/api/v/
或者浏览器方式访问后,就会得到类似如下的结果:
ip 0:0:0:0:0:0:0:1access times:7
同时,也可以通过TestRestTemplate来实现验证
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
@Slf4j
public class VisitorControllerTest {
@Autowired
TestRestTemplate restTemplate;
// 构建请求路径
URI uri = UriComponentsBuilder.fromUriString("/api/v/").build().toUri();
@Test
void indexTest() {
String response = restTemplate.getForObject(uri, String.class);
log.info(response);
}
}
创建docker profile
因为部署到docker环境后,数据库链接模式有变化,需要增加一个
application-docker.properties
文件,具体内容如下:
# docker模式是,数据库地址需要替换为docker容器来实现引用,此处的mysql-test是通过docker run的 --link 来指定
spring.datasource.url=jdbc:mysql://mysql-test:3306/test
spring.datasource.username=root
spring.datasource.password=goodpine
本地打包及运行
现在尝试本地打包模式,通过在pom.xml文件路径(如D:\dev2\project\backends\dockercomp\app>)中,执行
mvn clean package -Dmaven.test.skip
即可完成打包,打包后的可执行jar会放到 target目录下,例如
app\target\dockercomp-1.0-SNAPSHOT.jar
直接在命令行执行
java -jar dockercomp-1.0-SNAPSHOT.jar
即可启动该服务。
创建Dockerfile文件
在pom.xml文件同目录下,增加名称为
Dockerfile
文件:
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
#注意需要增加-Dspring.profiles.active=docker,来制定docker部署模式下的配置信息
ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","/app.jar"]
上述文件意思是将target下的所有jar,拷贝到app.jar中,并且制定运行时profile为docker对应的配置。
Docker 部署
启动mysql docker服务
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=goodpine -e MYSQL_DATABASE=test -p 3306:3306 -d mysql
启动完成后,可通过
docker ps
查看容器运行情况
visitor-docker镜像构建
在spring工程根目录下,执行
docker build . -t visitor-docker
,其中
-t xxx
是指为镜像打上标签,该命令一般得到如下结果:
E:\dev\2try\backends\dockercomp\app>docker build . -t visitor-docker
Sending build context to Docker daemon 39.79MB
Step 1/5 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/5 : ARG JAR_FILE=target/*.jar
---> Using cache
---> 25bff168a2b2
Step 3/5 : COPY ${JAR_FILE} app.jar
---> bac68174227c
Step 4/5 : EXPOSE 8080
---> Running in 904bc1180df7
Removing intermediate container 904bc1180df7
---> 1f234b6dbf72
Step 5/5 : ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","/app.jar"]
---> Running in 0a2a351a3225
Removing intermediate container 0a2a351a3225
---> 2ee38fd2463a
Successfully built 2ee38fd2463a
Successfully tagged visitor-docker:latest
镜像构建完成后,即可通过
docker images
来查看当前本机所有镜像了:
PS C:\Users\123> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
visitor-docker latest 156aa35a495c 46 seconds ago 145MB
mysql latest 30f937e841c8 4 weeks ago 541MB
redis latest f9b990972689 7 weeks ago 104MB
mongo latest 3f3daf863757 8 weeks ago 388MB
nginx latest 602e111c06b6 8 weeks ago 127MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
openjdk 8-jdk-alpine a3562aa0b991 13 months ago 105MB
sath89/oracle-12c latest ee3351d51185 22 months ago 5.7GB
运行docker应用
最后,通过下面命令运行应用即可:
docker run --link mysql-test:mysql-test --name visitorapp -p 8080:8080 visitor-docker
特别说明:**特别注意增加上该link,否则无法连接到指定数据库。**link X:Y 中,X指的是为运行中的镜像名称,此处为上面启动的mysql数据库服务的别名;Y为配置文件中引用的数据库镜像别名
到此,一个基于mysql的springboot应用docker部署已经完成,试验过程中,碰到了很多坑,例如–link等,希望对你有帮助。
参考资料
-
多模块maven工程,上传到github以后,再次下载需要先通过
mvn idea:module
运行一遍,然后通过
maven
窗口,刷新下全部module,即可实现在idea中识别各个module -
删除镜像,可先通过
docker rm XXX
删除对应的容器,再通过
docker rmi visitor-docker
删除对应的镜像。 - http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html
- https://docs.docker.com/compose/install/
- https://spring.io/guides/gs/spring-boot-docker/