分三大部分说明:
Dockerfile 编写(把本地业务代码打包进镜像)
构建镜像、推送到私服完整命令流程
私服认证、常见踩坑(私有仓库 http/https、内网地址)
一、通用 Dockerfile 模板(分 Java/SpringBoot、Vue 前端、Go 三种主流业务)
场景 1:Java SpringBoot(最常用)
项目结构示例
项目根目录
├── Dockerfile
├── target
│ └── demo.jar # mvn clean package打包产物
└── src
Dockerfile
# 基础JDK镜像(推荐私有仓库镜像,避免拉取外网)
FROM 192.168.1.100:8082/library/openjdk:17-jre-slim
# 设置工作目录
WORKDIR /app
# 复制本地业务jar包到容器内
COPY target/demo.jar app.jar
# 容器启动命令
ENTRYPOINT ["java","-jar","app.jar"]
# 暴露服务端口
EXPOSE 8080
场景 2:Vue/React 前端(Node 打包产物 dist)
# 私有仓库nginx基础镜像
FROM 192.168.1.100:8082/library/nginx:alpine
WORKDIR /usr/share/nginx/html
# 复制本地打包好的前端代码dist文件夹
COPY dist/ .
# 替换nginx配置(可选)
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
场景 3:Go 后端(二进制产物)
FROM 192.168.1.100:8082/library/alpine:3.19
WORKDIR /app
# 复制本地编译好的go二进制文件
COPY ./app ./app
RUN chmod +x ./app
EXPOSE 8090
CMD ["./app"]
二、关键语法说明:本地业务代码写入镜像核心指令
1. COPY(推荐,本地文件复制到容器)
# 格式:COPY 本地路径(相对Dockerfile) 容器内路径
COPY target/*.jar /app/
COPY dist/ /html/
COPY config/application.yml /app/config/
路径相对 Dockerfile 文件执行构建时的上下文目录
文件夹带
/代表复制文件夹内所有内容,不带则复制文件夹本身
2. ADD(扩展 COPY,支持压缩包自动解压,业务代码优先用 COPY)
ADD code.tar.gz /app/ # 自动解压tar压缩包
3. .dockerignore(必写,加速构建、减小镜像)
和 Dockerfile 同目录新建 .dockerignore,过滤不需要打进镜像的文件
# java过滤
target/*.original
.git
.idea
logs
tmp
node_modules
*.md
三、构建镜像 + 推送到私有 Docker 私服完整流程
私服地址示例:192.168.1.100:8082 仓库命名规范:私服地址/仓库名/镜像名:版本
步骤 1:登录私有仓库(必须先认证)
# 交互输入账号密码
docker login 192.168.1.100:8082
# 非交互脚本批量构建用
echo "私服密码" | docker login 192.168.1.100:8082 -u 账号 --password-stdin
步骤 2:打包业务代码(以 Java 为例)
mvn clean package -DskipTests
步骤 3:构建镜像,标签直接带上私服地址
# 语法 docker build -t 私服地址/项目仓库/镜像名:版本 .
docker build -t 192.168.1.100:8082/biz/demo-service:v1.0 .
末尾 . 代表构建上下文是当前目录(读取 Dockerfile、本地代码)
步骤 4:推送镜像到私服
docker push 192.168.1.100:8082/biz/demo-service:v1.0
四、内网私服 http 无证书报错解决(常见问题)
私服如果是 http(非 https),Docker 默认拒绝推送,修改 daemon 配置:
修改 docker 配置
/etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.100:8082"]
}
重启 docker
systemctl daemon-reload
systemctl restart docker
五、多阶段构建(推荐!减小镜像体积,本地不用提前打包)
适合 Java/Go,直接在容器内编译业务代码,不用本地编译产物,代码直接写入构建阶段,示例 Java 多阶段:
# 阶段1:编译代码(构建阶段)
FROM 192.168.1.100:8082/library/maven:3.9-openjdk17 AS builder
WORKDIR /build
# 把本地完整业务代码复制进构建容器
COPY . .
# 容器内打包
RUN mvn clean package -DskipTests
# 阶段2:运行镜像(只拷贝jar,无maven源码,镜像极小)
FROM 192.168.1.100:8082/library/openjdk:17-jre-slim
WORKDIR /app
# 从构建阶段拷贝打包好的jar
COPY --from=builder /build/target/demo.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
优势:CI 流水线无需本地打包,代码直接 COPY 进镜像编译,统一环境。
六、CI / 自动化脚本完整示例(一键打包推送私服)
#!/bin/bash
REGISTRY="192.168.1.100:8082"
REPO="biz/demo-service"
TAG="v1.0"
# 1.打包代码
mvn clean package -DskipTests
# 2.构建镜像
docker build -t ${REGISTRY}/${REPO}:${TAG} .
# 3.推送私服
docker push ${REGISTRY}/${REPO}:${TAG}
echo "推送完成:${REGISTRY}/${REPO}:${TAG}"
七、核心注意点
COPY 路径是构建上下文相对路径,docker build 末尾
.决定上下文根目录;镜像 tag 必须包含私服完整地址,否则 push 会推送到 docker.io 公有仓库;
私有仓库必须先 login 认证,否则 push 返回 401 未授权;
内网 http 私服务必配置
insecure-registries,否则构建推送失败;多阶段构建分离编译与运行环境,镜像体积大幅降低,生产推荐。
原文链接
欢迎访问 小易撩挨踢