Docker Compose 完全指南

不要再为每个服务手动运行 Docker 命令了。

如果你运行的是现代应用程序,你可能拥有前端、后端、数据库和缓存。逐个运行这些服务既慢又容易出错。

Docker Compose 解决了这个问题。你可以在一个 YAML 文件中定义整个技术栈,并使用一条命令启动所有内容。

基础知识

  • 不使用 Compose:你需要为四个容器运行四个独立的命令。
  • 使用 Compose:你只需运行 docker compose up,一切就会启动。

重要概念

• 服务 (Services):每个服务代表一个容器。你可以使用 build 来构建自己的代码,或者使用 image 来使用预构建的工具,例如 PostgreSQL 或 Redis。 • 端口映射 (Port Mapping):使用 HOST:CONTAINER 格式。这会将你计算机的端口映射到容器端口。 • 环境变量 (Environment Variables):使用 environment 处理简单值,或使用 env_file 将敏感信息保存在单独的 .env 文件中。 • 数据卷 (Volumes):使用 volumes 来保护你的数据安全。如果没有 volumes,当容器停止时,你的数据库数据将会丢失。 • 网络 (Networks):Compose 会自动创建一个网络。容器之间通过服务名称(而不是 localhost)进行通信。 • 依赖关系 (Depends_on):这用于设置启动顺序。它告诉 Docker 在启动后端之前先启动数据库。请注意,它并不会等待数据库完全就绪。

面试技巧

  • 何时使用 build vs image?对于自定义应用程序,使用 build。对于来自 Docker Hub 的现有工具,使用 image
  • 容器之间如何通信?它们在 Docker 网络中使用服务名称作为主机名。
  • 如何避免数据丢失?务必为数据库使用具名数据卷 (named volumes)。
  • 如何处理敏感信息?永远不要硬编码它们。请使用 .env 文件。

应避免的常见错误

  • 使用 latest 标签:这会导致意外的更新。请使用具体的版本号,例如 postgres:16
  • 使用 localhost:容器无法通过 localhost 相互访问。请使用服务名称。
  • 缺少健康检查 (Healthchecks):使用 healthchecks 来监控你的服务是否真正准备好工作。

来源:https://dev.to/adityaguptareal/docker-compose-complete-guide-1gac