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