Docker本地用Dockfile 构建Java后端SprintBoot镜像

代码 D:\workspace3\docker-test1

pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>4.0.7</version>
		<relativePath/>
	</parent>
	<groupId>com.haiwei</groupId>
	<artifactId>docker-test1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webmvc</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

HealthController

java 复制代码
package com.haiwei.docker_test1;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HealthController {
    private static int count = 0;

    @GetMapping("/health")
    public String health() {
        String result = String.format("success ... ,count:%s", count++);
        System.out.println(result);
        return result;
    }
}

DockerTest1Application

java 复制代码
package com.haiwei.docker_test1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DockerTest1Application {

	public static void main(String[] args) {
		SpringApplication.run(DockerTest1Application.class, args);
	}

}

D:\workspace3\docker-test1\Dockerfile

复制代码
# base镜像:ubuntu+jdk17
FROM openjdk:17-jdk-slim

# ./target/docker-test1-0.0.1-SNAPSHOT.jar 相对于Dockerfile文件
# /opt/docker/docker-test1-0.0.1-SNAPSHOT.jar 这个文件路径不存在会自动创建
ADD ./target/docker-test1-0.0.1-SNAPSHOT.jar /opt/docker/docker-test1-0.0.1-SNAPSHOT.jar

# 暴露8080端口,只是提示,启动时还需要 -p 8080:8080
EXPOSE 8080

# 定义入口,启动容器,运行这条命令
ENTRYPOINT ["java", "-jar","/opt/docker/docker-test1-0.0.1-SNAPSHOT.jar"]

Docker操作

打包:docker build -t docker-test:1.0 .

docker build -t docker-test:1.0 .

DockerFile错误1:Unable to access jarfile

D:\workspace3\docker-test1> docker logs dt1

Error: Unable to access jarfile /opt/docker/docker-test1-0.0.1-SNAPSHOT.jar

如果是这样 ADD ./target/docker-test1-0.0.1-SNAPSHOT.jar /opt/docker 会报错 Error: Unable to access jarfile /opt/docker/docker-test1-0.0.1-SNAPSHOT.jar

清理容器

启动容器

docker run -d --name dt1 -p 8080:8080 docker-test:1.0

dt1为容器名称

查看日志

dt1容器名称

docker logs dt1

tail -f查看日志:docker logs -f dt1

进入容器查看jar包

查看镜像信息:docker inspect dt10

导出镜像

docker save -o d:/docker-test1.0.zip docker-test:1.0

docker save -o d:/docker-test1.1.tar docker-test:1.1

文件夹docker-test1.1文件夹:

docker常用命令

docker save -o d:/docker-test.zip docker-test:1.0

docker pull <image>:<tag> # 拉镜像

docker run --gpus all -it --rm <img> # 一次性运行

docker run -d --name web -p 80:80 <img> # 后台跑+端口映射

docker exec -it <name> bash # 进容器

docker logs -f <name> # 看日志

docker cp file <name>:/path # 拷文件

docker save -o m.tar <img> # 离线导出

docker load -i m.tar # 离线导入

docker image prune -a # 清旧镜像

配置Docker环境变量、监控检查,日志

Dockerfile2文件

java 复制代码
FROM maven:3.8.5-openjdk-17

ADD ./target/docker-test1-0.0.1-SNAPSHOT.jar /opt/app.jar

# 暴露8080端口,只是提示,启动时还需要 -p 8080:8080
EXPOSE 8080

# 设置环境变量
ENV SERVER_PORT=8080

# 每5秒执行一次健康检查,检查应用的健康端点,若失败则退出码为1,Docker会根据健康检查结果自动重启容器(如果配置了相应的重启策略)
HEALTHCHECK --interval=5s --timeout=3s \
  CMD curl --fail http://localhost:8080/health || exit 1

# 将日志输入到/opt/app.log 文件中
ENTRYPOINT ["java", "-Dserver.port=${SERVER_PORT}", "-jar","/opt/app.jar > /opt/app.log 2>&1"]

指定Dockerfile文件构建镜像

docker build -t docker-test:1.0 -f Dockerfile2 .

多层次构建容器缩小容器大小

Dockerfile

java 复制代码
FROM maven:3.8.5-openjdk-17 AS build

# 设置app为路径,后边的.就是相对路径
# 后边路径变动,可以使用WORKDIR切换
WORKDIR /app

# 因为maven repository 创建失败添加的
RUN mkdir -p /app/repository
ENV MAVEN_OPTS="-Dmaven.repo.local=/app/repository"

COPY pom.xml .
# # 先复制 pom.xml 并预下载依赖(利用 Docker 缓存)
RUN mvn dependency:go-offline -B

COPY src ./src
RUN mvn clean package -DskipTests

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=build /app/target/docker-test1-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/app.jar"]

搜索Maven jdk17

https://docker.aityp.com/i/search?site=All\&platform=All\&sort=名称排序\&search=maven

找官方:

点击进来:https://docker.aityp.com/image/docker.io/maven:3.8.5-openjdk-17

使用镜像pull,添加tag:

docker images:

第一层有源码是否可以看到源码

按照这个Dockerfile打包的镜像,有一层 是源码,build这一层, run镜像后,可以执行docker exec -it 能看到源码文件吗

附录

Docker 镜像源

设置--Docker Engine -- 编辑后 应用,并重启Docker

复制代码
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "registry-mirrors": [
    "http://f1361db2.m.daocloud.io",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.1panel.live",
    "https://docker.1ms.run",
    "https://dytt.online",
    "https://docker-0.unsee.tech",
    "https://lispy.org",
    "https://docker.xiaogenban1993.com",
    "https://666860.xyz",
    "https://hub.rat.dev",
    "https://docker.m.daocloud.io",
    "https://demo.52013120.xyz",
    "https://proxy.vvvv.ee",
    "https://registry.cyou",
    "https://mirror.ccs.tencentyun.com"
  ]
}
相关推荐
todoitbo2 小时前
飞算JavaAI的多租户权限隔离实测
java·springboot·ai编程·java开发·飞算javaai·java代码生成
huaiixinsi3 小时前
Docker 负责打包,Kubernetes 负责调度:一文吃透容器化与 K8s 编排
docker·容器·kubernetes
凌涘4 小时前
Docker 入门:镜像、容器与反向代理
docker
风翼靓崽5 小时前
记一次使用snap 安装dive后,docker镜像和容器都看不到
运维·docker·容器
java_logo5 小时前
Docker 部署 openGauss:轻松搭建企业级开源关系型数据库平台
数据库·docker·开源·opengauss·轩辕镜像·opengauss部署教程·opengauss部署文档
HjhIron5 小时前
前端开发必会的Docker实战:从“我电脑能跑”到“轻松部署”
docker
嘟嘟07175 小时前
从浏览器到 hello world:Docker + nginx 反向代理 + Node 最小服务器一次讲清
docker·容器·node.js
阿黎梨梨6 小时前
Docker 容器化实战:从零搭建 Web 服务与反向代理
前端·后端·docker
小月土星6 小时前
当 LLM 遇上集装箱:我的 Docker 学习笔记与 AI 后端的思考(含反向代理Nginx)
后端·docker·容器