Docker构建Java镜像及使用

news2024/12/23 3:02:34
前言
最近在项目中使用到了一些docker技术,因为没有专业的运维人员,所以在部署版本应用的时候,都是自己在进行打包部署。经过一段时间的操作和使用,在这里和大家分享一下自己的心得,也算是做一下总结吧。
准备工作
首先,我们的项目是基于Java语言开发的,也是使用大名鼎鼎的spring boot这套框架来构建的。那我们首先需要准备一个spring boot应用工程,还需要相对应的jdk版本,反正我们还是使用的jdk8。然后就是编写一个需要构建镜像的Dockerfile文件。其他的就是一些基本环境准备了,比如说docker环境啥的了。
Java工程
作为演示,我就直接使用spring initializer快速生成一个Java工程。当然,大家在自己使用的过程中,完全可以按照自己原来的工程创建方式来构建。在工程中,随便定义一个接口,有响应就行。方便后面进行测试验证。至于后续部署打包的配置,原来是啥样就啥样,不用去更改,只需要在后续的构建镜像中修改对应的启动命令就行了。完全不影响我们的编码和配置。下面是一些工程示例:

项目pom文件:

<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>top.layne</groupId>
    <artifactId>layne-docker</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>layne-docker</name>
    <url>http://maven.apache.org</url>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>layne-docker</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
示例接口:
package top.layne.docker.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 控制器
 *
 * @author Layne
 * @date 2024/9/7
 */
@RequestMapping("docker")
@RestController
public class DockerController {
    /**
     * ping
     *
     * @return
     */
    @RequestMapping("ping")
    public Object ping() {
        return "pong";
    }
}
Dockerfile文件
在工程打好包后,我们就需要将部署包构建为docker镜像文件。那在构建镜像的时候,我们就需要一个Dockerfile文件来告诉docker怎么进行一个镜像的生成,比如说一些环境配置啊,部署包的路径啊,暴露的一些端口配置啊,启动命令啥的。那我们这里就需要告诉docker,我们部署的Java应用是需要一个jdk的运行环境,端口的话需要暴露8080,设置一个应用的工作目录/app,服务启动命令`java -jar layne-docker.jar`。

项目中如果是使用的脚本启动的话,只需要将启动命令替换成对应的脚本启动命令就行了

如:ENTRYPOINT [“./springboot-start.sh”,“start”,“test”]

Dockerfile文件:

# 配置jdk基础镜像
FROM openjdk:8u342
# 设置环境变量
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN.UTF-8
ENV LC_ALL=zh_CN.UTF-8
ENV TZ=Asia/Shanghai
# 暴露服务端口
EXPOSE 8080

# 设置工作目录
WORKDIR /app

# 拷贝本地文件到容器中
COPY ./ .

#启动命令
ENTRYPOINT ["java","-jar","layne-docker.jar"]
构建镜像
在工程打好部署包,Dockerfile文件也配置好后,我们就可以开始构建应用的镜像文件了。首先,我们把部署包和Dockerfile文件一起上传到具有Docker环境的服务器中。一般这个服务器也就是我们应用需要部署的机器了。然后通过docker build命令来执行构建镜像的命令。比如我这里:`docker build -f Dockerfile -t layne-docker-test:1.0 .`,这条指令代表的意思就是我需要构建一个docker镜像,镜像名称叫做layne-docker-test,版本号是1.0。

上传文件:

# 使用rz -y上传jar包和Dockerfile
layne@layne-ubuntu-22-3:~/app$ rz -y
rz waiting to receive.
Starting zmodem transfer.  Press Ctrl+C to cancel.
Transferring Dockerfile...
  100%     352 bytes  352 bytes/sec 00:00:01       0 Errors  
Transferring layne-docker.jar...
  100%   17236 KB    17236 KB/sec    00:00:01       0 Errors  
