长安的Docker教程长安的Docker教程
首页
快速开始
编程指南
首页
快速开始
编程指南
  • 🎯 Docker入门篇

    • 快速开始
    • Docker是什么?
    • 为什么要用Docker?
    • 安装Docker
    • 第一个容器
  • 📦 Docker基础篇

    • Docker镜像详解
    • 容器操作详解
    • 编写Dockerfile
    • 数据卷(Volumes)
    • Docker网络
  • ⚡ Docker进阶篇

    • Docker Compose
    • 多阶段构建
    • Docker性能优化
    • Docker最佳实践
  • 🚀 实战项目

    • 实战:部署Node.js应用
    • 实战:搭建数据库环境
    • 实战:微服务架构
  • 💡 常见问题

    • 常见问题排查
    • 实用技巧

实用技巧

嘿!长安来分享一些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 --from=builder /app/dist ./dist
COPY --from=deps /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

优化技巧

# 1. 缓存依赖安装
COPY package*.json ./
RUN npm install
COPY . .

# 2. 使用缓存挂载(BuildKit)
RUN --mount=type=cache,target=/root/.npm \
    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 --from=builder /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 --chown=nodejs:nodejs . .

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

💡 小结

今天长安分享了一大堆实用技巧:

技巧分类

  1. 命令行技巧:快速清理、查看、批量操作
  2. 调试技巧:进入容器、查看日志
  3. Dockerfile技巧:多阶段构建、优化
  4. Compose技巧:多环境配置
  5. 性能优化:镜像瘦身、构建加速
  6. 脚本技巧:自动化部署、备份
  7. 安全技巧:漏洞扫描、最小权限
  8. 监控技巧:资源监控、日志管理

记住这些

  • 使用别名提高效率
  • 定期清理释放空间
  • 使用脚本自动化
  • 注意安全和监控

🎉 结语

恭喜你! 你已经完成了长安的Docker教程!

从零基础到现在,你已经学会了:

  • Docker基础概念
  • 镜像和容器操作
  • Dockerfile编写
  • 数据和网络管理
  • Docker Compose
  • 性能优化
  • 最佳实践
  • 实战项目

你现在是Docker高手了! 🎊

继续加油,多实践,遇到问题随时来编程指南找长安!💪


💬 长安的最后寄语:

Docker学习到这里,基本功已经练得差不多了。

但记住:纸上得来终觉浅,绝知此事要躬行!

建议你:

  1. 把自己的项目用Docker改造一遍
  2. 搭建一个完整的开发环境
  3. 尝试部署到生产环境
  4. 持续关注Docker新特性

最重要的是:保持学习的热情!

Docker只是工具,真正重要的是用它解决实际问题。

祝你成为优秀的开发者!

有问题随时来 编程指南 找我!

🌐 编程指南:https://code-guide.vip/
📧 联系长安:shczxwlkj@163.com

长安在此,江湖再见! 👋

在 GitHub 上编辑此页
Prev
常见问题排查