Docker 新手到团队协作指南

1. 学习目标

这份指南面向零基础,目标是让你做到:

  1. 理解 Docker 是什么,解决什么问题。
  2. 会安装 Docker 并运行第一个容器。
  3. 会编写 Dockerfile 构建自己的镜像。
  4. 会用 docker compose 启动多服务项目。
  5. 会在 VS Code 里配合 Docker 开发和调试。
  6. 会在团队中用 Docker 保持开发、测试、部署环境一致。

2. Docker 是什么

  • Docker 是一种"容器化"技术。
  • 你可以把应用和运行环境一起打包成镜像(image)。
  • 任何机器只要有 Docker,就能用相同方式运行这个应用。

一句话:
镜像是模板,容器是运行中的实例。


3. Docker 可以用在什么地方

  1. 本地开发环境统一:避免"我这能跑你那不能跑"。
  2. 测试环境隔离:每次测试都在干净环境执行。
  3. 微服务部署:每个服务一个容器,独立升级。
  4. CI/CD:自动构建镜像并发布。
  5. 临时工具运行:数据库、Redis、Nginx 等开箱即用。
  6. 教学与演示:同一套镜像跨机器复现。

不建议直接用 Docker 的场景:

  • 强依赖图形桌面的软件。
  • 对极致硬实时性能要求非常高的场景。

4. 基础概念(先看懂再操作)

  1. Image(镜像):只读模板,包含应用和依赖。
  2. Container(容器):镜像启动后的运行实例。
  3. Registry(仓库):存放镜像的平台,如 Docker Hub。
  4. Volume(数据卷):容器外持久化数据。
  5. Network(网络):容器间通信。
  6. Dockerfile:构建镜像的脚本文件。
  7. Compose:定义并运行多容器应用。

5. 安装 Docker(Windows 为主)

5.1 安装步骤

  1. 安装 Docker Desktop。
  2. 按向导启用 WSL2(Windows 常见)。
  3. 重启电脑后打开 Docker Desktop。
  4. 终端验证:
bash 复制代码
docker --version
docker compose version

5.2 验证安装成功

bash 复制代码
docker run hello-world

看到 Hello from Docker! 说明运行成功。


6. 第一个容器(一步步)

以 Nginx 为例:

  1. 拉取镜像:
bash 复制代码
docker pull nginx:latest
  1. 启动容器:
bash 复制代码
docker run -d --name my-nginx -p 8080:80 nginx:latest
  1. 查看运行状态:
bash 复制代码
docker ps
  1. 浏览器访问 http://localhost:8080
  2. 停止和删除容器:
bash 复制代码
docker stop my-nginx
docker rm my-nginx

7. 常用命令速学(新手高频)

bash 复制代码
# 镜像
docker images
docker pull <image>:<tag>
docker rmi <image>

# 容器
docker ps
docker ps -a
docker run -d --name <name> -p 8080:80 <image>
docker stop <name>
docker start <name>
docker restart <name>
docker rm <name>
docker logs -f <name>
docker exec -it <name> sh

# 清理
docker system df
docker system prune -f

8. 编写 Dockerfile(从 0 到 1)

示例:Node.js 项目 Dockerfile

dockerfile 复制代码
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .

EXPOSE 3000
CMD ["npm", "run", "start"]

构建与运行:

bash 复制代码
docker build -t my-node-app:1.0.0 .
docker run -d --name my-node-app -p 3000:3000 my-node-app:1.0.0

9. Docker Compose(多服务项目)

9.1 为什么要用 Compose

当项目有多个服务(如 Web + MySQL + Redis)时,Compose 可以一条命令整体启动。

9.2 示例 compose.yaml

yaml 复制代码
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - redis
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

9.3 启动与停止

bash 复制代码
docker compose up -d
docker compose ps
docker compose logs -f
docker compose down

10. VS Code 集成 Docker(一步步)

10.1 安装插件

  1. 安装 Docker 扩展(Microsoft)。
  2. 可选安装 Dev Containers 扩展。

10.2 在 VS Code 中管理容器

  1. 左侧打开 Docker 面板。
  2. 查看 ContainersImagesVolumes
  3. 右键容器可执行 Start/Stop/Logs/Exec。

10.3 使用 Dev Container 开发

  1. 命令面板执行 Dev Containers: Add Dev Container Configuration Files...
  2. 选择开发环境模板(如 Node/Python)。
  3. 执行 Dev Containers: Reopen in Container
  4. 在容器内开发,确保团队环境一致。