# 查看文件
layne@layne-ubuntu-22-3:~/app$ ll
total 17252
drwxrwxr-x  2 layne layne     4096  98 00:40 ./
drwxr-x--- 17 layne layne     4096  98 00:28 ../
-rw-r--r--  1 layne layne      352  97 23:41 Dockerfile
-rw-r--r--  1 layne layne 17650310  97 22:53 layne-docker.jar

docker build 镜像

# 执行构建镜像命令 docker build -f Dockerfile -t layne-docker-test:1.0 .
layne@layne-ubuntu-22-3:~/app$ docker build -f Dockerfile -t layne-docker-test:1.0 .
Sending build context to Docker daemon  17.65MB
Step 1/9 : FROM openjdk:8u342
 ---> b273004037cc
Step 2/9 : ENV LANG=zh_CN.UTF-8
 ---> Running in 755f1b0d64c9
Removing intermediate container 755f1b0d64c9
 ---> 16d81d0f30a2
Step 3/9 : ENV LANGUAGE=zh_CN.UTF-8
 ---> Running in 4728c8eed89a
Removing intermediate container 4728c8eed89a
 ---> ea937a011201
Step 4/9 : ENV LC_ALL=zh_CN.UTF-8
 ---> Running in ac8d41bb7a93
Removing intermediate container ac8d41bb7a93
 ---> 3d45873454a3
Step 5/9 : ENV TZ=Asia/Shanghai
 ---> Running in d8c995bb1587
Removing intermediate container d8c995bb1587
 ---> 068f3ce94784
Step 6/9 : EXPOSE 8080
 ---> Running in 2e48bd628e47
Removing intermediate container 2e48bd628e47
 ---> 9491375594d4
Step 7/9 : WORKDIR /app
 ---> Running in c1b63d3aa83e
Removing intermediate container c1b63d3aa83e
 ---> e619e9e805b9
Step 8/9 : COPY ./ ./
 ---> f955c8e6e299
Step 9/9 : ENTRYPOINT ["java","-jar","layne-docker.jar"]
 ---> Running in 0677934829d1
Removing intermediate container 0677934829d1
 ---> b76b892bab21
Successfully built b76b892bab21
Successfully tagged layne-docker-test:1.0

查看镜像:

layne@layne-ubuntu-22-3:~/app$ docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
layne-docker-test   1.0       b76b892bab21   11 seconds ago   544MB
openjdk             8u342     b273004037cc   2 years ago      526MB
启动容器:
layne@layne-ubuntu-22-3:~/app$ docker run --name layne-docker-test-1.0 -p 8080:8080 -d layne-docker-test:1.0
3e30aa38a58624fd698456cdbdac174692ae8e873b51f474ebc57e0ed72f1407
查看容器:
layne@layne-ubuntu-22-3:~/app$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                                       NAMES
3e30aa38a586   layne-docker-test:1.0   "java -jar layne-doc…"   3 seconds ago   Up 3 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   layne-docker-test-1.0

查看日志:
layne@layne-ubuntu-22-3:~/app$ docker logs 3e30aa38a586

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.8)

2024-09-08 00:42:45.115  INFO 1 --- [           main] top.layne.docker.Application             : Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 3e30aa38a586 with PID 1 (/app/layne-docker.jar started by root in /app)
2024-09-08 00:42:45.119  INFO 1 --- [           main] top.layne.docker.Application             : No active profile set, falling back to 1 default profile: "default"
2024-09-08 00:42:46.446  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2024-09-08 00:42:46.470  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-09-08 00:42:46.470  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.71]
2024-09-08 00:42:46.568  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-09-08 00:42:46.568  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1348 ms
2024-09-08 00:42:47.124  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2024-09-08 00:42:47.137  INFO 1 --- [           main] top.layne.docker.Application             : Started Application in 2.568 seconds (JVM running for 3.231)

