在 Java 項目中搭建和部署 Docker 的詳細流程

引言

在現代軟件開發中,Docker 已成為一種流行的工具,用于簡化應用的部署和運行環境的一致性。本文將詳細介紹如何在 Java 項目中搭建和部署 Docker,包括配置文件、代碼示例以及流程圖。


一、整體工作流程

以下是整個流程的概覽:

編寫 Java 代碼
構建 Java 項目
創建 Dockerfile
構建 Docker 鏡像
運行 Docker 容器
發布鏡像到 Docker Hub
在服務器上拉取并運行容器

二、搭建 Java 項目

2.1 創建一個簡單的 Spring Boot 項目

項目結構
my-java-app/
├── src/main/java/com/example/demo/DemoApplication.java
├── src/main/resources/application.properties
├── pom.xml
└── Dockerfile
DemoApplication.java 文件內容:
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@GetMapping("/")public String home() {return "Hello, Docker!";}
}
application.properties 文件內容:
server.port=8080
pom.xml 文件內容:
<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>com.example</groupId><artifactId>demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

三、創建 Dockerfile

在項目根目錄下創建一個名為 Dockerfile 的文件,定義如何構建 Docker 鏡像。

Dockerfile 文件內容:
# 使用官方 OpenJDK 基礎鏡像
FROM openjdk:17-jdk-slim# 設置工作目錄
WORKDIR /app# 復制 Maven 構建的 JAR 文件
COPY target/demo-1.0-SNAPSHOT.jar app.jar# 暴露端口
EXPOSE 8080# 啟動命令
ENTRYPOINT ["java", "-jar", "app.jar"]

四、構建和運行 Docker 容器

4.1 構建 Java 項目

在項目根目錄下運行以下命令,使用 Maven 構建項目:

mvn clean package

構建完成后,會在 target 目錄下生成一個 JAR 文件,例如 demo-1.0-SNAPSHOT.jar

4.2 構建 Docker 鏡像

在項目根目錄下運行以下命令構建鏡像:

docker build -t my-java-app .

4.3 運行容器

運行容器并將主機的 8080 端口映射到容器的 8080 端口:

docker run -d -p 8080:8080 --name my-running-app my-java-app

4.4 驗證運行

訪問 http://localhost:8080,您應該會看到頁面顯示 Hello, Docker!


五、發布鏡像到 Docker Hub

5.1 登錄 Docker Hub

登錄到您的 Docker Hub 賬戶:

docker login

輸入用戶名和密碼完成登錄。

5.2 標記鏡像

為鏡像添加標簽以便上傳到 Docker Hub:

docker tag my-java-app your-dockerhub-username/my-java-app:1.0

5.3 推送鏡像

將鏡像推送到 Docker Hub:

docker push your-dockerhub-username/my-java-app:1.0

六、在服務器上部署

6.1 拉取鏡像

在目標服務器上運行以下命令拉取鏡像:

docker pull your-dockerhub-username/my-java-app:1.0

6.2 運行容器

運行容器并映射端口:

docker run -d -p 8080:8080 --name my-deployed-app your-dockerhub-username/my-java-app:1.0

6.3 驗證部署

訪問服務器的 http://<server-ip>:8080,驗證應用是否正常運行。


七、總結

通過本文,我們詳細介紹了如何在 Java 項目中搭建和部署 Docker。以下是關鍵點總結:

  1. 編寫 Java 項目:使用 Spring Boot 快速構建一個 Web 應用。
  2. 創建 Dockerfile:定義應用的運行環境和啟動方式。
  3. 構建和運行容器:通過 docker builddocker run 快速啟動應用。
  4. 發布鏡像:將鏡像推送到 Docker Hub,便于分發和部署。
  5. 服務器部署:在目標服務器上拉取鏡像并運行容器。

希望本文能幫助您快速掌握在 Java 項目中搭建和部署 Docker 的方法,并將其應用到實際項目中。如果您有任何問題或建議,請隨時留言交流!


參考資料

  • Docker 官方文檔
  • Spring Boot 官方文檔
  • Docker Hub 文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77227.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里云域名遷移至Amazon Route 53的完整指南

