Docker 的使用可以分为基础操作、进阶编排和最佳实践三个层面。以下是针对开发者和运维人员的详细使用指南及关键注意事项。
一、Docker 核心使用方法
1. 环境准备
- 安装:
- Linux: 推荐使用官方脚本
curl -fsSL https://get.docker.com | bash或包管理器安装。 - Mac/Windows: 下载并安装 Docker Desktop(包含 Docker Engine, CLI, Compose, Kubernetes 等全套工具)。
- Linux: 推荐使用官方脚本
- 验证: 运行
docker run hello-world确认安装成功。 - 权限配置 (Linux): 避免每次都用
sudo,将当前用户加入 docker 组:sudo usermod -aG docker $USER # 注销并重新登录后生效
2. 镜像管理 (Images)
镜像是容器的模板。
- 拉取镜像:
docker pull <镜像名>:<标签>- 例:
docker pull nginx:1.25(推荐指定具体版本,避免latest的不确定性)
- 例:
- 查看镜像:
docker images - 构建镜像: 在当前目录有
Dockerfile时执行:docker build -t my-app:v1 . # -t 指定名称和标签,. 代表当前目录 - 删除镜像:
docker rmi <镜像ID或名称>
3. 容器运行与管理 (Containers)
容器是运行的实例。
-
启动容器 (最常用命令):
docker run -d \--name my-web \-p 8080:80 \-v /host/data:/app/data \-e ENV=production \--restart unless-stopped \nginx:1.25-d: 后台运行 (Detached)。--name: 指定容器名称,方便记忆。-p 宿主机端口:容器端口: 端口映射,让外部能访问。-v 宿主机路径:容器路径: 数据卷挂载,确保持久化存储。-e: 设置环境变量。--restart: 重启策略 (no,on-failure,always,unless-stopped)。
-
查看容器:
docker ps: 查看运行中的容器。docker ps -a: 查看所有容器(包括已停止的)。
-
交互与调试:
docker logs -f --tail 100 <容器名>: 实时查看日志。docker exec -it <容器名> bash: 进入容器内部终端 (如果镜像没 bash 则用sh)。docker inspect <容器名>: 查看容器详细信息(IP、挂载点等)。
-
停止与清理:
docker stop <容器名>: 优雅停止。docker rm <容器名>: 删除已停止的容器。docker system prune: 一键清理所有停止的容器、未使用的网络和悬空镜像(慎用,会释放大量空间)。
4. 多容器编排 (Docker Compose)
当应用由多个服务组成(如 Web + DB + Redis)时,使用 docker-compose.yml 文件管理。
- 示例
docker-compose.yml:version: '3.8' services:web:image: nginx:1.25ports:- "80:80"depends_on:- dbdb:image: postgres:15environment:POSTGRES_PASSWORD: examplevolumes:- pgdata:/var/lib/postgresql/datavolumes:pgdata: - 常用命令:
docker compose up -d: 启动所有服务。docker compose down: 停止并移除容器、网络(卷默认保留)。docker compose logs -f: 查看所有服务日志。
二、关键注意事项 (避坑指南)
1. 数据持久化 (最重要!)
- 风险: 容器是** ephemeral **(易失) 的。一旦容器被删除 (
docker rm),容器内部文件系统的所有修改都会丢失。 - 对策: 必须将数据库文件、配置文件、上传的文件等通过
-v(Volume) 或--mount挂载到宿主机。- ❌ 错误:直接在容器内写数据。
- ✅ 正确:
-v /opt/mysql/data:/var/lib/mysql。
2. 镜像标签管理
- 风险: 尽量避免在生产环境使用
latest标签。如果上游镜像更新导致不兼容,你的服务可能会在下次重启时突然挂掉。 - 对策: 始终使用具体的版本号(如
python:3.9-slim,node:18-alpine)。
3. 资源限制
- 风险: 默认情况下,容器可以使用宿主机的所有 CPU 和内存。如果一个容器发生内存泄漏,可能会拖垮整个宿主机,导致其他服务崩溃。
- 对策: 启动时务必限制资源:
或在 Docker Compose 中配置docker run -d --memory="512m" --cpus="1.0" ...deploy.resources。
4. 安全性 (Security)
- 不要以 Root 运行: 默认情况下,容器内的进程以 root 身份运行。如果容器被攻破,攻击者可能获得宿主机 root 权限。
- 做法: 在 Dockerfile 中使用
USER指令切换到非 root 用户。 - Rootless 模式: 在新版 Docker 中,建议启用 Rootless 模式运行 Docker 守护进程。
- 做法: 在 Dockerfile 中使用
- 敏感信息: 严禁将密码、API Key 硬编码在 Dockerfile 或镜像中。
- 做法: 使用
-e环境变量传入,或使用 Docker Secrets (Swarm/K8s),或使用.env文件(确保.env不被提交到 git)。
- 做法: 使用
- 镜像扫描: 定期使用
docker scan或集成 Trivy 等工具扫描镜像漏洞。
5. 网络隔离
- 原则: 默认情况下,所有容器都在
bridge网络中,可以互相通信。 - 做法: 为不同应用创建自定义网络 (
docker network create my-net),只将需要暴露端口的容器映射到宿主机,数据库等后端服务不要映射端口到宿主机,仅允许同网络下的 Web 容器访问。
6. 日志管理
- 风险: 容器标准输出 (stdout/stderr) 如果不加限制,日志文件 (
json-file) 可能会无限增长,占满宿主机磁盘。 - 对策: 配置 Docker 守护进程 (
/etc/docker/daemon.json) 开启日志轮转:{"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "3"} }
7. 国内网络环境 (中国大陆用户特供)
- 问题: 直接
docker pull经常超时或失败。 - 对策:
- 配置镜像加速器: 修改
/etc/docker/daemon.json,添加可靠的镜像源地址(注意:许多公共加速源在 2026 年可能不稳定,需关注云厂商最新公告)。 - 离线传输: 在有网络的地方
docker save -o app.tar image_name,传输到目标机器后docker load -i app.tar。 - 私有仓库: 企业级场景务必搭建 Harbor 私有仓库作为中转。
- 配置镜像加速器: 修改
三、Dockerfile 编写最佳实践
为了构建更小、更安全、更快的镜像,请遵循以下原则:
-
选择合适的基础镜像:
- 优先选用
alpine(极小,但需注意 musl libc 兼容性) 或slim(Debian 精简版) 版本。 - 例:
FROM node:18-alpine而不是FROM node:18。
- 优先选用
-
减少层数:
- 合并
RUN指令。 - 例:
RUN apt-get update && apt-get install -y vim && rm -rf /var/lib/apt/lists/*(一行完成安装并清理缓存,减少镜像体积)。
- 合并
-
利用缓存:
- 将变化少的指令(如安装依赖)放在前面,将代码复制 (
COPY . .) 放在后面。这样代码变动时,依赖层可以复用缓存。
- 将变化少的指令(如安装依赖)放在前面,将代码复制 (
-
使用
.dockerignore:- 类似
.gitignore,排除node_modules,.git,*.log等不需要构建进镜像的文件,加快构建速度并减小体积。
- 类似
-
**多阶段构建 **(Multi-stage Builds):
- 对于编译型语言 (Go, Java, C++),在一个阶段编译,在另一个阶段只复制二进制文件。
- 效果: 最终镜像不包含编译器、源码和中间文件,体积极小且更安全。
# 编译阶段 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp# 运行阶段 FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/myapp . CMD ["./myapp"]
总结
Docker 的核心在于"标准化"和"隔离"。
- 新手:先掌握
run,ps,logs,exec和-v挂载。 - 进阶:重点攻克
Dockerfile优化、Docker Compose编排以及安全加固。 - 生产环境:切记数据持久化、资源限制和非 Root 运行。
