CC 咖啡猫的工作空间 Coding Space

Docker 操作实践指南

一、Docker 核心概念速览

三个核心概念

概念 说明 类比
镜像 (Image) 应用程序的蓝图/模板 类 (Class)
容器 (Container) 镜像的运行实例 对象 (Object) / 进程
仓库 (Registry) 存放镜像的地方 GitHub / 应用商店

二、Docker 常用命令速查表

镜像操作 (Image)

# 查看本地镜像列表
docker images
docker image ls

# 搜索镜像(从 Docker Hub)
docker search mysql
docker search ubuntu

# 拉取镜像
docker pull image-name                    # 拉取最新版本
docker pull image-name:tag                # 拉取指定版本
docker pull mysql:8.0

# 删除镜像
docker rmi image-name
docker rmi image-name:tag
docker image rm image-id

# 删除所有未使用的镜像
docker image prune

# 查看镜像详情
docker inspect image-name

# 给镜像打标签
docker tag image-name new-name:tag
docker tag mysql:8.0 my-mysql:latest

# 构建镜像(从 Dockerfile)
docker build -t image-name:tag .
docker build -t my-app:1.0 -f Dockerfile .

容器操作 (Container)

# 查看运行中的容器
docker ps
docker container ls

# 查看所有容器(包括停止的)
docker ps -a
docker container ls -a

# 创建并运行容器
docker run [选项] image-name
docker run -d -p 8080:80 --name my-app nginx

# 常用选项说明
-d              # 后台运行(detached mode)
-p 8080:80      # 端口映射:主机端口:容器端口
--name myapp    # 给容器起名字
-e VAR=value    # 设置环境变量
-v /host:/container  # 挂载卷(主机路径:容器路径)
-it             # 交互模式 + 分配终端
--rm            # 容器停止时自动删除

# 进入运行中的容器
docker exec -it container-name bash         # 进入 bash
docker exec -it container-name sh           # 进入 sh

# 查看容器日志
docker logs container-name
docker logs -f container-name               # 持续显示日志
docker logs --tail 100 container-name       # 显示最后 100 行
docker logs --since 2h container-name       # 显示最近 2 小时的日志

# 启动/停止/重启容器
docker start container-name
docker stop container-name
docker restart container-name

# 暂停/恢复容器
docker pause container-name
docker unpause container-name

# 删除容器
docker rm container-name
docker rm -f container-name                 # 强制删除(即使运行中)

# 删除所有停止的容器
docker container prune

# 查看容器详情
docker inspect container-name

# 查看容器资源使用情况
docker stats container-name
docker stats                                # 查看所有容器

容器与镜像的相互操作

# 从运行中的容器创建镜像(保存修改)
docker commit container-name my-image:tag
docker commit my-container my-app:v1.0

# 将容器内的文件复制到主机
docker cp container-name:/path/to/file ./local-path

# 将主机文件复制到容器
docker cp ./local-file container-name:/path/to/

# 查看容器的变化
docker diff container-name

三、Docker Compose 操作

基本命令

# 启动服务(根据 docker-compose.yml)
docker-compose up                           # 前台运行
docker-compose up -d                        # 后台运行

# 停止服务
docker-compose down                         # 停止并删除容器
docker-compose stop                         # 只停止,不删除

# 查看运行中的服务
docker-compose ps

# 查看所有服务
docker-compose ps -a

# 查看服务日志
docker-compose logs                         # 查看所有服务日志
docker-compose logs -f service-name         # 查看特定服务日志

# 进入某个服务的容器
docker-compose exec service-name bash

# 重启服务
docker-compose restart service-name

# 构建全部镜像
docker-compose build

# 构建特定服务的镜像
docker-compose build service-name

# 拉取所有依赖镜像
docker-compose pull

# 删除所有停止的容器
docker-compose down -v                      # -v 表示同时删除 volumes

docker-compose.yml 常用配置

version: '3.8'

services:
  # 服务 1: Web 应用
  web:
    image: nginx:latest
    ports:
      - "8080:80"                          # 端口映射
    volumes:
      - ./html:/usr/share/nginx/html       # 挂载
    environment:
      - NGINX_HOST=example.com             # 环境变量
    depends_on:
      - db                                 # 依赖关系
    restart: unless-stopped                # 重启策略

  # 服务 2: 数据库
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password123
      MYSQL_DATABASE: mydb
    volumes:
      - db_data:/var/lib/mysql            # 声明卷
    ports:
      - "3306:3306"
    restart: unless-stopped