在當今的云計算時代,域名管理和DNS服務的選擇對于網站性能和可用性至關重要。本文將詳細介紹如何將阿里云上的域名遷移至Amazon Route 53,以充分利用AWS生態系統的優勢。 1. 簡介 Amazon Route 53是一種可用性高、可擴展性強的域名系統(DNS)web服務。它為開發者和企業提供了一…

AI網絡滲透kali應用(gptshell)

kali安裝gptshell 一、shellGPT 工具介紹 ShellGPT?是一款由AI大型語言模型&#xff08;LLM&#xff09;驅動的終端命令行工具。它能幫助用戶直接在終端與AI交互&#xff0c;自動生成、解釋、執行各類 Linux 命令&#xff0c;大大提升了運維和開發效率。ShellGPT 支持接入 O…

STM32 I2C總線通信協議

引言 在嵌入式系統開發領域&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;總線作為經典的雙線制串行通信協議&#xff0c;憑借其簡潔的物理層設計和靈活的通信機制&#xff0c;在傳感器互聯、存儲設備控制、顯示模塊驅動等場景中占據重要地位。本文將深入剖…

spring,spring boot, spring cloud三者區別

Spring Framework vs Spring Boot vs Spring Cloud 1. Spring Framework 定位&#xff1a;基礎框架&#xff0c;提供核心的IoC容器、AOP、事務管理、數據訪問、Web MVC等能力。特點&#xff1a; 模塊化設計&#xff1a;可單獨使用某些模塊&#xff08;如僅用Spring JDBC&…

每日算法-250425

每日算法打卡 - 2025年4月25日 記錄今天完成的幾道 LeetCode 算法題&#xff0c;分享解題思路和代碼。 2178. 拆分成最多數目的正偶數之和 題目 解題思路 貪心算法 解題過程 題目要求我們將一個偶數 finalSum 拆分成盡可能多的 不同 正偶數之和。 為了使拆分出的數字數量…

SQL進階知識:四、索引優化

今天介紹下關于索引優化的詳細介紹&#xff0c;并結合MySQL數據庫提供實際例子。 索引優化是數據庫性能優化的關鍵環節之一&#xff0c;尤其是在處理大量數據時。索引可以加快查詢速度&#xff0c;減少數據掃描范圍&#xff0c;但不當的索引設計也可能導致性能問題。以下是關于…

(PYTHON)函數

函數的基本概念&#xff1a; python中函數分為以下四種&#xff1a; 1&#xff0c;python內置函數&#xff1a;如abs&#xff0c;len&#xff0c;max&#xff0c;min&#xff1b; 2&#xff0c;標準庫函數&#xff1a;通過import聲明標準庫&#xff0c;如&#xff1a;math&a…

Winform(1.Winform控件學習)

使用的控件有:Button,Label,TextBox button:表示一個按鈕,用戶點擊按鈕觸發事件 click事件最常用 label:標簽,用于顯示文本 Name屬性:變量名稱 textBox:輸入框 Form1代碼: using System; using System.Collections.Generic; using System.ComponentModel; using Sys…

linux centOS7.9 No package docker-ce available

docker pull apache/apisix:3.2.2-centos Error response from daemon: missing signature key 處理方式如下&#xff1a; 問題&#xff1a;在純凈機里安裝docker時報錯No package docker-ce available。 解決辦法&#xff1a; 1、更新yum&#xff0c;使用yum -y upgrade&#…

小白學習java第15天:JDBC

1.數據庫驅動 想一下我們之前是怎么操作數據庫&#xff0c;是不是使用SQL語句對其mysql數據庫管理系統&#xff0c;然后管理系統在進行數據庫&#xff08;硬盤文件里面的&#xff09;進行操作。那么我現在想使用應用程序對其數據庫進行操作&#xff0c;應該怎么辦呢&#xff1…

django之數據的翻頁和搜索功能