11. 团队协作怎么用 Docker

11.1 标准协作流程

  1. 项目仓库包含 Dockerfilecompose.yaml
  2. 新成员拉代码后执行:
bash 复制代码
docker compose up -d
  1. 所有人用同一命令启动环境,减少环境差异问题。
  2. 合并前在容器内跑测试。

11.2 镜像版本管理建议

  1. Tag 使用语义化版本,如 v1.2.0
  2. 同时保留 latest 和版本 Tag。
  3. 禁止只用 latest 不打版本。

11.3 配置与密钥管理

  1. 使用 .env 管理环境变量。
  2. .env 不提交真实密钥(加到 .gitignore)。
  3. 提供 .env.example 给团队参考。

12. 其他场景:一步步操作

场景 A:本地快速起数据库(MySQL)

bash 复制代码
docker run -d \
  --name local-mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=demo \
  -p 3306:3306 \
  mysql:8

操作步骤:

  1. 启动容器。
  2. 用数据库工具连接 localhost:3306
  3. 停止时执行 docker stop local-mysql

场景 B:前后端分离项目联调

  1. 前端和后端各写 Dockerfile。
  2. 用 compose 统一编排。
  3. 前端通过服务名访问后端(如 http://api:8080)。
  4. 一条命令启动联调环境:docker compose up -d

场景 C:CI 中自动构建并推镜像

  1. 代码 push 到主分支。
  2. CI 执行 docker build
  3. 登录镜像仓库并 docker push
  4. 部署系统拉取新镜像滚动更新。

场景 D:临时运行命令行工具

例如临时跑 Python:

bash 复制代码
docker run --rm -it python:3.12-alpine python -V

场景 E:线上故障排查

  1. 查容器状态:docker ps -a
  2. 看日志:docker logs -f <容器名>
  3. 进容器排查:docker exec -it <容器名> sh
  4. 修复后重启:docker restart <容器名>

13. 常见问题与排查

Q1:端口被占用怎么办?

  1. 更换映射端口(如 -p 8081:80)。
  2. 或结束占用端口的进程。

Q2:容器一启动就退出?

  1. 看日志:docker logs <容器名>
  2. 检查启动命令和环境变量。
  3. 检查镜像入口命令是否正确。

Q3:磁盘越来越满?

bash 复制代码
docker system df
docker system prune -f

Q4:容器里的数据重启后没了?

原因:没挂载 volume。

解决:使用 -v 或 compose 的 volumes


14. 安全与规范建议

  1. 镜像尽量使用精简基础镜像(如 alpine)。
  2. 不要在镜像里写死密码和密钥。
  3. 容器尽量使用非 root 用户运行。
  4. 定期升级基础镜像,修复漏洞。
  5. 生产环境固定镜像版本,不直接用 latest

15. 一页速查命令

bash 复制代码
# 拉镜像
docker pull nginx:latest

# 启容器
docker run -d --name web -p 8080:80 nginx:latest

# 看状态/日志
docker ps
docker logs -f web

# 进容器
docker exec -it web sh

# 停止/删除
docker stop web
docker rm web

# Compose
docker compose up -d
docker compose ps
docker compose down

相关推荐
实心儿儿1 小时前
Linux —— 进程间通信 - system V进程间通信 - 共享内存(1)
linux·运维·服务器
Tisfy1 小时前
VSCode Docker(Code Server)首次调试C++长时间下载debuginfo问题
c++·vscode·docker
SPC的存折1 小时前
22、K8S-Helm
云原生·容器·kubernetes
csdn小瓯1 小时前
三层监控系统设计:从API日志到DevOps健康检查
运维·devops
CC城子1 小时前
EtherCAT研究之物理层PHY(一)
linux·运维·数据库
yyuuuzz1 小时前
国际云服务器的技术特点与使用经验
运维·服务器·网络·数据库·云计算·aws
nix.gnehc1 小时前
Langfuse v3 Docker 部署
运维·人工智能·docker·容器·langfuse
JiaWen技术圈1 小时前
Web 安全防护 介绍
运维·nginx·安全
Elastic 中国社区官方博客1 小时前
在 Kubernetes 上的 Elastic Cloud:简化的可用区感知、重启和 mTLS
大数据·数据库·搜索引擎·云原生·容器·kubernetes·全文检索