volumes:
  db_data:                                 # 声明卷(持久化存储)

四、Docker Desktop 镜像自动启动问题及解决方案

❓ 问题:镜像打开时自动启动,怎样关掉?

答案:可以关掉!有多种方法:

方案 1️⃣:修改容器重启策略(推荐)

# 查看容器当前的重启策略
docker inspect container-name | grep -A 5 '"RestartPolicy"'

# 改为不自动重启
docker update --restart=no container-name

# 重启策略选项:
# no              - 容器退出时不自动重启(默认)
# always          - 总是重启
# unless-stopped  - 除非被明确停止,否则重启
# on-failure      - 仅在发生错误时重启
# on-failure:3    - 最多重试 3 次

方案 2️⃣:在 docker-compose.yml 中配置

services:
  my-service:
    image: mysql:8.0
    restart: no              # 不自动重启 ← 关键配置
    # 或使用其他选项:
    # restart: unless-stopped  # 除非手动停止,否则重启

方案 3️⃣:Docker Desktop UI 中停止容器

  1. 打开 Docker Desktop
  2. 进入 Containers 页面
  3. 找到自动启动的容器
  4. 点击容器右侧的 ⏹️ Stop 按钮
  5. 容器停止后,下次打开 Docker Desktop 就不会自动启动

方案 4️⃣:删除容器(彻底移除)

# 查看容器列表
docker ps -a

# 删除不需要的容器
docker rm container-name
docker rm -f container-name              # 强制删除(即使运行中)

方案 5️⃣:在 Docker Desktop 设置中管理

  1. 打开 Docker Desktop
  2. 点击菜单 Preferences / Settings
  3. 找到 GeneralResources 标签
  4. 查找 "Start Docker Desktop when you log in" 选项
  5. 如果要禁用所有自动启动,可以关掉这个选项

Docker Desktop 常见配置位置

设置项 位置
自动启动 Docker Preferences → General → Start Docker Desktop when you log in
内存/CPU 分配 Preferences → Resources
镜像存储位置 Preferences → Resources → Disk image location
文件共享 Preferences → Resources → File Sharing

五、实用命令组合和常见场景

场景 1️⃣:快速清理系统

# 删除所有停止的容器、未使用的镜像和网络
docker system prune

# 更激进的清理(包括未用镜像)
docker system prune -a

# 只清理镜像
docker image prune -a

场景 2️⃣:查看和诊断

# 查看 Docker 系统信息
docker info

# 查看 Docker 版本
docker --version

# 查看事件日志(实时)
docker events

# 查看磁盘使用情况
docker system df

场景 3️⃣:一键启动多个容器

# 用最少命令启动完整应用堆栈
docker-compose up -d

# 查看所有容器状态
docker-compose ps

# 查看实时日志
docker-compose logs -f

场景 4️⃣:备份和恢复

# 导出镜像为 tar 文件
docker save image-name:tag -o image-name.tar

# 从 tar 文件恢复镜像
docker load -i image-name.tar

# 导出容器为 tar 文件
docker export container-name -o container.tar

# 从 tar 导入为镜像
docker import container.tar image-name:tag

场景 5️⃣:调试容器

# 查看完整运行信息
docker inspect container-name

# 查看容器内部结构
docker exec container-name ls -la /

# 在容器中执行命令
docker exec -it container-name mkdir /newdir

# 查看容器内的进程
docker top container-name

# 查看容器文件系统变化
docker diff container-name

六、常见问题速查

Q1: 容器占用了端口,无法启动怎么办?

# 查找占用该端口的容器
docker ps | grep :8080

# 或找出占用端口的进程
lsof -i :8080
netstat -an | grep 8080

# 停止该容器
docker stop container-name

# 或改用其他端口
docker run -p 9090:80 nginx

Q2: 容器内的应用无响应,如何排查?

# 1. 查看容器日志
docker logs -f container-name

# 2. 进入容器检查
docker exec -it container-name bash

# 3. 在容器内测试网络
docker exec container-name curl localhost:8080

# 4. 查看容器资源使用
docker stats container-name

