在和前端联调的过程中,然后每次电脑使用IDEA将服务启动后不能动,然后自己想改变代码后重启可能导致前端那边报错,所以为了给前端提供联调的服务的同时,我自己还可以正常工作,于是便想到了使用docker的方式,这样就可以达到了两全其美,何乐而不为。
Docker的三个基本概念:
Dockerfile:镜像构建的模板,描述镜像构建的步骤,通常是拉去一些文件和依赖;
image:镜像,一个文件,用来创建容器。
container:容器,一个可运行的镜像实例,里面运行着一个完整的操作系统,可以做一切你当前操作系统可以做的事情。
从我的理解对上述三者做一个类比:dockerfile就是一个混凝土配比说明书(原材料,步骤等),根据该说明书搅拌出混凝土(镜像),然后基于混凝土可以做成一个一个房间(容器),每个房间都是相互独立,生活着不同的人。
对于我们开发人员来说,Docker 可以做到:
编写本地代码
使用 Docker 将程序推送到测试环境
发现 bug 后在开发环境下修复,重新部署到测试环境测试
测试完成将代码合并到发布的代码分支
注意一点:一定要把windows的WSL开启后再安装,否则会导致docker启动不成功。
开放2375端口,勾上该选项
新增host:[ “0.0.0.0:2375”]
{
"debug": false,
"experimental": false,
"features": {
"buildkit": true
},
"hosts": [
"tcp://0.0.0.0:2375"
],
"insecure-registries": [],
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
老版本IDEA需要安装docker的插件,新版本的话不用安装直接使用
连接docker测试
Note:如果是本地的应用可以使用tcp://localhost:2375
连接;如果是局域网的其他机器可以使用局域网ipv4连接;如果是远程机器的话使用公网ip连接。
如上图中出现Connection successful
为成功标志
// 当使用ip访问时连接不成功的话在windows的admin权限终端窗口执行如下命令,端口代理
netsh interface portproxy add v4tov4 listenport=2375 connectaddress=127.0.0.1 connectport=2375 listenaddress= protocol=tcp
//对2375端口添加防火墙规则
netsh advfirewall firewall add rule name="docker_daemon" dir=in action=allow protocol=TCP localport=2375
说说小编的个人经历:完成了宿主机配置后,在局域网内的其他机器都是可以连接docker的,但是第二天早上再次连接就不行了,然后搞了好几天还是不行,突然一个偶然的机会又能重新连接上了。
//执行下述的命令 然后查看2375的端口
netsh interface portproxy show all
// 删除所有的端口代理
netsh interface portproxy delete v4tov4 listenaddress= listenport=2375
//重新执行端口代理
netsh interface portproxy add v4tov4 listenport=2375 connectaddress=127.0.0.1 connectport=2375 listenaddress= protocol=tcp
在浏览器中访问yourip:2375/version
测试,如果有数据返回那就是连接成功了。
构建测试项目
@RestController
public class TestController {
@GetMapping("/get/hello")
public String get(){
return "Hello World";
}
}
@SpringBootApplication
public class SpringBootWithDockerStarter {
public static void main(String[] args) {
SpringApplication.run(SpringBootWithDockerStarter.class, args);
}
}
在项目中添加Dockerfile文件
#这是基础镜像
FROM java:8
VOLUME /tmp
#复制jar包到镜像中,并且将名字改成app.jar
ADD ./target/SpringBootWithDocker-1.0-SNAPSHOT.jar DemoApp.jar
#在容器启动的时候运行命令,来启动我们的项目(这其实就是一段Linux命令,该命令可以在服务启动时加一些参数)
ENTRYPOINT ["sh", "-c", "java -jar DemoApp.jar"]
上述注意一点:该文件的放置位置会影响ADD后面的寻找jar包的路径,因为我后面在build镜像时出现找不到jar的报错,原因就是我将该Dockerfile放在了该项目的某一个文件夹下了。
项目结构如下:
添加maven的docker打包插件
org.springframework.boot
spring-boot-maven-plugin
com.spotify
docker-maven-plugin
1.2.2
build-image
package
build
${project.artifactId}
latest
${project.basedir}
http://127.0.0.1:2375
/
${project.build.directory}
${project.build.finalName}.jar
打包该应用程序
打包后会发现target目录下有jar包出现
配置Docker,此处配置要和pom文件最终生成的名字tag要保持一直
部署项目后使用localhost:8080/get/hello
访问返回数据即为成功
docker控制台中文乱码修复[可选]
//添加字符参数后 重启IDEA
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8
//添加Redis依赖
org.springframework.boot
spring-boot-starter-data-redis
//添加Redis配置
# spring default config
spring.redis:
host: your-ipv4 //宿主机的ip,如果你当前启动项目的docker没有安装redis,此处填localhost会报错
port: 6379
timeout: 5000
lettuce.pool:
# max connection number in connection poll, default number is 8
max-active: 20
# max wait time, default -1, this means there is no restrict. Unit: ms
max-wait: -1
# max idle connection number, default is 8
max-idle: 8
# min idle connection number, default is 0
min-idle: 0
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
public StringRedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
return stringRedisTemplate;
}
}
@RestController
@RequestMapping("/docker")
public class DockerController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/redis/set")
public String setRedisData(@RequestParam("value") String value){
String key = "docker";
stringRedisTemplate.opsForValue().set(key, value);
String strValue = stringRedisTemplate.opsForValue().get(key);
return strValue;
}
}
//重新打包然后点击docker进行运行
获取redis的密码
使用命令连接容器:docker exec -it containerName /bin/bash
使用命令连接redis客户端:redis-cli
使用auth {password}
授权成功 可以进行操作
在对spring-boot项目中修改配置之前,我们找到docker中redis在宿主机的端口号,这样我们才能保证连接成功。
修改项目中的配置
//添加Redis配置
# spring default config
spring.redis:
host: your-ipv4 //宿主机的ip,如果你当前启动项目的docker没有安装redis,此处填localhost会报错
port: 49153 //和上面图片的端口保持一致 <----第一处修改
password: redispw //添加密码 <----第二处修改
timeout: 5000
lettuce.pool:
# max connection number in connection poll, default number is 8
max-active: 20
# max wait time, default -1, this means there is no restrict. Unit: ms
max-wait: -1
# max idle connection number, default is 8
max-idle: 8
# min idle connection number, default is 0
min-idle: 0
//重新打包进行部署
Spring Boot 做单元测试,真心强悍!
阿里开源限流神器 Sentinel,接口限流好帮手!
SQL开发中为什么要尽量避免使用 IN 和 NOT IN 呢?
Vue+SpringBoot,一款企业级的进销存管理系统,星标2.7k
2.3W字,这可能是把Nginx讲得最全面的一篇文章了,建议收藏备用
60.2k!这是我见过最强的开源后台管理系统 !!
【性能测试】轻量级压测工具Hey
ES+Redis+MySQL,这个高可用架构设计太顶了!
回复【干货】获取精选干货视频教程
回复【加群】加入疑难问题攻坚交流群
回复【mat】获取内存溢出问题分析详细文档教程
回复【赚钱】获取用java写一个能赚钱的微信机器人
回复【副业】获取程序员副业攻略一份
好文请点赞+分享