Docker 速查手册

Docker 镜像、容器、网络、Compose、Dockerfile 常用操作速查

镜像管理(7)

拉取镜像

从 Docker Hub 拉取镜像

# 拉取最新版
docker pull nginx
# 拉取指定版本
docker pull nginx:1.25
# 拉取指定平台
docker pull --platform linux/amd64 nginx

查看本地镜像

列出本地所有镜像

docker images
# 按大小排序
docker images --format '{{.Repository}}:{{.Tag}} {{.Size}}'

构建镜像

从 Dockerfile 构建镜像

# 当前目录构建
docker build -t myapp:1.0 .
# 指定 Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .
# 不使用缓存
docker build --no-cache -t myapp:1.0 .

删除镜像

删除本地镜像

# 删除单个
docker rmi nginx:latest
# 强制删除
docker rmi -f myapp:1.0
# 删除所有无标签镜像
docker image prune

镜像标签

给镜像打标签

docker tag myapp:1.0 registry.example.com/myapp:1.0

推送镜像

推送镜像到仓库

# 登录
docker login registry.example.com
# 推送
docker push registry.example.com/myapp:1.0

导出/导入镜像

镜像备份与恢复

# 导出
docker save -o myapp.tar myapp:1.0
# 导入
docker load -i myapp.tar

容器生命周期(5)

运行容器

创建并启动容器

# 基本运行
docker run -d --name myapp nginx
# 端口映射
docker run -d -p 8080:80 nginx
# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql:8
# 挂载目录
docker run -d -v /host/path:/container/path nginx
# 限制资源
docker run -d --memory=512m --cpus=1 myapp

启动/停止容器

管理容器状态

docker start myapp
docker stop myapp
docker restart myapp

删除容器

删除已停止的容器

# 删除单个
docker rm myapp
# 强制删除运行中的
docker rm -f myapp
# 删除所有已停止容器
docker container prune

进入容器

在运行中的容器内执行命令

# 进入 bash
docker exec -it myapp bash
# 进入 sh
docker exec -it myapp sh
# 执行单条命令
docker exec myapp ls /app

复制文件

容器与宿主机间复制文件

# 从容器复制到宿主机
docker cp myapp:/app/log.txt ./log.txt
# 从宿主机复制到容器
docker cp ./config.yml myapp:/app/config.yml

容器信息(5)

查看运行中容器

列出正在运行的容器

# 运行中的
docker ps
# 所有容器
docker ps -a
# 只显示 ID
docker ps -q

查看日志

查看容器输出日志

# 全部日志
docker logs myapp
# 实时跟踪
docker logs -f myapp
# 最后 100 行
docker logs --tail 100 myapp
# 带时间戳
docker logs -t myapp

查看资源占用

实时监控容器资源使用

# 所有容器
docker stats
# 指定容器
docker stats myapp

查看详细信息

查看容器/镜像的详细配置

# 容器详情
docker inspect myapp
# 获取 IP 地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myapp

查看端口映射

查看容器的端口映射关系

docker port myapp

网络(3)

创建网络

创建 Docker 网络

# 创建桥接网络
docker network create mynet
# 指定子网
docker network create --subnet=172.20.0.0/16 mynet

连接网络

将容器加入/移出网络

# 运行时指定网络
docker run -d --network mynet --name myapp nginx
# 已运行容器加入网络
docker network connect mynet myapp
# 断开网络
docker network disconnect mynet myapp

查看网络

列出和检查网络

docker network ls
docker network inspect mynet

数据卷(3)

创建数据卷

创建持久化数据卷

docker volume create mydata

使用数据卷

挂载数据卷到容器

# 命名卷
docker run -d -v mydata:/var/lib/mysql mysql:8
# 绑定挂载(宿主机目录)
docker run -d -v $(pwd)/data:/app/data myapp
# 只读挂载
docker run -d -v mydata:/data:ro myapp

查看/删除数据卷

管理数据卷

# 列出所有
docker volume ls
# 查看详情
docker volume inspect mydata
# 删除
docker volume rm mydata
# 清理未使用的
docker volume prune

Docker Compose(5)

启动服务

启动 docker-compose.yml 中的所有服务

# 后台启动
docker compose up -d
# 启动并构建
docker compose up -d --build
# 指定文件
docker compose -f docker-compose.prod.yml up -d

停止服务

停止和删除 Compose 服务

# 停止
docker compose stop
# 停止并删除容器、网络
docker compose down
# 同时删除数据卷
docker compose down -v

查看状态/日志

查看 Compose 服务状态

# 服务状态
docker compose ps
# 查看日志
docker compose logs -f
# 指定服务日志
docker compose logs -f web

示例 Compose 文件

常见的 docker-compose.yml 结构

version: '3.8'
services:
  web:
    build: .
    ports:
      - '3000:3000'
    environment:
      - NODE_ENV=production
    depends_on:
      - db
    restart: always

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - '3306:3306'

volumes:
  db_data:

扩缩容

调整服务实例数

docker compose up -d --scale web=3

Dockerfile(4)

基础 Dockerfile

Node.js 应用的 Dockerfile 示例

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

多阶段构建

减小镜像体积的多阶段构建

# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 运行阶段
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/main.js"]

Java 应用 Dockerfile

Spring Boot 应用的 Dockerfile

FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

.dockerignore

排除不需要的文件

node_modules
.git
.env
*.md
Dockerfile
docker-compose.yml
.next
dist

清理维护(2)

全面清理

清理所有未使用的资源

# 清理未使用的镜像、容器、网络、卷
docker system prune -a --volumes

查看磁盘占用

查看 Docker 磁盘使用情况

docker system df
# 详细列表
docker system df -v

相关工具