代码 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"
]
}
