Docker 日常开发重点手册

Docker 日常开发重点手册(优化版)

目标:学完后能独立完成 Docker 的日常开发、测试、部署和排错。
原则:先会用,再理解。弱化冷门底层,聚焦高频实战。


📌 目录

  1. 核心概念速览
  2. 单容器管理(日常最高频)

    • 2.1 创建与运行
    • 2.2 查看、启停、删除
    • 2.3 日志查看(排错第一步)
    • 2.4 进入容器与执行命令
    • 2.5 查看详细配置(inspect)
  3. 数据管理(必知必会)

    • 3.1 Bind Mount(开发环境)
    • 3.2 Volume(数据库等持久化)
    • 3.3 如何选择
  4. 网络通信(容器间互联)
  5. Dockerfile 与构建镜像
  6. Docker Compose(项目级管理)
  7. 日常排错 & 清理
  8. 高频命令速查表
  9. 推荐学习路径

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

2.3 日志查看(排错第一步)

容器启动失败或异常,先看日志:

# 查看全部日志
docker logs my-nginx

# 实时跟踪(-f = follow)
docker logs -f my-nginx

# 查看最后100行并持续输出(最常用组合)
docker logs -f --tail 100 my-nginx

2.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:   # 命名 Volume

6.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 --build

6.3 重要提醒

  • docker compose down -v 会删除所有命名 Volume,数据会丢失,慎用!
  • restart: unless-stopped 确保机器重启后容器自动恢复。

7. 日常排错 & 清理

7.1 容器启动失败排错顺序

  1. docker ps -a → 查看状态(Exited、Restarting)
  2. docker logs <容器名> → 最优先,看错误日志
  3. docker inspect <容器名> → 检查配置(端口、环境变量、挂载、网络)
  4. docker exec -it <容器名> sh → 进入容器内部检查(若还在运行)
  5. 网络问题 → 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 <镜像>
Composedocker compose up -d / ps / logs -f / restart / down / up -d --build
资源docker system df / docker system prune

9. 推荐学习路径

按以下顺序,步步为营,不必一开始啃完所有理论:

  1. 单容器管理:run、ps、stop、rm
  2. 核心参数:-p、-v、-e、--name
  3. 排错工具:logs、exec、inspect
  4. 构建镜像:Dockerfile + build
  5. 数据持久化:Bind Mount 和 Volume
  6. 网络:自定义网络 + 容器名通信
  7. Compose:从单机到多服务编排

最终目标:能独立启动、查看、排错、构建、编排 Docker 项目,并处理端口、网络、数据、磁盘等常见问题。


🎯 结语

Docker 日常使用的精髓不在底层原理,而在高频命令的熟练度和排错思维的建立。
建议配合实战场景(如端口冲突、MySQL持久化、Redis通信、Compose多服务)反复练习,一个月后即可游刃有余。
本手册可作为日常查阅的速查宝典,祝学习顺利!