Docker + IDEA 一键部署!
作为 3 Year全栈开发者相比对Docker一定很熟悉,镜像容器化技术,就不过多介绍了!
很久之前做的 Docker 入门学习Blog ,现在回头看发现有点过于臃肿,后期会总结一套常用命令;
很多人可能会说,Docker部署项目过时了,当然大公司都有自己成熟的运维系统 K8S,批量管理部署
但,很多小公司还是,简单的前后端分离项目,没有特别多的微服务管理,很多时候还是 Jar\Nginx,进行手动管理~
准备 SpringBoot
本篇Blog 主要介绍IDEA+Docker 一键部署,针对Java
,not 前端 so 服务比较简单:
单纯SpringBoot + Controller WEB服务Demo: 没有多环境、数据库、Redis ...
后面有时间也许做一个Docker 多环境部署 不过网上资源很多,应该不需要;
准备Linux + Docker
Docker 目前也是有很多版本的了:Linunx、MacOS、Windows图形化版本... 当然常见的是 Linux⭐
sh
docker --version #验证是否安装docker
#Linux安装Docker 安装目录 /usr/local/wsm
mkdir -m 777 wsm #创建目录wsm 默认权限777最高
#移除系统中的历史版本Docker
sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#安装扩展资源 dnf-plugins-core 包,这是 dnf 的核心插件集,提供了额外的包管理功能
# sudo:以管理员(root)权限执行命令(安装软件需要管理员权限)
# dnf:CentOS 等系统默认的包管理器 用于软件的安装|更新|卸载等
# -y:自动确认安装操作(无需手动输入 y 确认,适合脚本化执行)
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#--------------------------------------------------------------------------------------------------#
sudo yum install -y yum-utils #安装扩展资源 yum-utils 包
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 配置docker 通过工具添加 Docker 官方源,确保后续能从官方渠道安装最新版的 Docker 引擎
# 第二条命令二选其一 建议使用第二个【阿里云镜像资源】
安装Docker 引擎】
sh
# docker-ce Docker 社区版(Community Edition)的核心引擎
# docker-ce-cli 命令行工具,提供 docker 命令如 docker run、docker ps 等
# containerd.io 容器运行时(container runtime),是 Docker 依赖的底层组件
# docker-buildx-plugin Docker 官方的构建扩展插件,增强了 docker build 命令的功能
# docker-compose-plugin Compose 的插件化实现(替代传统的 docker-compose 独立工具)
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

输入 y
确认安装,至此Docker已经安装完成! 启动Docker: sudo systemctl start docker
常用命令!
sh
#Docker 启动命令
systemctl stop docker # 停止docker服务
systemctl start docker # 启动docker服务
systemctl restart docker # 重启docker服务
sudo systemctl status docker # docker服务状态
sudo systemctl enable docker # 开机自启动!
sudo systemctl disable docker # 取消开机自启动!
# 重新加载 Docker 配置修改了Docker配置文件如 /etc/docker/daemon.json 无需重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker # 多数配置变更需配合重启
配置阿里云镜像,帮助下载镜像速度!
修改daemon配置文件,来使用加速器: vim /etc/docker/daemon.json
复制的加速器地址粘贴到配置文件中!
json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
重启Docker: systemctl restart docker
检查Docker配置: docker info
服务器对外暴漏端口 Port
关闭服务器防火墙🧱
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!学习使用!
sh
# 查看防火墙运行状态(active/running 表示已启动)
sudo systemctl status firewalld
# 查看防火墙规则(已开放的端口/服务)
sudo firewall-cmd --list-all #需要启动 firewalld
# "FirewallD is not running" 表示 firewalld 防火墙服务当前处于未启动状态
sudo systemctl start firewalld #启动 firewalld 服务需管理员权限: sudo
sudo systemctl status firewalld #查看 firewalld 状态,确认是否已正常运行
sudo systemctl enable firewalld #设置 firewalld 开机自启 避免重启后失效
# "Unit firewalld.service could not be found",说明系统未安装 firewalld安装:
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 禁用防火墙开机自启
sudo systemctl disable firewalld
# 关闭已开放的端口(永久关闭需加 --permanent,然后 reload)
sudo firewall-cmd --zone=public --remove-port=8080/tcp
# 临时开放端口(重启防火墙后失效)
# 格式:sudo firewall-cmd --zone=public --add-port=端口号/协议(tcp/udp)
sudo firewall-cmd --zone=public --add-port=8080/tcp # 临时开放 TCP 8080 端口
# 永久开放端口【需重新加载规则生效】
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重新加载防火墙规则【使永久配置生效】
sudo firewall-cmd --reload
如何是云服务器还需要对端口进行开放:

