文章目录
- 1、原理
- 2、最佳实践
- 2.1、获得 SpringCloud 微服务启动模块的 jar 文件
- 2.2、准备文件夹和 Dockerfile 文件
- 2.3、 Dockerfile 文件的内容
- 2.4、通过命令行构件新镜像
- 3、异常情况和处理:failed to create LLB definition
- 3.1、现象
- 3.2、解决
- 配置国内镜像仓库
- 清理本地不使用 docker 资源
- 手动拉取镜像
- 再次build
- 4、运行
- 4.1、简单运行
- 4.2、使用 Docker Compose
1、原理
类似 借助 Dockerfile生成新镜像-以nginx为例 中,基于 Nginx 已有镜像,可以生成新的自定义镜像。
为 SpringCloud 项目生成自定义镜像的基础镜像是 Java jdk镜像,基于此,添加 SpringCloud 启动模块的 jar 包,生成一个新镜像
2、最佳实践
2.1、获得 SpringCloud 微服务启动模块的 jar 文件
参考 将一个 SpringCloud 微服务运行 以 jar 方式运行
2.2、准备文件夹和 Dockerfile 文件
- 把 2.1 中获得的jar 放到该目录下
- 创建 Dockerfile 文件
2.3、 Dockerfile 文件的内容
# 使用官方的Java运行时作为父镜像
FROM openjdk:8-jre-alpine
# 将当前目录下的可执行jar包复制到容器中的/app目录下
ADD bestcxx-starter.jar /app/bestcxx-starter.jar
# 声明容器运行时需要开放的端口
EXPOSE 8080
# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/app/bestcxx-starter.jar"]
2.4、通过命令行构件新镜像
在文件夹目录下打开命令行,执行命令
// . 表示 文件相对路径
`docker build -t bestcxx-starter:0.0.1 .
顺利的话,你可以在本地看到新生成了镜像了
3、异常情况和处理:failed to create LLB definition
3.1、现象
在文件夹目录下直接运行 docker build -t bestcxx-starter:0.0.1 .
控制台报错
➜ docker-bestcxx docker build -t bestcxx-starter:0.0.1 .
[+] Building 151.7s (3/3) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 606B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> ERROR [internal] load metadata for docker.io/library/openjdk:8-jre-al 151.6s
------
> [internal] load metadata for docker.io/library/openjdk:8-jre-alpine:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed commit on ref "unknown-sha256:360132d4d86b72fa978fa16437fe9aed6127dba50dc64149bc0f50ab9bd8af99": "unknown-sha256:360132d4d86b72fa978fa16437fe9aed6127dba50dc64149bc0f50ab9bd8af99" failed size validation: 8175 != 7882: failed precondition
3.2、解决
这种原因是网络不好,可以使用命令行单独拉取镜像,然后再运行 build
配置国内镜像源&清理缓存&手动拉镜像&build
配置国内镜像仓库
Docketesktop->Docker Engine
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com"
]
}
清理本地不使用 docker 资源
docker system prune -a //清理未使用的容器、镜像、网络和构建缓存。
docker system prune -a --volumes //在上述基础上还增加了对未使用的数据卷的清理。
手动拉取镜像
docker pull openjdk:8-jre-alpine
再次build
docker build -t bestcxx-starter:0.0.1 .
4、运行
4.1、简单运行
docker run -d -p 8877:8080 --name my_bestcxx_container bestcxx-starter:0.0.1
4.2、使用 Docker Compose
docker-compose up -d 运行
version: '3'
services:
my_bestcxx_container:
image: bestcxx-starter:0.0.1
container_name: my_bestcxx_container
ports:
- "8877:8080"
restart: always