开发者 Docker 指南:镜像、容器与 Compose
作为开发者,你可能遇到过环境不一致的困扰:“在我机器上能跑!”Docker 通过将应用打包到容器中解决了这个问题。本指南将解释 Docker 镜像、容器和 Compose,帮助你一致地构建、交付和运行应用。
什么是 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"]
使用以下命令构建镜像:
docker build -t my-app .
列出镜像:docker images
运行容器
从镜像启动容器:
docker run -d -p 3000:3000 --name my-container my-app
这以分离模式(-d)运行容器,映射端口 3000,并命名为 my-container。
列出运行中的容器:docker ps
停止容器:docker stop my-container
删除容器:docker rm my-container
为什么要使用 Docker Compose?
当你的应用依赖多个服务(数据库、缓存等)时,管理单个容器会变得繁琐。Docker Compose 允许你使用 YAML 文件定义和运行多容器应用。
Compose 文件示例
创建 docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
启动所有服务:docker compose up -d
停止并删除:docker compose down
开发者最佳实践
- 使用 .dockerignore:排除不必要的文件(node_modules、.git)以加速构建。
- 多阶段构建:通过分离构建和运行时阶段,保持生产镜像小巧。
- 利用缓存:按从最不频繁到最频繁变化的顺序排列 Dockerfile 指令。
- 正确标记镜像:避免在生产中使用
latest;使用语义化版本控制。 - 扫描漏洞:使用
docker scan检查镜像中的已知问题。
常用命令速查表
| 命令 | 描述 |
|---|---|
docker build -t name . | 从 Dockerfile 构建镜像 |
docker run -p host:container image | 运行容器并映射端口 |
docker ps -a | 列出所有容器 |
docker exec -it container bash | 在运行中的容器内打开 shell |
docker compose up | 启动 Compose 文件中定义的服务 |
docker compose logs -f | 跟踪所有服务的日志 |
常见问题
镜像和容器有什么区别?
镜像是静态模板;容器是该镜像的运行实例。你可以从一个镜像创建多个容器。
什么时候应该使用 Docker Compose?
当你的应用需要多个服务(例如 Web 服务器、数据库、缓存)一起运行时,使用 Compose。它简化了开发和测试的编排。
如何在 Docker 中持久化数据?
使用卷或绑定挂载。卷由 Docker 管理并存储在专用区域;绑定挂载链接到主机目录。两者在容器重启后都能保留数据。
准备好简化你的 Docker 工作流程了吗?试试我们的 Nginx 日志分析器,快速调试容器日志。