首先需要确保目标服务器上:
使用的IDEA 版本为 IntelliJ IDEA 2021.2.2 (Ultimate Edition)
已安装简中语言包: Chinese (Simplified) Language Pack / 中文语言包
新版本IDEA已经捆绑安装了docker插件,如果是旧版需要手动安装
按Ctrl+Alt+S打开设置界面,选择 “构建、执行、部署" - “Docker” 打开docker插件管理界面
修改连接配置后插件会自动尝试连接,如果成功则会有如下提示
配置成功后点确定。
现在在底部工具按钮的“服务”中即可看到配置好的连接,双击连接即可查看docker中的容器、镜像等。
为了理解自动部署都干了什么,有必要先了解手动部署的过程。
点开IDEA侧边栏工具Maven按钮 ,点开生命周期,双击 clean 执行完毕后再双击 package即可
在项目根目录(与pom.xml文件路径相同)新建一个文件,命名为“Dockerfile"(无后缀名),docker build命令会在执行名令的当前目录寻找这个文件,并将它的内容作为打包的操作步骤。
使用记事本或其他文本工具打开该文件,填入如下内容
# 使用openjdk:15 作为基础镜像
FROM openjdk:15
# 设置临时文件夹
VOLUME /tmp
# 将打包好的war文件复制到镜像根目录
ADD target/包名.war app.war
# 配置时区,否则打印出的日志时间会差8h
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 配置运行参数 这里的参数是为了解除jdk新版本的反射限制
ENV JAVA_OPTS='--add-opens java.base/java.lang=ALL-UNNAMED'
# 启动java程序命令 --spring.profiles.active=prod -> 使用 application-prod 文件作为springboot的启动配置
ENTRYPOINT java ${JAVA_OPTS} -jar /app.war --spring.profiles.active=prod
详细解释:
因此我们需要把 Dockerfile文件 和 包名.war 文件 ,上传到服务器的某一目录下,并且保证上述的相对路径关系,然后在该目录下执行如下命令
docker build -t 镜像名称 .
其中
因为我们用到了基础镜像,如果本地不存在该镜像,服务器会先自动下载它,所以初次运行会比较慢。
执行成功后应该可以在IDEA的”镜像“折叠中看到该镜像和用到的基础镜像,或者也可以使用该命令查看
docker images
执行命令
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像名称
详细解释
然后执行如下命令查看运行中的容器
docker ps
应该可以看到有指定名称的容器在运行了,此时使用 http://服务器ip:宿主机端口 应该就可以访问到该程序接口
在宿主机执行 ifconfig 命令,可以看到一个名为 docker0 的网络 它的 inet ip 应该是形如: 172.17.0.1 这样的,对于运行中的每一个容器而言,使用该ip+上述的“容器端口”,即可访问到其他容器的对外服务,例如:
这个ip是一个固定的内网ip,不受部署的服务器ip影响,也不受docker服务重启(每个容器的ip会变化)的影响。
我们需要添加一个 docker-maven 插件来一键执行手动部署中的 第 1-2 步,但需要沿用之前的Dockerfile文件。
打开pom.xml文件,找到 build 标签中的 plugins标签,在其中添加如下内容(注意如果插件重名请自行删除)
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<configuration>
<skip>trueskip>
configuration>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>1.2.2version>
<executions>
<execution>
<id>build-imageid>
<phase>packagephase>
<goals>
<goal>buildgoal>
goals>
execution>
executions>
<configuration>
<dockerHost>https://服务器ip:2376dockerHost>
<imageName>镜像名称imageName>
<dockerCertPath>证书文件的存放路径dockerCertPath>
<forceTags>trueforceTags>
<dockerDirectory>${project.basedir}dockerDirectory>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.warinclude>
resource>
resources>
configuration>
plugin>
注意修改其中的 服务器ip、镜像名称、证书文件存放路径;服务器ip和证书路径,与链接docker时的配置完全一致,镜像名称的含义与docker build 步骤中的镜像名称含义一致。
修改后注意重新加载使配置生效
配置完成后再执行手动部署的第一步时,会连带第二步也一起执行(执行到打包好docker镜像)
接下来我们把原来的第一步和第三部做成脚本来一键执行
成功打包的话应该在控制台看到类似内容
[INFO] Built 镜像名称
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:33 min
[INFO] Finished at: 2021-09-18T15:01:55+08:00
[INFO] ------------------------------------------------------------------------
以上配置完成之后,每次修改代码后,将两个脚本分别执行一次即可完成重新部署。