Q3: 如何保存对容器的修改?

# 方法 1: 使用 commit(创建新镜像)
docker commit container-name my-image:v1.0

# 方法 2: 使用挂载卷(推荐)
# 在 docker run 时添加 -v 选项指向主机目录
docker run -v /host/path:/container/path image-name

# 方法 3: 使用 Dockerfile 构建镜像
# 编写 Dockerfile 并 docker build

Q4: 镜像太大,如何减小?

# 1. 查看镜像大小
docker images | grep my-image

# 2. 在 Dockerfile 中使用多阶段构建
# 3. 使用更小的基础镜像(alpine)
docker pull nginx:alpine   # 比 nginx:latest 小得多

# 4. 清理层
docker image prune --filter "dangling=true"

Q5: 容器环境变量设置错了,怎么改?

# 查看环境变量
docker inspect container-name | grep -A 20 '"Env"'

# 重新启动容器时设置正确的变量
docker run -e VAR=correct-value image-name

# 或修改现有容器(需要重启)
docker update --env VAR=correct-value container-name
docker restart container-name

七、Docker 镜像和容器命名规范建议

镜像命名

registry/repository/image-name:tag

示例:
docker.io/library/mysql:8.0
ghcr.io/mycompany/myapp:v1.0.0
localhost:5000/dev-app:latest

最佳实践:
- 小写字母和数字
- 用 / 分隔命名空间
- 用冒号分隔标签(不写默认为 latest)
- 版本号用 semantic versioning (v1.0.0)

容器命名

优先使用有意义的名称,避免自动生成的随机名称

示例:
web-server
mysql-dev
api-gateway-v1
redis-cache-prod

八、快速参考卡片

最常用的 10 个命令

1. docker ps -a                  # 查看所有容器
2. docker images                 # 查看所有镜像
3. docker run -d image-name      # 后台运行容器
4. docker logs -f container      # 查看日志
5. docker exec -it container bash # 进入容器
6. docker stop container         # 停止容器
7. docker rm container           # 删除容器
8. docker rmi image              # 删除镜像
9. docker-compose up -d          # 启动服务
10. docker system prune          # 清理系统

记不住命令时的速查

docker help                      # Docker 总帮助
docker COMMAND --help            # 特定命令帮助
# 示例:
docker run --help
docker logs --help
docker-compose up --help

九、Docker Desktop 实用技巧

1. 快速访问本地容器

# 容器内部访问主机(macOS/Windows)
curl http://host.docker.internal:8080

# 或在容器中使用
docker run -e HOST_IP=$(host.docker.internal) image-name

2. 查看 Docker Desktop 的实时监控

  • 打开 Docker Desktop
  • 进入 Dashboard 标签
  • 查看所有容器的 CPU、内存使用情况
  • 点击容器可查看详细日志

3. 批量操作容器

# 停止所有运行中的容器
docker stop $(docker ps -q)

# 删除所有容器
docker rm $(docker ps -a -q)

# 删除所有镜像
docker rmi $(docker images -q)

4. 在 Docker Desktop 中禁用自动启动

# 临时完全禁用自动启动
docker update --restart=no container-name

# 或删除不需要的容器
docker rm container-name

十、文件组织建议

推荐项目结构

your-project/
├── Dockerfile                   # 单个应用的镜像定义
├── docker-compose.yml           # 多容器应用定义
├── docker-compose.prod.yml      # 生产环境配置(可选)
├── .dockerignore                # Docker 忽略文件
└── docker/
    ├── nginx/
    │   ├── Dockerfile
    │   └── nginx.conf
    ├── app/
    │   └── Dockerfile
    └── db/
        └── init-db.sql

.dockerignore 示例

.git
.gitignore
.env.local
node_modules
dist
build
*.log
.DS_Store
.vscode
.idea

总结速查表

需求 命令
查看 docker ps -a / docker images
运行 docker run -d image-name
进入 docker exec -it container bash
查看日志 docker logs -f container-name
停止 docker stop container-name
删除 docker rm container-name
关闭自启 docker update --restart=no container
清理空间 docker system prune
多容器管理 docker-compose up -d
帮助 docker help / docker COMMAND --help

最后更新:2026/04/20
关键提示:记不住命令时,用 docker helpdocker COMMAND --help,极快找到答案!