实用技巧
嘿!长安来分享一些Docker实用技巧!这些都是我多年积累的宝贵经验!✨
🎯 命令行技巧
快速清理命令
# 停止所有容器
docker stop $(docker ps -q)
# 删除所有容器
docker rm $(docker ps -aq)
# 删除所有镜像
docker rmi $(docker images -q)
# 一键清理(危险!)
docker system prune -a --volumes -f
# 只清理停止的容器
docker container prune -f
# 只清理未使用的镜像
docker image prune -a -f
# 只清理未使用的数据卷
docker volume prune -f
查看命令
# 查看占用空间
docker system df
docker system df -v # 详细信息
# 查看容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container>
# 查看容器环境变量
docker exec <container> env
# 查看容器端口
docker port <container>
# 实时查看日志
docker logs -f --tail 100 <container>
批量操作
# 停止所有包含"test"的容器
docker ps -a | grep "test" | awk '{print $1}' | xargs docker stop
# 删除所有Exited状态的容器
docker rm $(docker ps -a -f status=exited -q)
# 删除所有<none>标签的镜像
docker rmi $(docker images -f "dangling=true" -q)
# 重启所有容器
docker restart $(docker ps -q)
🔍 调试技巧
调试正在运行的容器
# 进入容器
docker exec -it <container> sh
docker exec -it <container> bash
# 以root用户进入
docker exec -it -u root <container> sh
# 查看容器进程
docker top <container>
# 实时查看资源使用
docker stats <container>
# 查看容器变化
docker diff <container>
调试构建过程
# 显示构建详情
docker build --progress=plain -t myapp .
# 不使用缓存构建
docker build --no-cache -t myapp .
# 只构建到某个阶段
docker build --target development -t myapp:dev .
# 构建时显示时间戳
DOCKER_BUILDKIT=1 docker build --progress=plain -t myapp .
临时调试容器
# 运行临时容器(退出后自动删除)
docker run --rm -it alpine sh
# 挂载当前目录调试
docker run --rm -it -v $(pwd):/work alpine sh
# 使用其他镜像调试(包含更多工具)
docker run --rm -it nicolaka/netshoot
💡 Dockerfile技巧
多阶段构建技巧
# 使用构建参数
ARG NODE_VERSION=18
FROM node:${NODE_VERSION}-alpine AS base
# 共享基础阶段
FROM base AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci
# 开发阶段
FROM deps AS development
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
# 构建阶段
FROM deps AS builder
COPY . .
RUN npm run build
# 生产阶段
FROM base AS production
WORKDIR /app
COPY /app/dist ./dist
COPY /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]
优化技巧
# 1. 缓存依赖安装
COPY package*.json ./
RUN npm install
COPY . .
# 2. 使用缓存挂载(BuildKit)
RUN \
npm install
# 3. 合并RUN指令
RUN apt-get update && \
apt-get install -y package1 package2 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 4. 使用.dockerignore
# .dockerignore
node_modules
.git
*.md
# 5. 多行参数
RUN npm install \
package1 \
package2 \
package3
🎨 Docker Compose技巧
多环境配置
# docker-compose.yml (基础)
version: '3.8'
services:
app:
build: .
environment:
NODE_ENV: ${NODE_ENV}
# docker-compose.dev.yml (开发)
version: '3.8'
services:
app:
volumes:
- .:/app
ports:
- "3000:3000"
# docker-compose.prod.yml (生产)
version: '3.8'
services:
app:
restart: unless-stopped
deploy:
resources:
limits:
cpus: '1'
memory: 512M
使用:
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
实用命令
# 查看服务配置
docker-compose config
# 验证配置文件
docker-compose config --quiet
# 拉取所有镜像
docker-compose pull
# 构建不使用缓存
docker-compose build --no-cache
# 强制重新创建容器
docker-compose up -d --force-recreate
# 只启动特定服务
docker-compose up -d app redis
# 扩容服务
docker-compose up -d --scale app=3
# 查看服务日志(带颜色)
docker-compose logs -f --tail=100
🚀 性能优化技巧
镜像瘦身
# 1. 使用alpine基础镜像
FROM node:18-alpine # 而不是 node:18
# 2. 清理包管理器缓存
RUN npm ci --only=production && \
npm cache clean --force
# 3. 删除不需要的文件
RUN rm -rf /tmp/* /var/tmp/* /usr/share/doc/*
# 4. 使用多阶段构建
FROM node:18 AS builder
...
FROM node:18-alpine
COPY /app/dist ./dist
构建加速
# 1. 启用BuildKit
export DOCKER_BUILDKIT=1
# 2. 使用缓存挂载
RUN --mount=type=cache,target=/root/.npm npm install
# 3. 并行构建
docker build -t app1 app1 &
docker build -t app2 app2 &
wait
# 4. 使用本地registry缓存
docker run -d -p 5000:5000 registry:2
📝 脚本技巧
自动化脚本
deploy.sh:
#!/bin/bash
set -e
echo "🚀 开始部署..."
# 拉取最新代码
git pull origin main
# 构建镜像
docker-compose build
# 停止旧容器
docker-compose down
# 启动新容器
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs --tail=50
echo "✅ 部署完成!"
backup.sh:
#!/bin/bash
set -e
BACKUP_DIR="./backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "📦 开始备份..."
# 备份MySQL
docker exec mysql mysqldump -uroot -p${DB_PASSWORD} --all-databases \
> "$BACKUP_DIR/mysql.sql"
# 备份MongoDB
docker exec mongo mongodump --out=/tmp/backup
docker cp mongo:/tmp/backup "$BACKUP_DIR/mongo"
# 备份数据卷
docker run --rm \
-v mysql-data:/data \
-v $(pwd):/backup \
alpine tar -czf /backup/$BACKUP_DIR/mysql-data.tar.gz -C /data .
echo "✅ 备份完成!"
health-check.sh:
#!/bin/bash
echo "🔍 健康检查..."
# 检查容器状态
for container in $(docker ps --format '{{.Names}}'); do
health=$(docker inspect --format='{{.State.Health.Status}}' $container 2>/dev/null)
if [ "$health" = "healthy" ] || [ "$health" = "" ]; then
echo "✅ $container: OK"
else
echo "❌ $container: $health"
fi
done
# 检查磁盘空间
echo ""
echo "💾 磁盘使用:"
docker system df
# 检查资源使用
echo ""
echo "📊 资源使用:"
docker stats --no-stream
🔐 安全技巧
扫描镜像漏洞
# 使用Trivy
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image myapp:latest
# 使用Docker Scout
docker scout cves myapp:latest
# 使用Snyk
snyk container test myapp:latest
最小权限运行
# 创建非root用户
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
COPY . .
USER nodejs
CMD ["node", "app.js"]
敏感信息管理
# 使用secrets(Docker Swarm)
docker secret create db_password ./password.txt
# 使用环境变量文件(记得加入.gitignore)
docker run --env-file .env myapp
# 使用Vault等密钥管理工具
📊 监控技巧
简单监控
# 实时查看所有容器资源
watch -n 1 'docker stats --no-stream'
# 查看特定容器
docker stats myapp
# 导出监控数据
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" > stats.txt
日志管理
# 限制日志大小
docker run \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp
# 使用syslog
docker run \
--log-driver syslog \
--log-opt syslog-address=tcp://192.168.1.100:514 \
myapp
# 查看日志文件位置
docker inspect --format='{{.LogPath}}' <container>
💡 别名技巧
把这些加到 ~/.bashrc 或 ~/.zshrc:
# 常用命令别名
alias dps='docker ps'
alias dpsa='docker ps -a'
alias di='docker images'
alias dex='docker exec -it'
alias dl='docker logs -f --tail 100'
alias dstop='docker stop $(docker ps -q)'
alias drm='docker rm $(docker ps -aq)'
alias drmi='docker rmi $(docker images -q)'
alias dprune='docker system prune -af'
# Docker Compose
alias dc='docker-compose'
alias dcu='docker-compose up -d'
alias dcd='docker-compose down'
alias dcl='docker-compose logs -f'
alias dcps='docker-compose ps'
alias dcr='docker-compose restart'
# 查看资源
alias dstats='docker stats --no-stream'
alias ddf='docker system df'
# 进入容器
denter() {
docker exec -it $1 sh
}
# 查看日志
dlogs() {
docker logs -f --tail 100 $1
}
🎯 开发技巧
热更新配置
services:
app:
volumes:
- .:/app # 代码同步
- /app/node_modules # 不同步node_modules
environment:
- CHOKIDAR_USEPOLLING=true # 文件监听(Windows/Mac需要)
调试配置
services:
app:
ports:
- "9229:9229" # Node.js调试端口
command: node --inspect=0.0.0.0:9229 app.js
数据库初始化
services:
postgres:
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
💡 小结
今天长安分享了一大堆实用技巧:
技巧分类
- 命令行技巧:快速清理、查看、批量操作
- 调试技巧:进入容器、查看日志
- Dockerfile技巧:多阶段构建、优化
- Compose技巧:多环境配置
- 性能优化:镜像瘦身、构建加速
- 脚本技巧:自动化部署、备份
- 安全技巧:漏洞扫描、最小权限
- 监控技巧:资源监控、日志管理
记住这些
- 使用别名提高效率
- 定期清理释放空间
- 使用脚本自动化
- 注意安全和监控
🎉 结语
恭喜你! 你已经完成了长安的Docker教程!
从零基础到现在,你已经学会了:
- Docker基础概念
- 镜像和容器操作
- Dockerfile编写
- 数据和网络管理
- Docker Compose
- 性能优化
- 最佳实践
- 实战项目
你现在是Docker高手了! 🎊
继续加油,多实践,遇到问题随时来编程指南找长安!💪
💬 长安的最后寄语:
Docker学习到这里,基本功已经练得差不多了。
但记住:纸上得来终觉浅,绝知此事要躬行!
建议你:
- 把自己的项目用Docker改造一遍
- 搭建一个完整的开发环境
- 尝试部署到生产环境
- 持续关注Docker新特性
最重要的是:保持学习的热情!
Docker只是工具,真正重要的是用它解决实际问题。
祝你成为优秀的开发者!
有问题随时来 编程指南 找我!
🌐 编程指南:https://code-guide.vip/
📧 联系长安:shczxwlkj@163.com长安在此,江湖再见! 👋
