一、目标
在win10系统的docker环境中,实现springboot服务的容器部署,并使容器连接宿主机的mysql服务
二、准备工作
- 安装docker desktop for windows(略)
- 本地安装mysql服务并启动(略)
- 准备好idea + maven + springboot + mysql的demo工程
三、使idea连上docker服务
- 在docker desktop中开启端口(不安全)并重启
- 用企业版的idea或者安装idea的docker插件,配置连接信息
四、工程代码
1、在pom文件中添加docker插件
<properties>
<docker.image.name>XXX</docker.image.name>
<docker.remote.address>http://127.0.0.1:2375</docker.remote.address>
<docker.dockerfile.dir>src/main/docker</docker.dockerfile.dir>
</properties>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<!-- 这里是最终生成的docker镜像名称 -->
<imageName>${docker.image.name}</imageName>
<!-- docker远程服务器地址 -->
<dockerHost>${docker.remote.address}</dockerHost>
<!--设置目录,该目录下放dockerfile-->
<dockerDirectory>${docker.dockerfile.dir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
- 在pom文件中配置的dockerfile目录下添加dockerfile文件,文件名为Dockerfile
#指定基础镜像,在其上进行定制
FROM openjdk:11
#维护者信息
MAINTAINER XXX <xxx@gmail.com>
#这里的 /tmp 目录就会在运行时自动挂载为匿名卷,任何向 /tmp 中写入的信息都不会记录进容器存储层
VOLUME /tmp
#复制上下文目录下的target/xxx-0.0.1-SNAPSHOT.jar 到容器里
COPY xxx-0.0.1-SNAPSHOT.jar app.jar
#声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8080
#指定容器启动程序及参数 <ENTRYPOINT> "<CMD>"
#java.security.egd=file:/dev/./urandom 的目的是为了缩短 Tomcat 启动的时间。
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- 更改mysql配置
- 在powershell中输入ipconfig,查到win10安装docker desktop后生成的一个转发ip(与wsl和docker的网络知识相关)
- 将IPv4 地址配到springboot的配置文件中,因为服务最终运行在容器中,如果mysql的url配置为localhost:3306肯定无法访问到宿主机的mysql服务,所以需要这个适配器做转发
以太网适配器 vEthernet (Default Switch):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::84a2:9d3a:42e4:6dab%47
IPv4 地址 . . . . . . . . . . . . : 172.19.0.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.19.0.1:3306/demo?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=true
username: root
password: XXXXXX
- 构建镜像并推送到远程仓库
mvn package docker:build -DskipTests
备注:构建成功后,会在docker desptop中看到对应的镜像,也可以通过docker命令查看
- 部署容器
docker run -p 8080:8080 --name <容器名> <镜像名>
五、问题记录
- 在第三步使idea连上docker服务的时候,TCP socket输入tcp://localhost:2375总是无法连接成功
解决方法参考:blog.csdn.net/ET113142943…
- 容器访问宿主机mysql总是失败
解决方案:如4.3中描述,需要适配器做转发
六、总结
- 使用docker的确能使打包、部署、运维等操作更加便捷
- docker的网络知识很总要,需要理解并熟练使用
- 关于idea插件等客户端远程连接docker的方案在生产环境需要用认证信息保证环境安全