验证接口:
# 通过curl访问接口地址
layne@layne-ubuntu-22-3:~/app$ curl localhost:8080/docker/ping
# 响应结果pong
ponglayne@layne-ubuntu-22-3:~/app$ 
layne@layne-ubuntu-22-3:~/app$ 
后语
总而言之,通过一段时间的docker指令操作,对于docker的一些基本指令也慢慢熟悉了。对于应用的镜像构建,容器的启动这些操作指令也都基本会操作使用了。当然,这中间有很多的操作,我们都可以使用一些脚本啊或者一些自动化部署工具来代替手工操作。但是在我们学习的过程中,这样一步步自己手动敲出来的会更加有印象。

喜欢的朋友可以扫描下方二维码点个关注,谢谢您的阅读。在这里插入图片描述

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

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

相关文章

【Unity学习心得】如何制作俯视角射击游戏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、导入素材二、制作流程 1.制作地图2.实现人物动画和移动脚本3.制作单例模式和对象池4.制作手枪pistol和子弹bullet和子弹壳bulletShell5.制作散弹枪shotgun总…

AIDA64 Extreme(硬件检测工具)v7.20绿色不需要安装版,供大家学习研究参考

一款综合性的系统硬件检测工具,号称最权威的电脑硬件检测,监控与测试软件,这款专业的硬件检测大师也是每位高手玩家,菜鸟用户必备的硬件检测利器.AIDA64不仅提供诸如协助超频,硬件侦错,压力测试和传感器监测等多种功能,而且还可以对处理器,系统内存和磁盘驱动器性能进行全面评估…

家具行业短视频矩阵获客,轻松实现百万曝光!

当前家具行业的营销正面临一个新阶段&#xff0c;但同时也遭遇了增长的瓶颈&#xff0c;主要问题在于营销策略过于雷同&#xff0c;这导致产品难以在市场中获得足够关注&#xff0c;从而在品牌和消费者之间形成了隔阂。 同时在这样一个信息爆炸的时代&#xff0c;就算是最优秀…

pandas 生成excel多级表头

使用pandas导出excel 表格时类似这种 其中含有多级表头的情况也就是涉及到表头需要合并单元格&#xff08;横向及纵向&#xff09; 1、表头设置 columns [("xx公司路产月报表","序号","序号"),("xx公司路产月报表","单位"…

【树形dp】P2014 [CTSC1997] 选课 题解

题目描述 在大学里每个学生&#xff0c;为了达到一定的学分&#xff0c;必须从很多课程里选择一些课程来学习&#xff0c;在课程里有些课程必须在某些课程之前学习&#xff0c;如高等数学总是在其它课程之前学习。现在有 N ( 1 ≤ N ≤ 300 ) N(1\leq N \leq 300) N(1≤N≤30…

Leetcode 每日一题:Longest Increasing Path in a Matrix

写在前面&#xff1a; 今天我们继续看一道 图论和遍历 相关的题目。这道题目的背景是在一个矩阵当中找寻最长的递增数列长度。思路上非常好想&#xff0c;绝对和 DFS 相关&#xff0c;但是题目的优化要求非常高&#xff0c;对于语言和内存特性的考察特别丰富&#xff0c;如果是…

【Python报错已解决】ERROR: No matching distribution found for PIL

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;安装Pillow2.2 步骤二&a…

CentOS安装Hadoop系列

安装Hadoop 1、安装SDK 2、Wget下载安装包到指定目录 3、选择hadoop的配置模式&#xff0c;单机模式&#xff0c;伪集群模式&#xff0c;集群模式 1、查找APACHE下载官网&#xff0c;搜索hadoop,进入目录&#xff0c;找到common目录&#xff0c;下载对应版本 国内&#xff0c;…

uniapp 原生插件开发 UI

前言&#xff1a; 在集成某些特定 原生SDK的时候&#xff0c;它本身是带UI控件的。当我们使用 uniapp 开发app的时候实是 可以使使用 nvue 页面&#xff0c;以 weex 的方式嵌入原生的UI控件。 我这边的场景是 接入连连app的支付&#xff0c;它有个自己的密码键盘 控件是原生的页…

好用的电脑录屏软件有哪些?推荐4款专业工具。

