开发者 Docker 指南:镜像、容器与 Compose
你可能听说过 Docker 以及它如何简化开发工作流程。但当你第一次遇到像 镜像、容器 和 Docker Compose 这样的术语时,可能会感到不知所措。本指南将去芜存菁,向你展示如何在项目中有效使用 Docker。
什么是 Docker,为什么你需要关注它?
Docker 是一个平台,它将你的应用程序及其依赖项打包成一个称为容器的标准化单元。容器轻量、可移植且相互隔离。它们通过确保你的应用在任何地方都以相同方式运行,解决了经典的“在我机器上能跑”的问题。
与虚拟机不同,容器共享宿主操作系统内核,因此启动更快、效率更高。这就是 Docker 成为现代开发和部署流水线中流砥柱的原因。
镜像 vs. 容器:构建模块
镜像是一个只读模板,包含你的应用程序代码、运行时、库和设置。容器是镜像的运行实例。可以把镜像看作类,容器看作对象。
你使用 Dockerfile 创建镜像。以下是一个 Node.js 应用的简单示例:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Dockerfile 中的每一行都会创建一个层。层会被缓存,因此当只有后续步骤发生变化时,重新构建会更快。
常用 Docker 命令
docker build -t my-app .— 从当前目录构建镜像docker run -p 3000:3000 my-app— 运行容器并映射端口docker ps— 列出正在运行的容器docker stop <container_id>— 停止容器docker rmi <image_id>— 删除镜像
Docker Compose:管理多容器应用
现实世界的应用通常需要多个服务:Web 服务器、数据库、缓存。Docker Compose 允许你通过单个 YAML 文件定义并运行多容器应用。
以下是一个包含 PostgreSQL 和 Redis 的 Node.js 应用的 docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
运行 docker compose up,所有服务将一起启动。depends_on 确保数据库和缓存在 Web 服务之前启动。
关键 Compose 命令
docker compose up -d— 在分离模式下启动所有服务docker compose down— 停止并移除容器、网络docker compose logs -f web— 跟踪特定服务的日志docker compose exec web sh— 在运行中的容器内打开 shell
开发最佳实践
- 使用 .dockerignore 从构建上下文中排除 node_modules、.git 和其他不必要的文件。
- 保持镜像小巧,使用基于 Alpine 的镜像和多阶段构建。
- 不要以 root 身份运行 — 在 Dockerfile 中创建非 root 用户以提高安全性。
- 使用卷持久化数据,并在开发期间使用绑定挂载实现代码实时重载。
- 固定版本 在 Dockerfile 和 Compose 文件中,以避免意外更新。
何时使用 Docker(何时不用)
当你需要跨团队的一致环境、轻松的依赖管理或微服务时,Docker 表现出色。对于简单的静态网站或脚本,它可能过于复杂。根据项目的复杂性和部署需求进行评估。
常见问题
镜像和容器有什么区别?
镜像是静态模板;容器是该镜像的运行实例。你可以从同一个镜像运行多个容器。
单个容器需要 Docker Compose 吗?
不需要,对于单个容器,你可以使用 docker run。当你需要多个服务相互通信时,Compose 才派上用场。
如何在 Docker 中持久化数据?
使用卷或绑定挂载。卷由 Docker 管理,非常适合数据库;绑定挂载将主机目录映射到容器中,对开发很有用。
准备好优化你的 Docker 化应用了吗?如果你在容器内处理 Nginx 日志,试试我们的 Nginx 日志分析器 来快速解析和分析日志。