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 中停止容器
- 打开 Docker Desktop
- 进入 Containers 页面
- 找到自动启动的容器
- 点击容器右侧的 ⏹️ Stop 按钮
- 容器停止后,下次打开 Docker Desktop 就不会自动启动
方案 4️⃣:删除容器(彻底移除)
# 查看容器列表
docker ps -a
# 删除不需要的容器
docker rm container-name
docker rm -f container-name # 强制删除(即使运行中)
方案 5️⃣:在 Docker Desktop 设置中管理
- 打开 Docker Desktop
- 点击菜单 Preferences / Settings
- 找到 General 或 Resources 标签
- 查找 "Start Docker Desktop when you log in" 选项
- 如果要禁用所有自动启动,可以关掉这个选项
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 help 或 docker COMMAND --help,极快找到答案!