返回文章列表

Docker 日常开发技巧集

Docker 已经成为现代开发工作流中不可或缺的工具。本文整理了一些在日常开发中高频使用的命令和技巧, 帮助你更高效地使用容器。

快速清理

开发久了,磁盘很容易被无用的镜像、容器和卷占满。以下命令可以快速清理:

# 删除所有停止的容器
docker container prune -f

# 删除未使用的镜像
docker image prune -a -f

# 删除未使用的卷
docker volume prune -f

# 一键清理所有未使用资源
docker system prune -a --volumes -f

多阶段构建

多阶段构建(Multi-stage Build)是减小镜像体积的最佳实践。 你可以在一个 Dockerfile 中使用多个 FROM 指令,每个阶段可以独立使用不同的基础镜像:

# 构建阶段
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o app .

# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/app .
CMD ["./app"]

这样最终镜像只包含编译后的二进制文件,体积可以从几百 MB 降到十几 MB。

.dockerignore 很重要

.gitignore 类似,.dockerignore 可以排除不需要发送到 Docker daemon 的文件。 这不仅能减小构建上下文,还能避免敏感信息泄露:

.git
.gitignore
node_modules
*.md
.env
.env.local
dist
build

Compose 开发技巧

使用 Docker Compose 时,可以通过挂载卷实现代码热重载:

services:
  app:
    build: .
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development

注意 - /app/node_modules 这行——它创建了一个匿名卷来覆盖主机上的 node_modules, 避免宿主机与容器内的依赖冲突。

调试容器

当容器无法正常启动时,可以使用以下命令调试:

# 查看容器日志
docker logs -f <container_id>

# 进入运行中的容器
docker exec -it <container_id> sh

# 以交互模式启动新容器(覆盖默认命令)
docker run --rm -it myimage sh

网络诊断

Docker 内置了 DNS 解析,容器之间可以通过服务名互相访问。如果网络不通,可以临时启动一个诊断容器:

docker run --rm --network mynetwork nicolaka/netshoot
dig myservice
ping myservice

总结

Docker 的学习曲线主要集中在前两周。一旦熟悉了镜像、容器、卷和网络的基本概念, 这些日常技巧会让你的开发效率显著提升。