Docker + IDEA 一键部署!
作为 3 Year全栈开发者相比对Docker一定很熟悉,镜像容器化技术,就不过多介绍了!
很久之前做的 Docker 入门学习Blog ,现在回头看发现有点过于臃肿,后期会总结一套常用命令;
很多人可能会说,Docker部署项目过时了,当然大公司都有自己成熟的运维系统 K8S,批量管理部署
但,很多小公司还是,简单的前后端分离项目,没有特别多的微服务管理,很多时候还是 Jar\Nginx,进行手动管理~
准备 SpringBoot
本篇Blog 主要介绍IDEA+Docker 一键部署,针对Java,not 前端 so 服务比较简单:
单纯SpringBoot + ControllerWEB服务Demo:没有多环境、数据库、Redis …
后面有时间也许做一个Docker 多环境部署不过网上资源很多,应该不需要;
准备Linux + Docker
官网安装文档:CentOS | Docker Docs
Docker 目前也是有很多版本的了:Linunx、MacOS、Windows图形化版本…当然常见的是 Linux⭐
docker--version#验证是否安装docker#Linux安装Docker 安装目录 /usr/local/wsmmkdir-m777wsm#创建目录wsm 默认权限777最高#移除系统中的历史版本Dockersudodnf removedocker\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 确认,适合脚本化执行)sudodnf-yinstalldnf-plugins-coresudodnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo#--------------------------------------------------------------------------------------------------#sudoyuminstall-yyum-utils#安装扩展资源 yum-utils 包sudoyum-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 独立工具)sudodnfinstalldocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin输入y确认安装,至此Docker已经安装完成!启动Docker:sudo systemctl start docker常用命令!
#Docker 启动命令systemctl stopdocker# 停止docker服务systemctl startdocker# 启动docker服务systemctl restartdocker# 重启docker服务sudosystemctl statusdocker# docker服务状态sudosystemctlenabledocker# 开机自启动!sudosystemctl disabledocker# 取消开机自启动!# 重新加载 Docker 配置修改了Docker配置文件如 /etc/docker/daemon.json 无需重启服务sudosystemctl daemon-reloadsudosystemctl restartdocker# 多数配置变更需配合重启配置阿里云镜像,帮助下载镜像速度!
修改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 表示已启动)sudosystemctl status firewalld# 查看防火墙规则(已开放的端口/服务)sudofirewall-cmd --list-all#需要启动 firewalld# “FirewallD is not running” 表示 firewalld 防火墙服务当前处于未启动状态sudosystemctl start firewalld#启动 firewalld 服务需管理员权限: sudosudosystemctl status firewalld#查看 firewalld 状态,确认是否已正常运行sudosystemctlenablefirewalld#设置 firewalld 开机自启 避免重启后失效# “Unit firewalld.service could not be found”,说明系统未安装 firewalld安装:# 关闭systemctl stop firewalld# 禁止开机启动防火墙systemctl disable firewalld# 禁用防火墙开机自启sudosystemctl disable firewalld# 关闭已开放的端口(永久关闭需加 --permanent,然后 reload)sudofirewall-cmd--zone=public --remove-port=8080/tcp# 临时开放端口(重启防火墙后失效)# 格式:sudo firewall-cmd --zone=public --add-port=端口号/协议(tcp/udp)sudofirewall-cmd--zone=public --add-port=8080/tcp# 临时开放 TCP 8080 端口# 永久开放端口【需重新加载规则生效】sudofirewall-cmd--zone=public --add-port=8080/tcp--permanent# 重新加载防火墙规则【使永久配置生效】sudofirewall-cmd--reload如何是云服务器还需要对端口进行开放:
常规Java -jar服务启动:
尝试使用常规方式启动:Java服务,发现并没有JDK快速用Docker 创建一个Java环境!
[root@hcss-ecs-1f62 wsm]# lsDemo_dev-1.0-SNAPSHOT.jar[root@hcss-ecs-1f62 wsm]# java -v-bash: java:commandnot found[root@hcss-ecs-1f62 wsm]# java -jar Demo_dev-1.0-SNAPSHOT.jar-bash: java:commandnot foundDocker 安装 JDK1.8 环境:
**方法一:使用官方 OpenJDK 8 镜像(推荐⭐⭐⭐ ** 详情可参考:DockerHub需要借助魔法🪄🪄
# 启动临时容器,查看 JDK 版本(以 slim 版为例)# openjdk:8-jdk:完整版 JDK 8(基于 Debian,包含完整工具链)# openjdk:8-jdk-slim:精简版(体积更小,移除非必要组件,推荐生产环境)# openjdk:8-jdk-alpine:基于 Alpine Linux(体积最小,约 100MB 左右)dockerrun--rmopenjdk:8-jdkjava-version# docker run 用于创建并启动一个容器 --rm 指定容器在退出后自动删除# 如果本地没有 openjdk:8-jdk 镜像 Docker 会先从 Docker Hub 自动拉取该镜像#【也可以拆解】dockerpull openjdk:8#拉取JDK(8)的镜像文件dockerrun-d-it--namejava-8 openjdk:8#运行进行产生容器;
此时安装的是一个JDK容器,所以Java 的命令也只能进入容器内部才可以使用!
docker exec -it [容器名] bash进入容器、exit退出容器!
[root@hcss-ecs-1f62 wsm]# docker exec -it java-8 bashroot@19fd2399b5a2:/# java -vUnrecognized option:-vError: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. root@19fd2399b5a2:/# java -versionopenjdk version"1.8.0_342"OpenJDK Runtime Environment(build1.8.0_342-b07)OpenJDK64-Bit Server VM(build25.342-b07, mixed mode)
如果你的 Java 源码(.java)或 JAR 包(.jar)在宿主机上,不想每次复制到容器内
可通过数据卷挂载将宿主机目录映射到容器,让容器直接使用宿主机的文件;
在主机目录存放Jar之后通过:exec进入容器直接运行,
web服务记得暴漏端口-p 容器端口:主机端口
**云服务器记得要开放端口:安全组!**⭐
dockerrm-fjava-8# 删除旧容器# 把宿主机的 /usr/local/wsm 挂载到容器的 /app 目录,容器映射主机端口5400dockerrun-d-it--namejava-8-p5400: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"]# 设置对外端口为 5400EXPOSE5400之后在DockerFile文件目录下,通过Build 构建生成对应的镜像,启动容器运行即可!
# 使用当前目录下名为 Dockerfile 的文件构建镜像,将镜像标记为 myapp:v1dockerbuild-fDockerfile-tmyapp:v1.# -f Dockerfile:指定构建时使用的配置文件为当前目录下的 Dockerfile# -t myapp:v1:给构建出的镜像打上 一个标签【名称+版本】myapp镜像名:v1版本标签# 基于 myapp:v1 镜像创建并启动一个容器,在后台运行,并将宿主机的 5400 端口映射到容器的 5400 端口dockerrun-d-p5400:5400 myapp:v1# -p 5400:5400:端口映射 宿主机端口:容器端口# -d:让容器在后台(守护模式)运行,不占用当前终端【准备工作】因为Docker 安装JDK,如果需要使用还需要,配置
挂载目录进入JDK容器内容才能执行;相对来说,通过DockerFile 就轻松很多:DockerFile 定义一组容器规则,通过
docker build生成对应的镜像资源;内部配置:数据库、服务依赖,
JDK、Java-jar包、端口映射、启动命令等等等…可以更加快速方便启动一个|多个相同服务容器!
Docker 基础命令配置:
dockerps-a# 查看当前所有容器dockerps# 查看当前所有【运行】容器# 批量删除镜像的容器 myapp:v1 为你的目标镜像名:标签dockerrm-f$(dockerps-aq--filter"ancestor=myapp:v1")dockerrm-f[容器名/容器ID]dockerrmi 镜像名:标签# 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:2375ExecStart=/usr/bin/dockerd-Hfd://--containerd=/run/containerd/containerd.sock# 添加: -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375# 重启Docker服务资源 开放Docker对外端口,如果防火墙关闭可以忽略【记得: 云服务安全组】systemctl daemon-reload systemctl startdockerfirewall-cmd--zone=public --add-port=2375/tcp--permanentIDEA配置:
打开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"?><projectxmlns="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实现一键部署