docker部署springboot初探

76 阅读2分钟

一、目标

在win10系统的docker环境中,实现springboot服务的容器部署,并使容器连接宿主机的mysql服务

二、准备工作

  1. 安装docker desktop for windows(略)
  2. 本地安装mysql服务并启动(略)
  3. 准备好idea + maven + springboot + mysql的demo工程

三、使idea连上docker服务

  1. 在docker desktop中开启端口(不安全)并重启

image.png

  1. 用企业版的idea或者安装idea的docker插件,配置连接信息

image.png

四、工程代码

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>
  1. 在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"]

  1. 更改mysql配置
    1. 在powershell中输入ipconfig,查到win10安装docker desktop后生成的一个转发ip(与wsl和docker的网络知识相关)
    2. 将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
  1. 构建镜像并推送到远程仓库
mvn package docker:build -DskipTests

备注:构建成功后,会在docker desptop中看到对应的镜像,也可以通过docker命令查看

  1. 部署容器
docker run -p 8080:8080 --name <容器名> <镜像名>

五、问题记录

  1. 在第三步使idea连上docker服务的时候,TCP socket输入tcp://localhost:2375总是无法连接成功

解决方法参考:blog.csdn.net/ET113142943…

  1. 容器访问宿主机mysql总是失败

解决方案:如4.3中描述,需要适配器做转发

六、总结
  1. 使用docker的确能使打包、部署、运维等操作更加便捷
  2. docker的网络知识很总要,需要理解并熟练使用
  3. 关于idea插件等客户端远程连接docker的方案在生产环境需要用认证信息保证环境安全