常见的项目Dockerfile
golang项目
# 构建阶段
FROM golang:1.23 AS builder
# 设置工作目录,
WORKDIR /app
# 复制go.mod和go.sum文件
COPY go.mod go.sum ./
# 设置goproxy
RUN go env -w GOPROXY='https://goproxy.io,https://goproxy.cn,direct'
# 下载依赖
RUN go mod download
# 复制源代码
COPY . .
# 构建应用
RUN CGO_ENABLED=0 GOOS=linux go build -o server .
# 运行阶段
FROM alpine:latest
# 安装ca-certificates以支持HTTPS,
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# 从构建阶段复制编译好的二进制文件
COPY --from=builder /app/server .
# 暴露端口(如果您的应用监听某个端口)
EXPOSE 8080
# 运行应用
CMD ["./main"]
这个dockerfile使用多阶段构建来减小最终镜像的大小。
-
第一阶段(builder)编译Go应用程序。
-
第二阶段使用轻量级的Alpine镜像作为运行环境。
-
从构建阶段复制编译好的二进制文件到运行环境。
-
设置CMD指令来运行应用程序
apk
是 Alpine Linux 的包管理器,类似于 Ubuntu 的apt
或 CentOS 的yum
。在 Dockerfile 中,我们使用apk
来安装、更新或删除 Alpine Linux 容器中的软件包。比如下面的这个 Dockerfile 中的
apk
命令:RUN apk add --no-cache git
这条命令在 Alpine Linux 容器中安装 git。
add
是安装包的子命令--no-cache
选项告诉apk
不要缓存下载的包,这有助于保持镜像小巧git
是要安装的包名
RUN apk --no-cache add ca-certificates
这条命令安装 CA 证书,这通常是必要的,以确保 HTTPS 连接正常工作。一些常用的
apk
命令:
apk update
: 更新可用包的列表apk add <package>
: 安装一个包apk del <package>
: 删除一个包apk info
: 列出已安装的包在 Dockerfile 中使用 Alpine Linux 和
apk
的主要优点是:
- Alpine 镜像非常小(约 5MB),这有助于保持最终 Docker 镜像的小巧
apk
操作通常很快,这有助于加速 Docker 构建过程- Alpine 提供了大多数常用软件包,尽管有时可能需要使用
-edge
仓库来获取最新版本需要注意的是,由于 Alpine 使用 musl libc 而不是更常见的 glibc,某些应用程序可能会遇到兼容性问题。但对于大多数 Go 应用程序来说,这通常不是问题,因为 Go 可以静态链接所有依赖。
** Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大 **
-
构建 Docker 镜像:
docker build -t your-app-name .
-
运行 Docker 容器:
docker run your-app-name
-
构建完成后,您可以使用以下命令检查镜像大小:
docker images your-app-name
一个前端项目
Dockerfile
# 第一阶段:依赖安装和构建
FROM node:18-alpine AS builder
# 设置工作目录
WORKDIR /app
# 安装 pnpm 并配置国内镜像源
RUN corepack enable && corepack prepare [email protected] --activate
RUN pnpm config set registry https://registry.npmmirror.com && \
pnpm config set disturl https://npmmirror.com/mirrors/node && \
pnpm config set electron_mirror https://npmmirror.com/mirrors/electron/
# 复制 package.json 和 pnpm-lock.yaml
COPY package.json ./
COPY pnpm-lock.yaml ./
# 添加 packageManager 字段到 package.json
RUN npm pkg set packageManager="[email protected]"
# 安装依赖(使用配置好的镜像源)
RUN pnpm install || pnpm install --force
# 复制源代码
COPY . .
# 构建应用
RUN pnpm build
# 第二阶段:生产环境
FROM node:18-alpine AS runner
WORKDIR /app
# 安装 pnpm 并配置国内镜像源
RUN corepack enable && corepack prepare [email protected] --activate && \
pnpm config set registry https://registry.npmmirror.com
# 设置为生产环境
ENV NODE_ENV production
# 从builder阶段复制必要文件
COPY --from=builder /app/package.json ./
COPY --from=builder /app/pnpm-lock.yaml ./
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
COPY --from=builder /app/next.config.js ./
# 仅安装生产依赖
RUN npm pkg set packageManager="[email protected]" && \
pnpm install --prod
# 添加非 root 用户
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs && \
chown -R nextjs:nodejs /app
USER nextjs
# 暴露端口 3000
EXPOSE 3000
# 设置环境变量
ENV PORT 3000
ENV HOSTNAME "0.0.0.0"
# 启动应用
CMD ["pnpm", "start"]
Docker构建与发布
本地构建镜像
# 在Dockerfile 所在目录执行构建命令
docker build -t your-app-name:latest .
# 示例:如果你的应用名为 my-next-app
docker build -t my-next-app:latest .
本地运行镜像
# 基本运行命令
docker run -p 3000:3000 your-app-name:latest
# 使用后台运行模式
docker run -d -p 3000:3000 your-app-name:latest
# 如果需要指定环境变量
docker run -d -p 3000:3000 \-e NODE_ENV=production \
your-app-name:latest
访问 http://localhost:3000
即可看到应用运行效果。
推送到 DockerHub
准备工作
# 1. 登录到 DockerHub
docker login
# 2. 为镜像添加标签(格式:用户名/镜像名:标签)
docker tag your-app-name:latest your-dockerhub-username/your-app-name:latest
# 示例:
# docker tag my-next-app:latest johndoe/my-next-app:latest
推送镜像
# 推送到 DockerHub
docker push your-dockerhub-username/your-app-name:latest
常用管理命令
# 查看本地镜像列表
docker images
# 查看运行中的容器
docker ps
# 停止运行中的容器
docker stop <container-id>
# 删除容器
docker rm <container-id>
# 删除镜像
docker rmi <image-id>
注意事项
-
镜像命名规范
- 使用小写字母
- 可以包含数字和下划线
- 版本标签建议语义化,如
v1.0.0
、latest
-
安全建议
- 不要在镜像中包含敏感信息
- 推送前确保镜像已经完全测试
- 使用
.dockerignore
排除不必要的文件
-
资源清理
# 清理未使用的镜像和容器 docker system prune -a
-
查看容器日志
# 查看容器运行日志 docker logs <container-id> # 实时查看日志 docker logs -f <container-id>
常见问题排查
-如果无法访问应用,检查端口映射是否正确
- 如果推送失败,确认是否正确登录 DockerHub
- 如果构建失败,检查 Dockerfile 语法和依赖配置
这些步骤将帮助你完成从本地构建到部署到 DockerHub 的完整流程。记得替换示例中的 your-app-name
和 your-dockerhub-username
为你实际使用的名称。