Skip to main content

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 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

相关资源