当前位置: 首页 > news >正文

Docker + IDEA 一键部署!

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

官网安装文档:CentOS | Docker Docs

Docker 目前也是有很多版本的了:Linunx、MacOS、Windows图形化版本… 当然常见的是 Linux⭐

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 引擎】

# 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 常用命令!

#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 复制的加速器地址粘贴到配置文件中!

{"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应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!学习使用!

# 查看防火墙运行状态(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环境!

[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 需要借助魔法🪄🪄

# 启动临时容器,查看 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 退出容器!

[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 容器端口:主机端口

**云服务器记得要开放端口:安全组!**⭐

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 要确保 /宿主机文件 文件要存在,不然找不到目标资源报错;

# 使用官方 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 构建生成对应的镜像,启动容器运行即可!

# 使用当前目录下名为 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 基础命令配置:

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

# 配置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 dockerfirewall-cmd --zone=public --add-port=2375/tcp --permanent 

在这里插入图片描述
在这里插入图片描述

IDEA配置:

在这里插入图片描述

在这里插入图片描述

打开IDEA底部services服务: 存在一个Docker的运行区域,至此基本已经完成!

在这里插入图片描述
定义DockerFile【IDEA版本】

# 使用官方 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 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博客](

http://www.dtcms.com/a/398412.html

相关文章:

  • Rust开源HyperSwitch实战指南
  • Chrome性能优化指南
  • Chrome高危类型混淆0-Day漏洞(CVE-2025-10585)技术分析
  • 教做面点的网站广州百度竞价托管
  • 网站推广方案合肥房产网安居客
  • 【算法专题训练】24、单调栈
  • 【开题答辩全过程】以 IRWT考试预约系统为例,包含答辩的问题和答案
  • 在字典和列表相互嵌套的结构体中搜索指定元素
  • 文献阅读 | iMetaMed | FigureYa:一个标准化可视化框架,用于增强生物医学数据解释和研究效率
  • wordpress自由拖拽同ip网站做排名seo
  • 面向运动障碍患者的语音识别新突破:零样本实时专家混合自适应方法详解
  • 校园网站建设的维护制作触屏版网站开发
  • 零衍门户组件联邦模式:重新定义组件开发新体验!
  • 【Web前端|第一篇】HTML、CSS与JavaScript
  • 有手机网站了还要微网站吗所有的网站都要用htmlu做吗
  • 面向对象设计:构建可维护、可扩展的软件系统
  • 52.haproxy负载均衡
  • 什么是“智能体”?
  • 负载均衡式在线OJ项目复盘
  • 【Golang】数据设计模式
  • 新建免费网站软件关键词排名
  • 小迪安全v2023学习笔记(八十六讲)—— FridaHOOK证书提取SSL双向校验绕过
  • 律师事务所网站方案网站 建设 初期规划
  • 舒适化诊疗的关键支持:伟荣局部麻醉器械使用体验
  • Kanass入门到实战(1) - 安装教程
  • 【Linux系统】深入理解线程同步,实现生产消费模型
  • 【2025-系统规划与管理师】第六章:云资源规划
  • JDK17 新特性梳理
  • ZooKeeper源码分析与实战-模块一:基础篇
  • 网站建设 优势网站开发需求报告