Docker 日常开发重点手册
Docker 日常开发重点手册(优化版)
目标:学完后能独立完成 Docker 的日常开发、测试、部署和排错。
原则:先会用,再理解。弱化冷门底层,聚焦高频实战。
📌 目录
- 核心概念速览
- 2.1 创建与运行
- 2.2 查看、启停、删除
- 2.3 日志查看(排错第一步)
- 2.4 进入容器与执行命令
- 2.5 查看详细配置(
inspect)
- 3.1 Bind Mount(开发环境)
- 3.2 Volume(数据库等持久化)
- 3.3 如何选择
- 网络通信(容器间互联)
- Dockerfile 与构建镜像
- Docker Compose(项目级管理)
- 日常排错 & 清理
- 高频命令速查表
- 推荐学习路径
1. 核心概念速览
| 概念 | 说明 | 类比 |
|---|---|---|
| Image(镜像) | 只读的应用运行模板 | 类 / 安装包 |
| Container(容器) | 镜像运行后的实例 | 对象 / 进程 |
| Port(端口映射) | 宿主机端口 → 容器端口 | 门牌号转发 |
| Volume(数据卷) | 持久化数据,独立于容器 | 外接硬盘 |
| Network(网络) | 容器间通信的虚拟网络 | 局域网 |
| Compose | 多容器编排工具 | 项目管理助手 |
关系链: Dockerfile → Image → Container(可挂载 Volume、映射 Port、接入 Network)
2. 单容器管理(日常最高频)
2.1 创建与运行(docker run)
最简命令:
docker run nginx但日常更常用带参数的形式:
docker run -d \
--name my-nginx \
-p 8080:80 \
-e NGINX_HOST=example.com \
-v ./html:/usr/share/nginx/html \
nginx:1.27参数解释:
-d:后台运行(Detached Mode)--name:指定容器名(方便后续操作)-p 宿主机端口:容器端口:端口映射(如8080:80)-e KEY=VALUE:设置环境变量(如数据库密码)-v 本机路径:容器路径:挂载(Bind Mount 或 Volume)
2.2 查看、启停、删除
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 启动/停止/重启
docker start my-nginx
docker stop my-nginx
docker restart my-nginx
# 删除容器(-f 强制删除运行中的)
docker rm my-nginx
docker rm -f my-nginx2.3 日志查看(排错第一步)
容器启动失败或异常,先看日志:
# 查看全部日志
docker logs my-nginx
# 实时跟踪(-f = follow)
docker logs -f my-nginx
# 查看最后100行并持续输出(最常用组合)
docker logs -f --tail 100 my-nginx2.4 进入容器与执行命令
# 进入容器交互式 Shell(bash 不行则用 sh)
docker exec -it my-nginx bash
# 在容器内执行单条命令(不进入)
docker exec my-nginx ls /app
docker exec my-nginx env # 查看环境变量2.5 查看详细配置(inspect)
忘记端口、挂载、网络、IP 等配置时:
docker inspect my-nginx重点查看字段:State、Config、Mounts、NetworkSettings、Env、Ports。
3. 数据管理(必知必会)
容器删除后内部数据会丢失,因此需持久化。
3.1 Bind Mount(开发环境最常用)
将宿主机目录直接挂载到容器:
docker run -d -v ./html:/usr/share/nginx/html nginx- 本机
./html修改,容器内立即生效 - 适合代码、配置文件、开发目录
3.2 Volume(数据库等持久化)
由 Docker 管理的独立存储:
# 创建 Volume
docker volume create mysql-data
# 使用 Volume
docker run -d -v mysql-data:/var/lib/mysql mysql:8即使删除容器,Volume 依然存在,新容器重新挂载即可恢复数据。
3.3 如何选择
| 场景 | 推荐方式 |
|---|---|
| 源码、配置文件、开发热加载 | Bind Mount |
| MySQL、Redis 等数据文件 | Volume |
| 临时测试、不想持久化 | 不挂载(默认) |
4. 网络通信(容器间互联)
核心:自定义网络,并通过容器名互相访问。
# 创建网络
docker network create app-network
# 启动 Redis 并加入网络
docker run -d --name redis --network app-network redis:7
# 启动应用并加入同一网络
docker run -d --name app --network app-network my-app此时应用代码中连接 Redis 的地址应写 redis:6379(容器名),不能写 127.0.0.1(那是容器自身)。
网络隔离也支持多个网络,但日常掌握一个自定义网络足够。
5. Dockerfile 与构建镜像
5.1 常用指令
FROM nginx:1.27 # 基础镜像
WORKDIR /app # 工作目录(后续命令默认在此)
COPY . /app # 将构建上下文文件复制到镜像
RUN apt update && ... # 构建时执行(安装依赖等)
ENV NODE_ENV=production # 设置环境变量
EXPOSE 80 # 声明端口(仅是文档,不映射)
CMD ["nginx", "-g", "daemon off;"] # 容器启动时执行的命令5.2 构建镜像(docker build)
docker build -t my-app:1.0 .-t:镜像名和标签(Tag).:构建上下文(当前目录)
5.3 修改代码后为何不生效
若代码通过 COPY 放入镜像,修改源码后需重新构建镜像并重建容器:
docker build -t my-app .
docker rm -f my-app-container
docker run ... # 或使用 Compose 重建6. Docker Compose(项目级管理)
当项目有多个容器(App + MySQL + Redis)时,使用 Compose 统一管理。
6.1 编写 compose.yaml 示例
services:
nginx:
image: nginx:1.27
container_name: demo-nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped
mysql:
image: mysql:8
container_name: demo-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: demo
ports:
- "3307:3306"
volumes:
- mysql-data:/var/lib/mysql
restart: unless-stopped
volumes:
mysql-data: # 命名 Volume6.2 高频 Compose 命令
# 启动所有服务(-d 后台)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志(-f 跟踪,可指定服务名)
docker compose logs -f mysql
# 重启某个服务
docker compose restart nginx
# 停止所有服务
docker compose stop
# 停止并移除容器、网络(默认保留 Volume)
docker compose down
# 重新构建并启动(修改 Dockerfile 后必用)
docker compose up -d --build6.3 重要提醒
docker compose down -v会删除所有命名 Volume,数据会丢失,慎用!restart: unless-stopped确保机器重启后容器自动恢复。
7. 日常排错 & 清理
7.1 容器启动失败排错顺序
docker ps -a→ 查看状态(Exited、Restarting)docker logs <容器名>→ 最优先,看错误日志docker inspect <容器名>→ 检查配置(端口、环境变量、挂载、网络)docker exec -it <容器名> sh→ 进入容器内部检查(若还在运行)- 网络问题 →
docker network ls和docker network inspect <网络名>
7.2 常见错误及解决
| 错误现象 | 可能原因 | 解决 |
|---|---|---|
port is already allocated | 宿主机端口被占用 | 更换宿主机端口(如 -p 3307:3306) |
容器一直 Restarting | 主进程启动后崩溃,重启策略循环 | 立即查看日志,修复启动命令或配置 |
| 容器启动后马上退出 | 主进程执行完毕(如 echo) | 确保主进程是常驻进程(如 Web 服务) |
| 容器间无法通信 | 不在同一网络,或用 127.0.0.1 | 创建自定义网络,使用容器名访问 |
7.3 磁盘空间清理
长期使用后磁盘会膨胀,先查看占用:
docker system df清理无用资源(注意不清理 Volume):
docker container prune # 删除已停止的容器
docker image prune # 删除无用镜像
docker network prune # 删除无用网络
docker system prune # 综合清理(不含 Volume)⚠️ docker volume prune 会删除所有未使用的 Volume,可能删掉数据库数据,谨慎执行。
8. 高频命令速查表
| 类别 | 命令 |
|---|---|
| 查看 | docker ps / docker ps -a / docker images / docker volume ls / docker network ls |
| 启停 | docker start/stop/restart/rm <容器> / docker rm -f |
| 日志 | docker logs -f --tail 100 <容器> |
| 执行 | docker exec -it <容器> sh / docker exec <容器> <命令> |
| 镜像 | docker pull <镜像> / docker build -t <标签> . / docker rmi <镜像> |
| Compose | docker compose up -d / ps / logs -f / restart / down / up -d --build |
| 资源 | docker system df / docker system prune |
9. 推荐学习路径
按以下顺序,步步为营,不必一开始啃完所有理论:
- 单容器管理:
run、ps、stop、rm - 核心参数:
-p、-v、-e、--name - 排错工具:
logs、exec、inspect - 构建镜像:Dockerfile +
build - 数据持久化:Bind Mount 和 Volume
- 网络:自定义网络 + 容器名通信
- Compose:从单机到多服务编排
最终目标:能独立启动、查看、排错、构建、编排 Docker 项目,并处理端口、网络、数据、磁盘等常见问题。
🎯 结语
Docker 日常使用的精髓不在底层原理,而在高频命令的熟练度和排错思维的建立。
建议配合实战场景(如端口冲突、MySQL持久化、Redis通信、Compose多服务)反复练习,一个月后即可游刃有余。
本手册可作为日常查阅的速查宝典,祝学习顺利!