數據的翻頁和搜素功能 目錄 1.實現搜素功能 2.實現翻頁功能 一、實現搜素功能 我們到bootstrap官網, 點擊組件, 然后找到輸入框組, 并點擊作為額外元素的按鈕。 我們需要使用上面紅色框里面的組件, 就是搜素組件, 代碼部分就是下面紅色框框出來的部分。 把這里的代碼復制…

Kotlin Multiplatform--02:項目結構進階

Kotlin Multiplatform--02&#xff1a;項目結構進階 引言正文 引言 在上一章中&#xff0c;我們對 Kotlin Multiplatform 項目有了基本的了解&#xff0c;已經可以進行開發了。但我們只是使用了系統默認的項目結構。本章介紹了如何進行更復雜的項目結構管理。 正文 在上一章中&…

【Git】連接github時的疑難雜癥(DNS解析失敗)

大家好&#xff0c;我是jstart千語。最近在將項目推送到github的時候&#xff0c;突然github就拒絕訪問了&#xff0c;即使掛了VPN&#xff0c;網頁也進不去&#xff0c;通過git也不能把代碼推送上去。 即使后面看別人的一些解決方案&#xff0c;比如取消代理啊、更換ssh的方式…

ViTMAE:掩碼自編碼器是可擴展的視覺學習者

摘要 本文展示了掩碼自編碼器&#xff08;MAE&#xff09;作為計算機視覺中的可擴展自監督學習方法。我們的MAE方法很簡單&#xff1a;我們對輸入圖像進行隨機掩碼&#xff0c;并重建缺失的像素。該方法基于兩個核心設計。首先&#xff0c;我們開發了一種非對稱的編碼器-解碼器…

全球碳化硅晶片市場深度解析:技術迭代、產業重構與未來賽道爭奪戰(2025-2031)

一、行業全景&#xff1a;從“材料突破”到“能源革命”的核心引擎 碳化硅&#xff08;SiC&#xff09;作為第三代半導體材料的代表&#xff0c;憑借其寬禁帶&#xff08;3.26eV&#xff09;、高臨界擊穿場強&#xff08;3MV/cm&#xff09;、高熱導率&#xff08;4.9W/cmK&…

AWS Glue ETL設計與調度最佳實踐

一、引言 在AWS Glue中設計和調度ETL過程時&#xff0c;需結合其無服務器架構和托管服務特性&#xff0c;采用系統化方法和最佳實踐&#xff0c;以提高效率、可靠性和可維護性。本文將從調度策略和設計方法兩大維度詳細論述&#xff0c;并輔以實際案例說明。 二、調度策略的最…

數據結構手撕--【二叉樹】

目錄 定義結構體&#xff1a; 初始化&#xff1a; 手動創建一個二叉樹&#xff1a; 前序遍歷&#xff1a; 中序遍歷&#xff1a; 后序遍歷 二叉樹節點個數&#xff1a; 葉子節點個數&#xff1a; 二叉樹第k層節點個數&#xff1a; 二叉樹的高度&#xff1a; 查找值為x…

2025 Java 開發避坑指南:如何避免踩依賴管理的坑?

在 Java 開發的世界里&#xff0c;依賴管理就像是一座看不見的橋梁&#xff0c;連接著項目所需的各種第三方庫和框架。然而&#xff0c;這座橋梁并非總是穩固&#xff0c;稍有不慎就可能掉入 “依賴地獄”&#xff0c;導致項目編譯失敗、運行異常。2025 年&#xff0c;隨著開源…

用node打開一個網頁

前言 使用node打開網頁&#xff0c;要求跨平臺 方案 使用子進程來用命令行打開網頁鏈接就可以了&#xff0c;需要注意的是Mac系統使用的是open命令&#xff0c;Windows系統使用的是start命令&#xff0c;Linux等系統使用xdg-open命令。針對不同的操作系統使用不同的命令。 封…

使用功能包組織C++節點的具體教程

在 ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;使用功能包&#xff08;package&#xff09;來組織 C 節點是一種常見且有效的方式&#xff0c;它能讓代碼結構更清晰、便于管理和復用。 1. 環境準備 確保已經安裝了 ROS&#xff0c;這里以 ROS 2 Humble…