不同系统的电脑上面带有的录屏功能不一样&#xff0c;比如win10上面有Xbox game bar,Mac系统则用的是QuickTime Player&#xff0c;或者是使用快捷键“CommandShift5”。但更方便的&#xff0c;我自己认为是使用一些专业的录屏软件&#xff0c;他门的录制模式多&#xff0c;兼容…

python将这多个sheet页的数据合并在一起

有如下数据&#xff0c;需要将excel多个sheet页中的数据&#xff0c;合并在一起。 数据样例&#xff1a;&#x1f447; import pandas as pd import os# 读Excel文件 file_path D:/project/Excelimport/簿4.xlsx# 创建空的DataFrame用于存储合并后的数据 all_data pd.Data…

软件项目管理

1. 软件项目管理概述 1.1 软件项目管理 软件项目管理的提出是在20世纪70年代中期&#xff0c;当时美国国防部专门研究了软件开发不能按时提交、预算超支和质量达不到用户要求的原因&#xff0c;发现70%的项目是因为管理不善引起的&#xff0c;而非技术原因。 软件项目管理和…

9月17–20日Sui新加坡参会指南,期待与您相聚

&#x1f4e7;叮&#xff0c;您有一份Sui新加坡参会指南待领取&#xff5e; 随着新加坡Token2049大会的临近&#xff0c;我们为即将前往新加坡参会的朋友们准备了一份指南&#xff0c;帮助你快速了解Sui团队的活动安排&#xff0c;并与Sui团队来个线下面对面的交流。 9月17日…

解码消费医疗机构:如何通过全场景AI运营实现营销破局?

在当今的医美市场中&#xff0c;“流量困境”已成为众多消费医疗机构面临的严峻挑战。传播日益碎片化&#xff0c;各大机构对流量争夺也愈演愈烈&#xff0c;不少机构面临着新客获取难、老客户留存转化难、运营成本高昂等困境。 那么&#xff0c;面对这一挑战&#xff0c;消费…

Leetcode面试经典150题-79.搜索单词

题目比较简单&#xff0c;回溯最基础的题&#xff0c;记得除非覆盖&#xff0c;否则一定要恢复现场就行 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean exist(char[][] board, String word) {int m board.length; int n board[0].length;i…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C语言)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C语言&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff0…

公司搬迁至外地:选择新办资质还是迁移资质?

当企业面临搬迁&#xff0c;尤其是跨区域搬迁时&#xff0c;资质管理成为企业运营策略中的一个关键议题。企业需要在新办资质和迁移资质之间做出选择&#xff0c;这关系到企业的合规性、市场竞争力和业务连续性。本文将探讨这两种选择的考量因素&#xff0c;以及如何根据企业的…

cityengine修改纹理创建模型

数据准备 1、建筑shp面数据 2、安装好cityengine软件 3、Arcgis(非必要) 效果 1、新建工程 路径不要放C盘下 2、复制规则文件和纹理 安装软件后,这些素材在电脑上能找到,默认位置是:C:\Users{计算机名}\Documents\CityEngine\Default Workspace\ESRI.lib,如果找不到…

售后质保卡小程序系统开发制作方案

售后质保卡小程序系统作为一种数字化解决方案&#xff0c;通过微信小程序&#xff0c;为顾客提供更加便捷、高效、环保的质保服务体验。售后质保卡系统是集质保信息查询、报修申请、服务进度跟踪、顾客反馈等功能于一体的质保卡小程序。 目标顾客 1. 终端顾客&#xff1a;直接…

昇思MindSpore AI框架MindFormers实践3:ChatGLM3-6B对一段文字进行提取

MindSpore和MindFormers安装参见&#xff1a;昇思AI框架实践1:安装MindSpoe和MindFormers_miniconda 安装mindspore-CSDN博客 使用了MindSpore2.2和MindFormers1.0 支持的模型&#xff1a; KeyError: "model must be in odict_keys([gpt2, gpt2_lora, gpt2_xl, gpt2_xl…