使用docker构建java应用
1、docker简介
Docker是一个开源的容器化平台,可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术,可以使应用程序在不同的操作系统和环境中具有一致的运行方式。
使用Docker带来的好处包括:
-
简化应用程序部署和管理:Docker可以将应用程序及其依赖项打包成一个容器,使得部署应用程序变得简单和可重复。容器可以在不同的环境中运行,无论是开发、测试还是生产环境,都可以保持一致性。
-
高效的资源利用:Docker容器是轻量级的,相比于传统的虚拟机更加节省资源。多个容器可以在同一台物理机上运行,有效地利用系统资源,提高硬件利用率。
-
快速启动和停止:Docker容器可以在几秒钟内启动和停止,相比于传统虚拟机需要启动整个操作系统的时间更短,提供了更快的开发和部署速度。
-
环境一致性:Docker容器可以确保应用程序在不同的环境中具有一致的运行方式。开发人员可以在本地构建和测试容器,然后将其部署到其他环境中,无需担心环境差异导致的问题。
-
更好的可移植性:通过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主要步骤:
- 使用apt-get下载jdk17压缩包文件
- 解压缩jdk安装包
- 设置java环境变量和app工具目录
- 使用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网络方式:
-
桥接网络(Bridge Network):默认情况下,Docker使用桥接网络来连接容器。在桥接网络中,Docker守护进程会创建一个虚拟的网桥,每个容器会分配一个唯一的IP地址,并通过网桥与主机相连。容器之间可以通过IP地址相互通信,也可以通过容器名称进行访问。
-
主机网络(Host Network):在主机网络模式中,容器与主机共享网络命名空间,即它们使用同一个网络接口和IP地址。这意味着容器可以访问主机上的所有网络服务,而不需要进行端口映射。主机网络模式性能更好,但容器之间的隔离性较差。
-
网络连接(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主要作用包括:
-
定义多容器应用:通过编写一个docker-compose.yaml文件,可以定义一个包含多个服务的应用程序,每个服务对应一个容器。可以指定服务的镜像、容器的启动参数、环境变量、网络配置等。
-
管理容器的生命周期:Docker Compose提供了一组简化的命令来管理容器的生命周期,如启动、停止、重启、构建、删除等。可以使用单个命令来同时管理多个容器,简化了容器的管理过程。
-
定义服务之间的依赖关系:在docker-compose.yaml文件中,可以定义服务之间的依赖关系,如一个服务依赖于另一个服务的运行。在启动应用程序时,Docker Compose会自动按照定义的依赖关系顺序启动和停止容器,确保服务能够正确地互相通信。
-
管理数据卷和网络:Docker Compose可以管理应用程序中的数据卷和网络。可以定义数据卷的挂载路径和访问权限,以及网络的配置和连接方式,确保容器之间可以共享数据和通信。
-
扩展和部署应用程序: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) 才是事实上的标准。以下是它们之间的一些比较:
-
功能和复杂性:Docker Compose是一个相对简单的工具,用于在单个主机上定义和管理多个Docker容器。它专注于简化本地开发和测试环境的容器管理。而Kubernetes是一个更复杂和功能更强大的容器编排平台,用于管理大规模容器化应用程序的部署、扩展、调度和管理。
-
多主机支持:Docker Compose仅支持在单个主机上管理容器,而Kubernetes支持跨多个主机的容器集群。Kubernetes能够管理多个节点上的容器,提供高可用性和横向扩展的能力。
-
网络和存储:Docker Compose提供了简单的网络和数据卷配置,但对于复杂的网络和存储需求可能有限。而Kubernetes具有更强大的网络和存储管理功能,如服务发现、负载均衡、持久化存储等,可以满足更复杂的应用程序需求。
相关文章:

使用docker构建java应用
1、docker简介 Docker是一个开源的容器化平台,可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术,可以使应用程序在不同的操作系统和环境中具有一致的运行方式。 使用Docker带来的好处包括: 简…...

