使用docker构建java应用

1、docker简介

Docker是一个开源的容器化平台,可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术,可以使应用程序在不同的操作系统和环境中具有一致的运行方式。

使用Docker带来的好处包括:

  1. 简化应用程序部署和管理:Docker可以将应用程序及其依赖项打包成一个容器,使得部署应用程序变得简单和可重复。容器可以在不同的环境中运行,无论是开发、测试还是生产环境,都可以保持一致性。

  2. 高效的资源利用:Docker容器是轻量级的,相比于传统的虚拟机更加节省资源。多个容器可以在同一台物理机上运行,有效地利用系统资源,提高硬件利用率。

  3. 快速启动和停止:Docker容器可以在几秒钟内启动和停止,相比于传统虚拟机需要启动整个操作系统的时间更短,提供了更快的开发和部署速度。

  4. 环境一致性:Docker容器可以确保应用程序在不同的环境中具有一致的运行方式。开发人员可以在本地构建和测试容器,然后将其部署到其他环境中,无需担心环境差异导致的问题。

  5. 更好的可移植性:通过Docker容器,应用程序和其依赖项可以被打包成一个独立的、可移植的单元。这使得应用程序可以在不同的操作系统和云平台上运行,实现跨平台部署。

最实际的情况是,当一个应用需要使用第三方工具,例如mysql,mongodb,redis,minio等等。如果使用传统的方式,需要同时应付不同的运行环境,例如windows,linux,安装方法差异性很大,即使是linux,根据不同发行版本,选择使用yum,apt-get等工具。如果选择docker,则完全屏蔽安装环境的差异性。做到同样的配置文件,一键下载安装部署,非常方便。

2、国内Docker镜像源集体停止服务

自本月月初,大量网友反馈docker被封禁,无法拉取镜像。笔者一开始以为是网络问题,然而长时间都是显示拉取超时。当切换到国外服务器,使用正常。笔者尝试先从国外服务器拉取保存镜像,再将镜像下载到本地环境进行读取,也能解决问题。