常规 Java -jar
服务启动:
尝试使用常规方式启动:Java
服务,发现并没有JDK 快速用Docker 创建一个Java环境!
sh
[root@hcss-ecs-1f62 wsm]# ls
Demo_dev-1.0-SNAPSHOT.jar
[root@hcss-ecs-1f62 wsm]# java -v
-bash: java: command not found
[root@hcss-ecs-1f62 wsm]# java -jar Demo_dev-1.0-SNAPSHOT.jar
-bash: java: command not found
Docker 安装 JDK1.8 环境:
**方法一:使用官方 OpenJDK 8 镜像(推荐⭐⭐⭐ ** 详情可参考:DockerHub
需要借助魔法🪄🪄
sh
# 启动临时容器,查看 JDK 版本(以 slim 版为例)
# openjdk:8-jdk:完整版 JDK 8(基于 Debian,包含完整工具链)
# openjdk:8-jdk-slim:精简版(体积更小,移除非必要组件,推荐生产环境)
# openjdk:8-jdk-alpine:基于 Alpine Linux(体积最小,约 100MB 左右)
docker run --rm openjdk:8-jdk java -version
# docker run 用于创建并启动一个容器 --rm 指定容器在退出后自动删除
# 如果本地没有 openjdk:8-jdk 镜像 Docker 会先从 Docker Hub 自动拉取该镜像
#【也可以拆解】
docker pull openjdk:8 #拉取JDK(8)的镜像文件
docker run -d -it --name java-8 openjdk:8 #运行进行产生容器;
此时安装的是一个JDK容器,所以Java 的命令也只能进入容器内部才可以使用!
docker exec -it [容器名] bash
进入容器、exit
退出容器!
sh
[root@hcss-ecs-1f62 wsm]# docker exec -it java-8 bash
root@19fd2399b5a2:/# java -v
Unrecognized option: -v
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
root@19fd2399b5a2:/# java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)

如果你的 Java 源码(.java
)或 JAR 包(.jar
)在宿主机上,不想每次复制到容器内
可通过 数据卷挂载 将宿主机目录映射到容器,让容器直接使用宿主机的文件;
在主机目录存放 Jar
之后通过:exec
进入容器直接运行,
web服务记得暴漏端口-p 容器端口:主机端口
**云服务器记得要开放端口:安全组!**⭐
sh
docker rm -f java-8 # 删除旧容器
# 把宿主机的 /usr/local/wsm 挂载到容器的 /app 目录,容器映射主机端口5400
docker run -d -it --name java-8 -p 5400:5400 -v /usr/local/wsm:/app openjdk:8
# -v 旧数据卷名称:容器内路径
# -p 新增的端口映射

方法二: 需要基于特定 Linux 发行版CentOS、Ubuntu
手动安装,可通过 Dockerfile
自定义环境;下述!
DockerFile 管理部署:
目前最常用的部署方式: 使用 Dockerfile 启动一个包含 JDK 的 Docker 容器,
需通过 Dockerfile 定义镜像构建步骤,再通过 docker build 构建镜像并运行容器
,
在DockerFile 中根据规则定义一个 容器环境: JDK、Java-jar包、端口映射、启动命令
等等等...
- 甚至说,一口气在内部配置:数据库 等服务依赖,不过因为数据库一般需要更频繁操作,不建议放在一起进行管理!
DockerFile 基础配置!
下面是一个简答的DockerFile 的基本配置文件!
注意: COPY dockerDemo.jar /app.jar
要确保 /宿主机文件
文件要存在,不然找不到目标资源报错;
shell
# 使用官方 OpenJDK 基础镜像(推荐 Alpine 精简版)
# 或 openjdk:17-alpine 根据需求选择JDK版本;
FROM openjdk:8-jdk-alpine
# 作者签名
MAINTAINER WSM
# copy复制 /宿主机文件 /镜像容器目录 【可以使用 *.jar 表示任意文件名】
COPY dockerDemo.jar /app.jar
# 设置环境变量(可选)
# ENV JAVA_OPTS="-Xms512m -Xmx1024m"
# ENV TZ=Asia/Shanghai # 配置时区
# 执行 java -jar 命令 RUN:构建镜像时就执行此行
ENTRYPOINT ["java","-jar","/app.jar"]
# 设置对外端口为 5400
EXPOSE 5400
之后在DockerFile
文件目录下,通过Build 构建生成对应的镜像,启动容器运行即可!
bash
# 使用当前目录下名为 Dockerfile 的文件构建镜像,将镜像标记为 myapp:v1
docker build -f Dockerfile -t myapp:v1 .
# -f Dockerfile:指定构建时使用的配置文件为当前目录下的 Dockerfile
# -t myapp:v1:给构建出的镜像打上 一个标签【名称+版本】myapp镜像名:v1版本标签
# 基于 myapp:v1 镜像创建并启动一个容器,在后台运行,并将宿主机的 5400 端口映射到容器的 5400 端口
docker run -d -p 5400:5400 myapp:v1
# -p 5400:5400:端口映射 宿主机端口:容器端口
# -d:让容器在后台(守护模式)运行,不占用当前终端

-
【准备工作】 因为Docker 安装JDK,如果需要使用还需要,配置
挂载目录
进入JDK容器内容才能执行; -
相对来说,通过DockerFile 就轻松很多: DockerFile 定义一组容器规则,通过
docker build
生成对应的镜像资源;内部配置: 数据库、服务依赖,
JDK、Java-jar包、端口映射、启动命令
等等等...可以更加快速方便启动一个|多个相同服务容器!
Docker 基础命令配置:
sh
docker ps -a # 查看当前所有容器
docker ps # 查看当前所有【运行】容器
# 批量删除镜像的容器 myapp:v1 为你的目标镜像名:标签
docker rm -f $(docker ps -aq --filter "ancestor=myapp:v1")
docker rm -f [容器名/容器ID]
docker rmi 镜像名:标签
# Docker删除镜像
IDEA 配置 Docker 一键发布!
上述已经是大部分的公司部署流程,但是还是需要频繁的操作,远程连接:
突然想到,IDEA 貌似已经集成了SSH,那么是不是可以在一个软件中操作,打包部署! 这样可以省去很多事情,还很高级!
Docker 配置:
最后确保:可以对外访问, 在浏览器输入 http://1.94.40.112:2375/version
sh
# 配置docker远程连接端口
vi /usr/lib/systemd/system/docker.service
# 找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 添加: -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
# 重启Docker服务资源 开放Docker对外端口,如果防火墙关闭可以忽略【记得: 云服务安全组】
systemctl daemon-reload
systemctl start docker
firewall-cmd --zone=public --add-port=2375/tcp --permanent
IDEA配置:


打开IDEA底部services服务: 存在一个Docker的运行区域,至此基本已经完成!
定义DockerFile【IDEA版本】
dockerfile
# 使用官方 OpenJDK 基础镜像(推荐 Alpine 精简版)
# 或 openjdk:17-alpine 根据需求选择JDK版本;
FROM openjdk:8-jdk-alpine
# 容器内切换操作目录
VOLUME /usr/local
# copy复制 /宿主机文件 /镜像容器目录
# 将目标宿主target目录下容器 复制 /usr/local 容器目录
ADD ./target/demodev-1.0-SNAPSHOT.jar demodev.jar
# 设置环境变量(可选)
# ENV JAVA_OPTS="-Xms512m -Xmx1024m"
# ENV TZ=Asia/Shanghai # 配置时区
# 执行 java -jar 命令 RUN:构建镜像时就执行此行
ENTRYPOINT ["java","-jar","demodev.jar"]
配置Maven项目:POM依赖Docker插件: 刷新maven,发现多了一个docker插件
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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demodev</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Maven全局配置 -->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- 集成一个父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<!-- spring-boot对一些开发所需的资源Jar有自动的管理都存在在对应的 starter-xxx管理.
这里使用 spring-boot-starter-web 引入所有的web组件!
一切都由SpringBoot帮你做好了。
-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 使SpringBoot工程支持,项目打成jar包,直接在目标服务器执行即可 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.6.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 制作docker镜像的maven插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!-- 定义插件在 Maven 生命周期的哪个阶段执行什么操作 -->
<!-- 指定插件在 Maven 的 package 阶段 指定执行的插件目标为 build -->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 镜像名称、前缀、项目名 注意符合镜像名规则字母小写、数字 否则报错,所以此处不建议使用项目名-->
<!-- <imageName>${project.artifactId}</imageName> -->
<imageName>demodev</imageName>
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- Dockerfile的位置,project.basedir表示项目目录下 -->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!-- 远程Docker的地址 -->
<dockerHost>http://1.94.40.112:2375</dockerHost>
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 表示的target文件夹 -->
<directory>${project.build.directory}</directory>
<!-- 表示打出来的JAR包-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
镜像名规范: imageName
须符合 Docker 命名规则 小写、数字等,否则会报 Schema specific part is opaque
错误
如此直接:Maven Package 打包,即可实现自动将资源推送至服务器,docker镜像:

最终在IDEA中,可以清楚观察到刚才打包的镜像资源!
构建容器:
IDEA 通过镜像------构建------容器: 实现轻松的,在IDEA中部署发布项目!如果代码更新,仅需要重新打包!启动镜像!

本篇没有代码Demo,且不同人的操作系统可能存在差异,倒霉踩坑! 可以参考下面大佬的blog!👋👋
注意:2375端口是:危险端口,建议启动防火墙使用协议进行通信!测试学习临时使用之后,需关闭!🧱🧱🧱
学习参考资料🔗🔗
Linux使用Docker部署若依 保姆级教程
docker从安装到部署项目,一篇文章教会你_docker部署-CSDN博客
IDEA集成Docker实现一键部署 - 哔哩哔哩 亲自使用,好用附带视频!IDEA集成Docker实现一键部署
Docker安全开放远程访问连接权限_docker开启远程访问-CSDN博客\](