Oracle 存储过程
Oracle存储过程 创建存储过程 CREATE OR REPLACE PROCEDURE UPDATE_EMPLOYEE_SALARY(p_employee_id IN NUMBER,p_employee_salary IN NUMBER )AS BEGINUPDATE employeesSET salary p_employee_salaryWHERE employee_id p_employee_id;COMMIT;EXCEPTIONWHEN NO_DATA_FOUND T…...

下载站名文件
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 得到了请求地址与请求参数后,可以发现请求参数中的出发地与目的地均为车站名的英文缩写。而这个英文缩写的字母是通过输入中文车站名转换…...

345453
38744...

Java操作redis
目录 一:Jedis 二:使用Spring Data Redis Redis 的 Java 客户端很多,官方推荐的有三种: 1.Jedis 2.Lettuce 3.Redisson 同时,Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在S…...

【数据结构(邓俊辉)学习笔记】图03——拓扑排序
文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事,如编讲义,将已经知道的知识点串起来变成讲课序列。那…...

C#参数使用场景简要说明
C#参数使用场景简要说明 1、传值参数 方法、类成员的初始化 2、输出参数 方法返回值不能满足,需要多个返回值时; 3、引用参数 方法需要修改变量需带回原变量时; 4、具名参数 代码可读性高,参数可交换位置 5、方法扩展(…...

线性代数|机器学习-P10最小二乘法的四种方案
文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候,就会用到 最小二乘法 .根据矩阵A的情况,有如下四种方法 在r n m 时,SVD奇异…...

【Android面试八股文】你能描述一下JVM中的类加载过程吗?
文章目录 一、Java类的生命周期二、JVM类加载过程1. 加载(Loading)2. 链接(Linking)a. 验证(Verification)b. 准备(Preparation)b.1 准备阶段的初始值b.2 用户定义的初值b.3 常量的初始化c. 解析(Resolution)3. 初始化(Initialization)3.1 什么是 `<clinit>`…...

MYSQL八、MYSQL的SQL优化
一、SQL优化 sql优化是指:通过对sql语句和数据库结构的调整,来提高数据库查询、插入、更新和删除等操作的性能和效率。 1、插入数据优化 要一次性往数据库表中插入多条记录: insert into tb_test values(1,tom); insert into tb_tes…...

鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS
1、LFS文件系统结构体介绍 会分2部分来介绍结构体部分,先介绍LittleFS文件系统的结构体,然后介绍LiteOS-M内核中提供的和LittleFS相关的一些结构体。 1.1 LittleFS的枚举结构体 在openharmony/third_party/littlefs/lfs.h头文件中定义LittleFS的枚举、…...

【ARMv8/ARMv9 硬件加速系列 3 -- SVE 指令语法及编译参数详细介绍】
文章目录 SVE 汇编语法SVE 单通道谓词SVE 测试代码 SVE 软件和库支持SVE 编译参数配置-marcharmv8-alseprofilememtagsve2-aessve2-bitpermcryptosve2sve2-sha3sve2-sm4 SVE 汇编语法 在介绍 SVE 汇编指令语法之前,先介绍下如何判断自己所使用的芯片是否实现了SVE功…...

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开
Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统(Hospital Information System简称HIS)是一门医学、信息、管理、计算机等多种学科为一体的边缘科学ÿ…...

工业机器人远程运维,增强智慧工厂运营管理
1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加,制造业对于生产线稳定性和效率的要求不断提高。然而,传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题,迫切需要一种更具灵活性和效率的监控方式。…...

