Docker 基础命令和技巧
镜像管理
查看镜像
# 列出所有镜像
docker images
docker image ls
# 显示所有镜像(包括中间层镜像)
docker images -a
# 只显示镜像 ID
docker images -q
# 格式化输出
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 查看镜像详细信息
docker inspect nginx:latest
# 查看镜像历史
docker history nginx:latest
拉取镜像
# 拉取最新版本
docker pull nginx
# 拉取指定版本
docker pull nginx:1.24
# 从指定仓库拉取
docker pull registry.example.com/nginx:latest
# 拉取所有标签的镜像
docker pull -a nginx
构建镜像
# 基本构建
docker build -t myapp:latest .
# 指定 Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .
# 不使用缓存构建
docker build --no-cache -t myapp:latest .
# 传递构建参数
docker build --build-arg VERSION=1.0 -t myapp:1.0 .
# 指定构建平台
docker build --platform linux/amd64 -t myapp:latest .
# 多阶段构建
docker build --target production -t myapp:prod .
删除镜像
# 删除指定镜像
docker rmi nginx:latest
# 强制删除镜像
docker rmi -f nginx:latest
# 删除所有未使用的镜像
docker image prune
# 删除所有镜像
docker rmi $(docker images -q)
# 删除悬空镜像(dangling images)
docker image prune -a
# 删除指定时间前创建的镜像
docker image prune --filter "until=24h"
镜像标签
# 给镜像打标签
docker tag myapp:latest myapp:v1.0
# 推送到仓库
docker push myapp:v1.0
# 从仓库删除镜像
docker rmi myapp:v1.0
docker push myapp:v1.0 --delete
保存和加载镜像
# 保存镜像到文件
docker save nginx:latest -o nginx.tar
docker save nginx:latest > nginx.tar
# 压缩保存
docker save nginx:latest | gzip > nginx.tar.gz
# 加载镜像
docker load -i nginx.tar
docker load < nginx.tar
# 从压缩文件加载
gunzip -c nginx.tar.gz | docker load
容器管理
运行容器
# 基本运行
docker run nginx
# 后台运行
docker run -d nginx
# 指定容器名称
docker run -d --name mynginx nginx
# 端口映射
docker run -d -p 8080:80 nginx
docker run -d -p 127.0.0.1:8080:80 nginx
# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=password mysql
# 挂载数据卷
docker run -d -v /data:/var/lib/mysql mysql
docker run -d -v myvolume:/data nginx
# 只读挂载
docker run -d -v /data:/app:ro nginx
# 限制资源
docker run -d --memory="512m" --cpus="1.0" nginx
# 重启策略
docker run -d --restart=always nginx
docker run -d --restart=on-failure:3 nginx
# 网络配置
docker run -d --network mynetwork nginx
# 自动删除容器
docker run --rm nginx
# 交互式运行
docker run -it ubuntu bash
查看容器
# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a
# 只显示容器 ID
docker ps -q
# 格式化输出
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 查看容器详细信息
docker inspect mynginx
# 查看容器日志
docker logs mynginx
docker logs -f mynginx # 实时查看
docker logs --tail 100 mynginx # 最后100行
docker logs --since 10m mynginx # 最近10分钟
# 查看容器进程
docker top mynginx
# 查看容器资源使用
docker stats
docker stats mynginx
容器操作
# 启动容器
docker start mynginx
# 停止容器
docker stop mynginx
# 重启容器
docker restart mynginx
# 暂停/恢复容器
docker pause mynginx
docker unpause mynginx
# 杀死容器
docker kill mynginx
# 进入容器
docker exec -it mynginx bash
docker exec -it mynginx sh
# 在容器中执行命令
docker exec mynginx ls /etc/nginx
docker exec -u root mynginx chown -R nginx:nginx /var/www
# 从容器复制文件
docker cp mynginx:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./index.html mynginx:/usr/share/nginx/html/
删除容器
# 删除容器
docker rm mynginx
# 强制删除运行中的容器
docker rm -f mynginx
# 删除所有停止的容器
docker container prune
# 删除所有容器
docker rm $(docker ps -aq)
# 停止并删除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
数据卷管理
卷操作
# 创建数据卷
docker volume create mydata
# 列出所有卷
docker volume ls
# 查看卷详情
docker volume inspect mydata
# 删除数据卷
docker volume rm mydata
# 删除所有未使用的卷
docker volume prune
# 删除所有卷
docker volume rm $(docker volume ls -q)
挂载类型
- 命名卷
- 绑定挂载
- 临时文件系统
# 创建并使用命名卷
docker volume create mydata
docker run -d -v mydata:/data nginx
# 卷会存储在 Docker 管理的目录中
# Linux: /var/lib/docker/volumes/
# Windows: C:\ProgramData\Docker\volumes\
# 挂载主机目录
docker run -d -v /host/path:/container/path nginx
docker run -d --mount type=bind,source=/host/path,target=/container/path nginx
# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx
# 挂载单个文件
docker run -d -v /host/config.conf:/etc/app/config.conf nginx
# 挂载到内存
docker run -d --tmpfs /app/cache:rw,size=100m nginx
# 使用 --mount 语法
docker run -d --mount type=tmpfs,destination=/app/cache,tmpfs-size=100m nginx
网络管理
网络操作
# 列出网络
docker network ls
# 创建网络
docker network create mynet
# 创建指定驱动的网络
docker network create --driver bridge mynet
# 指定子网
docker network create --subnet=172.18.0.0/16 mynet
# 查看网络详情
docker network inspect mynet
# 连接容器到网络
docker network connect mynet mynginx
# 断开容器网络连接
docker network disconnect mynet mynginx
# 删除网络
docker network rm mynet
# 清理未使用的网络
docker network prune
网络模式
# bridge(默认)
docker run -d --network bridge nginx
# host(使用主机网络)
docker run -d --network host nginx
# none(无网络)
docker run -d --network none nginx
# container(共享其他容器网络)
docker run -d --network container:mynginx nginx
# 自定义网络
docker network create myapp-net
docker run -d --network myapp-net --name db mysql
docker run -d --network myapp-net --name app myapp
Docker Compose
基本命令
# 启动服务
docker-compose up
docker-compose up -d # 后台运行
docker-compose up --build # 构建并启动
docker-compose up --scale web=3 # 扩展服务
# 停止服务
docker-compose stop
docker-compose down # 停止并删除容器
docker-compose down -v # 同时删除数据卷
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs
docker-compose logs -f web # 实时查看特定服务日志
# 执行命令
docker-compose exec web bash
docker-compose run --rm web python manage.py migrate
# 构建镜像
docker-compose build
docker-compose build --no-cache
# 重启服务
docker-compose restart
docker-compose restart web
# 拉取镜像
docker-compose pull
配置验证
# 验证配置文件
docker-compose config
# 查看配置
docker-compose config --services
docker-compose config --volumes
系统管理
系统信息
# 查看 Docker 信息
docker info
# 查看 Docker 版本
docker version
docker --version
# 查看磁盘使用情况
docker system df
docker system df -v
# 查看事件
docker events
docker events --since '2024-01-01'
清理资源
# 清理所有未使用的资源
docker system prune
# 清理所有资源(包括未使用的镜像)
docker system prune -a
# 清理所有资源(包括数据卷)
docker system prune -a --volumes
# 清理指定时间前的资源
docker system prune --filter "until=24h"
# 一键清理
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
docker volume rm $(docker volume ls -q)
docker network rm $(docker network ls -q)
实用技巧
1. 快速进入容器
# 创建别名
alias dexec='docker exec -it'
# 使用
dexec mynginx bash
2. 批量操作
# 停止所有容器
docker stop $(docker ps -aq)
# 删除所有停止的容器
docker rm $(docker ps -a -q -f status=exited)
# 删除所有 "none" 镜像
docker rmi $(docker images -f "dangling=true" -q)
# 删除指定前缀的镜像
docker rmi $(docker images | grep "^myapp" | awk '{print $3}')
3. 查看容器 IP
# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx
# 查看所有容器 IP
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)
4. 监控容器资源
# 实时监控所有容器
docker stats
# 监控指定容器
docker stats mynginx myredis
# 只显示一次
docker stats --no-stream
# 格式化输出
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
5. 导出和导入容器
# 导出容器为 tar 文件
docker export mynginx > mynginx.tar
# 导入为镜像
docker import mynginx.tar mynginx:backup
# 提交容器为镜像
docker commit mynginx mynginx:v1.0
6. 容器日志管理
# 限制日志大小
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
# 查看日志配置
docker inspect -f '{{.HostConfig.LogConfig}}' mynginx
7. 容器健康检查
# 运行时添加健康检查
docker run -d \
--health-cmd="curl -f http://localhost/ || exit 1" \
--health-interval=30s \
--health-timeout=3s \
--health-retries=3 \
nginx
# 查看健康状态
docker inspect --format='{{.State.Health.Status}}' mynginx
8. 使用 .dockerignore
# .dockerignore 示例
node_modules
npm-debug.log
.git
.env
*.md
.DS_Store
9. 多阶段构建优化
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]
10. 使用 BuildKit
# 启用 BuildKit
export DOCKER_BUILDKIT=1
# 使用缓存挂载
docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t myapp .
# 使用私密信息
docker build --secret id=npm,src=$HOME/.npmrc -t myapp .
常用组合命令
快速部署应用
# 构建、停止、删除、运行
docker build -t myapp . && \
docker stop myapp || true && \
docker rm myapp || true && \
docker run -d --name myapp -p 8080:80 myapp
更新容器
# 拉取最新镜像并重启容器
docker pull nginx:latest && \
docker stop mynginx && \
docker rm mynginx && \
docker run -d --name mynginx -p 80:80 nginx:latest
备份容器数据
# 备份数据卷
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
alpine tar czf /backup/backup.tar.gz -C /data .
# 恢复数据卷
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/backup.tar.gz -C /data
查找占用空间的容器
docker ps -s --format "table {{.Names}}\t{{.Size}}" | sort -k 2 -h
调试技巧
1. 查看容器启动失败原因
# 查看容器日志
docker logs myapp
# 查看最后 N 行
docker logs --tail 50 myapp
# 查看详细信息
docker inspect myapp
2. 容器网络调试
# 进入容器安装网络工具
docker exec -it myapp bash
apt-get update && apt-get install -y curl wget telnet
# 测试网络连接
docker exec myapp curl -v http://api.example.com
docker exec myapp ping google.com
# 查看容器网络配置
docker exec myapp ip addr
docker exec myapp netstat -tulpn
3. 文件系统调试
# 查看容器文件系统变化
docker diff myapp
# 查看容器磁盘使用
docker exec myapp df -h
# 查找大文件
docker exec myapp du -sh /* | sort -h
4. 进程调试
# 查看容器进程
docker top myapp
# 在容器内查看进程
docker exec myapp ps aux
# 查看进程资源使用
docker exec myapp top
性能优化
1. 镜像优化
# 使用更小的基础镜像
FROM alpine:3.18
# 合并 RUN 命令
RUN apk add --no-cache nginx && \
rm -rf /var/cache/apk/*
# 使用 .dockerignore
# 清理缓存和临时文件
# 使用多阶段构建
2. 容器优化
# 限制资源使用
docker run -d \
--memory="512m" \
--memory-swap="1g" \
--cpus="1.0" \
--cpu-shares=512 \
nginx
# 使用只读文件系统
docker run -d --read-only --tmpfs /tmp nginx
3. 网络优化
# 使用 host 网络模式(性能最好)
docker run -d --network host nginx
# 使用自定义网络(更好的隔离)
docker network create --driver bridge mynet
安全最佳实践
1. 使用非 root 用户
FROM node:18-alpine
# 创建用户
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
# 切换用户
USER nodejs
WORKDIR /app
COPY --chown=nodejs:nodejs . .
CMD ["node", "app.js"]
2. 扫描镜像漏洞
# 使用 Docker Scout
docker scout quickview nginx:latest
docker scout cves nginx:latest
# 使用 Trivy
trivy image nginx:latest
3. 限制容器权限
# 删除不必要的权限
docker run -d \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
nginx
# 只读根文件系统
docker run -d --read-only --tmpfs /tmp nginx
# 禁用特权模式
docker run -d --security-opt=no-new-privileges nginx
故障排查
1. 容器无法启动
# 查看容器日志
docker logs myapp
# 查看容器退出代码
docker inspect myapp --format='{{.State.ExitCode}}'
# 交互式启动排查
docker run -it --rm myapp sh
2. 端口已被占用
# 查找占用端口的进程
lsof -i:8080
netstat -tulpn | grep 8080
# 更换端口
docker run -d -p 8081:80 nginx
3. 磁盘空间不足
# 查看磁盘使用
docker system df
# 清理未使用的资源
docker system prune -a --volumes
# 查看大文件
docker ps -s
4. 网络连接问题
# 检查网络配置
docker network inspect bridge
# 重启 Docker 服务
sudo systemctl restart docker
# 重建网络
docker network rm mynet
docker network create mynet