当然,也可以选择国内的一些镜像源,编辑/etc/docker/daemon.json文件(没有则新建

{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://dockerhub.azk8s.cn", "https://mirror.ccs.tencentyun.com", "https://registry.cn-hangzhou.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn" ] }

3、使用docker构建java应用

3.1、安装java运行环境

我们可以先在本地打包java应用,然后将可执行jar包交给docker运行。编辑Dockerfile文件,如下:

FROM ubuntu:20.04ENV JDK_VERSION 17
ENV JDK_HOME /usr/local/java
ENV URL "https://download.java.net/openjdk/jdk17/ri/openjdk-17+35_linux-x64_bin.tar.gz"
RUN mkdir -p  $JDK_HOME
RUN apt-get update && \apt-get install -y wget && \wget $URL && \tar -zxvf openjdk-17+35_linux-x64_bin.tar.gz -C $JDK_HOMEENV JAVA_HOME=$JDK_HOME/jdk-17
ENV PATH=$PATH:$JAVA_HOME/binWORKDIR /appCMD java -jar webadmin.jar --spring.profiles.active=dev

这里选择镜像基础是ubuntu,也可以直接使用openjdk17的镜像。

dockerfile主要步骤:

  1. 使用apt-get下载jdk17压缩包文件
  2. 解压缩jdk安装包
  3. 设置java环境变量和app工具目录
  4. 使用cmd shell模式启动java应用

这里不直接把java项目可执行jar包直接打包到docker镜像,因为这样不便于代码更新。通过卷映射宿主文件目录到docker容器内部工作目录。

创建镜像

docker build -t myjdk .

实例化容器

docker run -d -v ./web/:/app  --network web -p 8001:8001 --name admin myjdk

参数说明:

  • -d:(deattach)以后台模式运行
  • -v: 以当前web目录(jar包及依赖包)映射到容器内部app工作目录
  • -p:宿主端口8001映射到容器内部8001端口
  • --name:容器命名
  • --network:绑定网络

3.2、使用mysql容器

# 使用官方MySQL镜像作为基础镜像
FROM mysql:latest# 将SQL脚本复制到容器中的某个位置
COPY admin.sql /docker-entrypoint-initdb.d/ENV MYSQL_DATABASE=admin
ENV MYSQL_PASSWORD=123456
ENV MYSQL_ROOT_PASSWORD=123456# 创建一个数据卷挂载点
VOLUME /var/lib/mysql# 暴露MySQL的默认端口
EXPOSE 3306

文件里使用copy命令,用于将创库创表语句复制到mysql容器并在创建容器的时候初始化。也可以在生成容器后,使用docker cp命令,如下

#拷贝宿主文件到容器内部
docker cp script.sql my-mysql:/script.sql
#进入mysql容器内部
docker exec -it my-mysql mysql -uroot -p123456
#执行sql语句
source /script.sql

启动mysql容器

docker run -p 3306:3306 --name mysql --restart=always --network web
-v /usr/local/mysql/log:/var/log/mysql \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d my-mysql

3.3、使用网络联通各个容器

Docker提供了几种不同的网络模式来实现容器之间的通信和与外部网络的连接。以下是常见的几种Docker网络方式:

  1. 桥接网络(Bridge Network):默认情况下,Docker使用桥接网络来连接容器。在桥接网络中,Docker守护进程会创建一个虚拟的网桥,每个容器会分配一个唯一的IP地址,并通过网桥与主机相连。容器之间可以通过IP地址相互通信,也可以通过容器名称进行访问。

  2. 主机网络(Host Network):在主机网络模式中,容器与主机共享网络命名空间,即它们使用同一个网络接口和IP地址。这意味着容器可以访问主机上的所有网络服务,而不需要进行端口映射。主机网络模式性能更好,但容器之间的隔离性较差。

  3. 网络连接(Container Network Connection):容器网络连接是通过连接现有容器的方式来实现网络通信。在这种模式下,新创建的容器会加入一个已存在的容器的网络命名空间,它们可以通过localhost相互通信,共享网络接口。

对于新版本的docker,官方推荐使用网络的方式,如下:

docker network create web

在java项目的jdbc配置文件,使用docker-mysql-container-name替换成mysql的docker容器名字即可访问mysql。

jdbc:mysql://docker-mysql-container-name/yourDatabaseName

 然后在创建jdk,mysql容器的run命令,统一增加--network web参数即可。

4、使用docker-compose一键部署

4.1、Docker Compose简介

Docker Compose是一个用于定义和运行多个Docker容器的工具。它基于YAML文件格式,通过一个配置文件来定义应用程序的各个服务、网络、数据卷等相关配置,并提供了简化的命令来管理容器的生命周期。

Docker Compose主要作用包括:

  1. 定义多容器应用:通过编写一个docker-compose.yaml文件,可以定义一个包含多个服务的应用程序,每个服务对应一个容器。可以指定服务的镜像、容器的启动参数、环境变量、网络配置等。

  2. 管理容器的生命周期:Docker Compose提供了一组简化的命令来管理容器的生命周期,如启动、停止、重启、构建、删除等。可以使用单个命令来同时管理多个容器,简化了容器的管理过程。

  3. 定义服务之间的依赖关系:在docker-compose.yaml文件中,可以定义服务之间的依赖关系,如一个服务依赖于另一个服务的运行。在启动应用程序时,Docker Compose会自动按照定义的依赖关系顺序启动和停止容器,确保服务能够正确地互相通信。

  4. 管理数据卷和网络:Docker Compose可以管理应用程序中的数据卷和网络。可以定义数据卷的挂载路径和访问权限,以及网络的配置和连接方式,确保容器之间可以共享数据和通信。

  5. 扩展和部署应用程序:Docker Compose可以与Docker Swarm集群一起使用,通过简单的命令将应用程序扩展到多个主机上。可以使用Docker Compose定义的服务规模进行弹性扩展,并通过负载均衡来分发流量。

4.2、java项目yaml配置

编辑java项目的yaml文件,如下

version: '3.3'services:db:image: mysql:latestcontainer_name: mysqlenvironment:MYSQL_PASSWORD: '123456'MYSQL_ROOT_PASSWORD: '123456'ports:- "3306:3306"volumes:- /usr/local/mysql/log:/var/log/mysql- /usr/local/mysql/data:/var/lib/mysqlrestart: alwaysnetworks:- app-networkweb:image: myjdkcontainer_name: web_appports:- "8001:8001"volumes:- ./web:/app- ./logs:/app/logsnetworks:- app-networknetworks:app-network:driver: bridge

执行如下命令,可以一键创建容器并启动,在生成环境,我们只需准备相应的Dockerfile文件,以及compose配置,即可部署java应用,非常方便。

docker-compose up -d

4.3、生产环境使用更加专业的k8s工具

Docker Compose是docker公司官方的容器编排工具,然而,在生产环境,google的Kubernetes (简称K8s) 才是事实上的标准。以下是它们之间的一些比较:

  1. 功能和复杂性:Docker Compose是一个相对简单的工具,用于在单个主机上定义和管理多个Docker容器。它专注于简化本地开发和测试环境的容器管理。而Kubernetes是一个更复杂和功能更强大的容器编排平台,用于管理大规模容器化应用程序的部署、扩展、调度和管理。

  2. 多主机支持:Docker Compose仅支持在单个主机上管理容器,而Kubernetes支持跨多个主机的容器集群。Kubernetes能够管理多个节点上的容器,提供高可用性和横向扩展的能力。

  3. 网络和存储:Docker Compose提供了简单的网络和数据卷配置,但对于复杂的网络和存储需求可能有限。而Kubernetes具有更强大的网络和存储管理功能,如服务发现、负载均衡、持久化存储等,可以满足更复杂的应用程序需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

军事武器3D数字化交互展示创作平台大大降低成本

军事力量和装备是一个国家国防安全的重要支柱,这在全球范围内得到广泛认同,为了让入伍的新兵能快速熟悉和掌握武器装备操作流程,基于创新型的华锐3D云展平台工具,搭建的3D军事武器展示搭建编辑器,让部队的军事武器展示…

Solidity智能合约事件(event)

文章目录 Solidity智能合约事件(event)什么是event事件event有什么作用日志内容位于区块链的什么地方?【重要】以太坊交易获取如何在 Solidity 中使用事件?参考 Solidity智能合约事件(event) 什么是event EVM有一个日志功能,用于将数据“写…

C++中的值传递和引用传递

在C中,函数参数传递主要有两种方式:值传递(Pass by Value)和引用传递(Pass by Reference)。这两种方式在参数传递时处理数据的方式有所不同,下面我将详细解释它们。 1. 值传递(Pass…

2024最新D卷 华为OD统一考试题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

C#批量设置海康和大华录像机NVR,GB28181的通道编码.

我经常要把小区海康或者大华的硬盘录像机推送到自己搭建的gb28181监控平台,每次几百个摄像头编码,有点头大,就用了1个多周写了个批量设置海康和大华硬盘录像机的通道编码的程序,海康和大华的SDK简直不是人看的. 太乱了. 大华读取通道编码的代码 /// <summary>/// 获取通道…

自动生成企业培训视频:创新与效率的完美结合

前言 随着人工智能技术的飞速发展&#xff0c;大模型技术在各个领域的应用日益广泛。在企业培训领域&#xff0c;大模型技术的应用为培训视频的生成带来了革命性的变革。本文将探讨如何利用大模型技术自动生成企业培训视频&#xff0c;以及这一技术为企业培训带来的创新和效率…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层&#xff0c;用于简化JDBC开发 1步中的实体类 int类型一般用Integer &#xff1a;如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…

mmdeploy环境部署流程

参考&#xff1a;mmdeploy/docs/zh_cn/01-how-to-build/linux-x86_64.md at main open-mmlab/mmdeploy (github.com) 从零入门《openmmlab》mmdeploy[1]环境安装及简单上手_哔哩哔哩_bilibili 我的环境&#xff1a; docker容器&#xff0c;ubuntu20.04&#xff0c;cuda11.7…

OPNsense 24.1 - 基于 FreeBSD 的开源防火墙和路由平台

OPNsense 24.1 - 基于 FreeBSD 的开源防火墙和路由平台 请访问原文链接&#xff1a;https://sysin.org/blog/opnsense/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 关于 OPNsense OPNsense 是一个开源、易于使用且易于构建…

PS通过GTX实现SFP网络通信1

将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接&#xff0c; 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…

利用flask + pymysql监测数据同步中的数据是否完整

一、背景 最近项目搞重构&#xff0c;将原有的系统拆分成了多个子系统。但是有数据表需要在不同系统中数据&#xff0c;同时为了解决项目性能最了一个很简单的方案&#xff0c;就是公共数据存在每个系统之中。 二、分析 分析这些表&#xff0c;这些表相比源数据表&#xff0c;表…

行为型-观察者模式(Observer)

观察者模式&#xff08;Observer Pattern&#xff09;是一种软件设计模式&#xff0c;主要用于在对象之间建立一对多的依赖关系&#xff0c;以便当一个对象的状态发生改变时&#xff0c;其所有依赖的对象都会得到通知并自动更新。观察者模式属于行为型模式。以下是关于观察者模…

lvgl手势事件判断为点击事件问题

lvgl手势事件判断为点击事件问题处理方法 1.打开文件lvgl\src\core\lv_indev.c 2. 修改函数 static void indev_proc_release(_lv_indev_proc_t * proc)2.1 由原来的 /*** Process the released state of LV_INDEV_TYPE_POINTER input devices* @param proc pointer to an …

学习笔记——交通安全分析05

目录 前言 当天学习笔记整理 交通行为、心理与安全 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 #本期内容接上一期04笔记 当天学习笔记整理 交通行为、心理与…

关于Flutter doctor里两个警告的消除

在终端里输入 flutter doctor 是我们检查flutter是否配置好的方法。 在输出信息里常碰到两个警告 ! Warning: dart on your path resolves to /usr/local/Cellar/dart/2.18.6/libexec/bin/dart,which is not inside your current Flutter SDK checkout at /Users/dengpeng/fl…

三运放仪表放大器通过设置单个电阻器的值来调整增益

从公式 1 中可以看出&#xff0c;我们可以通过调整单个电阻器 R G的值来调整仪表放大器的差分增益。这很重要&#xff0c;因为与电路中的其他电阻器不同&#xff0c; RG的值不需要与任何其他电阻器匹配。 例如&#xff0c;如果我们尝试通过更改 R 5的值来设置增益&#xff0c;…

TGI模型- 同期群-评论文本

用户偏好分析 TGI 1.1 用户偏好分析介绍 要分析的目标&#xff0c;在目标群体中的均值 和 全部群体里的均值进行比较&#xff0c; 差的越多说明 目标群体偏好越明显 TGI&#xff08;Target Group Index&#xff0c;目标群体指数&#xff09;用于反映目标群体在特定研究范围内…

在自己的电脑上搭建我的世界Java版服务器

很多朋友&#xff0c;喜欢玩Minecraft&#xff0c;也希望搭建一个服务器&#xff0c;用于和小伙伴联机&#xff1b; 并且&#xff0c;拥有服务器后&#xff0c;即使所有玩家都下线&#xff0c;“世界”依旧在运行&#xff0c;玩家可以随时参与其中&#xff0c;说不定一上线&am…

有状态服务和无状态服务

有状态服务和无状态服务在不同的业务场景下有不同的应用&#xff0c;以下是一些常见的例子&#xff1a; 有状态服务的场景&#xff1a; 用户会话管理&#xff1a; 用户登录后&#xff0c;会话信息&#xff08;如用户ID、权限、购物车内容等&#xff09;需要在服务端保持状态。…

一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境)

一种新的一维时间序列信号盲解卷积算法&#xff08;以旋转机械故障诊断为例&#xff0c;MATLAB环境&#xff09;&#xff0c;可作为深度学习信号前处理过程&#xff0c;水个SCI不是问题。 机械设备的状态信号中往往蕴含着大量的设备异常信息。如何从繁多的机械状态信号中提取足…