理解Python的元类
1.type()函数 type 函数是一个内置函数,用来获取一个对象的类型。它可以接受一个参数,返回这个参数的数据类型。type也可以用来创建类,type就是元类 x333 list["ab"] tuple (1, "a", True, 3.14) dict {name: Alice,…...

web前端黑马下载:探索学习资源的海洋
web前端黑马下载:探索学习资源的海洋 在数字化时代,Web前端技术日益成为互联网行业的核心驱动力。为了跟上这一趋势,众多学习者纷纷投身于Web前端的学习之中。而在这个过程中,“黑马”作为一个备受瞩目的品牌,其Web前…...

最新版jd-gui下载
对于java开发的工程师来说,jd-gui应该是经常会用到的工具了 官网的jd-gui目前只支持到JAVA13,更新版本JAVA编译出来的JAR包就反编译不出来了 此版本支持到了JAVA23 如果需要win以外的其他版本,可以查看我的其他上传 如果不想花积分&#…...

(051)FPGA时钟--->(001)时钟介绍
(001)时钟介绍 1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时钟介绍 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电…...

Java程序员英语单词通关:
Java程序员英语单词通关: abstract - 抽象的 boolean - 布尔值 break - 打断 byte - 字节 case - 情况,实例 catch - 捕获 char - 字符 class - 类 continue - 继续 default - 默认,通常 do - 做,运行 double - 双精度…...

数据库开发-Mysql03
目录 1. 多表查询 1.1 概述 1.1.1 数据准备 1.1.2 介绍 1.1.3 分类 1.2 内连接 1.3 外连接 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 1.5 案例 2. 事务 2.1 介绍 2.2 操作 2.3 四大特性 3. 索引 3.1 介绍 3…...

0-1 背包问题(动态规划 查询背包元素)
描述 给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大? 在选择装入背包的物品时,对每种物品i只能有两种选择,装入或者不装入…...

elasticsearch快照生成与恢复
Elasticsearch快照生成与恢复的场景主要涉及到数据的备份与恢复需求。当需要对Elasticsearch集群中的数据进行备份,或者在数据丢失、损坏等情况下需要恢复数据时,就可以使用快照功能。 快照生成的方法通常包括以下步骤: 1、创建一个快照仓库…...

178.二叉树:最大二叉树(力扣)
代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…...

跨境电商中的IP隔离是什么?怎么做?
一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时,我们实际上是在讨论一种网络安全策略,旨在通过技术手段将网络划分为不同的区域或子网,每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…...

【C++】stack、queue和deque的使用
💗个人主页💗 ⭐个人专栏——C学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读 一、stack 1. stack介绍 2. stack使用 二、queue 1. queue介绍 2. queue使用 三、deque 1. deque介绍 2. deque的…...

通过SSH远程登录华为设备
01 进入系统编辑视图 system-view Enter system view, return user view with return command. 02 创建本地RSA密钥对 [HUAWEI]rsa local-key-pair creat The key name will be:HUAWEI_Host The range of public key size is (2048 ~ 2048). NOTE: Key pair generation will ta…...

算法day27
第一题 515. 在每个树行中找最大值 首先是遍历每层的节点,将每一层最大值的节点的值保留下来,最后将所有层的最大值的表返回;具体的遍历每层节点的过程如上一篇故事; 综上所述,代码如下: /*** Definition …...

记录一次CTF图片拼图安装工具montage+gaps成功步骤以及踩坑全过程
安装图片拼接工具montage: 1.安装 使用pip install montage无法安装montage工具的师傅可以尝试下面的方法 #Debian apt-get install graphicsmagick-imagemagick-compat#Ubuntu apt-get install graphicsmagick-imagemagick-compat#Alpine apk add imagemagick6#…...

深入剖析人才管理的关键要素:“选、用、育、留”四大核心要素
在当今这个日新月异的商业时代,企业的成功不再仅仅取决于资金、技术或市场策略,而更多地依赖于企业所拥有的人才资源。有效的人才管理策略,尤其是“选、用、育、留”四大核心要素,已成为推动企业持续发展的关键。 一、选ÿ…...

【C++】类的默认成员函数
类的默认成员函数 类的六个默认成员函数构造函数构造函数的概念构造函数的特性 析构函数析构函数的概念析构函数的特性 构造函数与析构函数的调用顺序拷贝构造拷贝构造的概念拷贝构造的特性赋值运算符重载运算符重载赋值运算符重载前置与后置重载输入输出流重载 const修饰成员实…...