Data Engineering Zoomcamp 教程:使用 Docker Compose 一键编排 PostgreSQL 与 pgAdmin 多容器数据管道

发布时间:2026/9/12 5:52:10
Data Engineering Zoomcamp 教程:使用 Docker Compose 一键编排 PostgreSQL 与 pgAdmin 多容器数据管道 Data Engineering Zoomcamp 教程使用 Docker Compose 一键编排 PostgreSQL 与 pgAdmin 多容器数据管道【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp在 Data Engineering Zoomcamp 的 Docker 与 PostgreSQL 工作坊中前几节分别讲解了如何用docker run启动 Postgres 容器04-postgres-docker.md、运行 pgAdmin 容器并手动创建共享网络07-pgadmin.md以及如何把数据摄取脚本打包成镜像08-dockerizing-ingestion.md。本节09-docker-compose.md引入 Docker Compose用一份 YAML 配置文件同时管理 Postgres 与 pgAdmin 两个服务免去逐条执行繁琐docker run命令的负担。读完本文你将掌握docker-compose.yaml的完整编写与逐项参数含义、Compose 自动网络的工作原理、常用的启动/停止/日志/清理命令以及如何让容器化的摄取脚本复用 Compose 创建的虚拟网络完成数据入库为构建生产级多容器数据管道打下基础。为什么需要 Docker Compose回顾前几节的工作流启动整套数据环境需要依次执行多条命令运行 Postgres 容器见 04-postgres-docker.md需要-e设置环境变量、-v挂载卷、-p映射端口运行 pgAdmin 容器见 07-pgadmin.md需要先docker network create pg-network手动建网再给两个容器分别加--networkpg-network与--name参数才能让它们互相发现。这些命令冗长、易错且每次启动都要重复输入。docker compose的核心价值就在于用单个配置文件描述一组容器及其网络、卷、端口等全部细节一条命令同时启动或停止所有服务从而替代多条复杂的docker run。从仓库中的辅助脚本也能看到这种命令越来越多的趋势docker-postgres.sh 单独封装了 Postgres 容器的启动参数而 Compose 则是把这类分散脚本统一收敛为声明式配置。docker-compose.yaml 配置逐项解析Docker Compose 使用 YAML 语法。工作坊提供的完整配置文件位于仓库的 pipeline/docker-compose.yaml内容如下services: pgdatabase: image: postgres:18 environment: POSTGRES_USER: root POSTGRES_PASSWORD: root POSTGRES_DB: ny_taxi volumes: - ny_taxi_postgres_data:/var/lib/postgresql ports: - 5432:5432 pgadmin: image: dpage/pgadmin4 environment: PGADMIN_DEFAULT_EMAIL: adminadmin.com PGADMIN_DEFAULT_PASSWORD: root volumes: - pgadmin_data:/var/lib/pgadmin ports: - 8085:80 volumes: ny_taxi_postgres_data: pgadmin_data:services容器即服务文件顶层用services声明要运行的容器Compose 中称为服务。本例包含两个服务pgdatabasePostgreSQL 数据库image: postgres:18使用 PostgreSQL 18 官方镜像课程文档注明该版本为 2025 年 12 月时的 latest04-postgres-docker.md 中的docker run也使用同一镜像environment对应docker run -e设置POSTGRES_USERroot、POSTGRES_PASSWORDroot、POSTGRES_DBny_taxi即数据库超级用户、密码与默认数据库名volumes对应docker run -v将命名卷ny_taxi_postgres_data挂载到容器内/var/lib/postgresql使数据在容器删除后依然持久化ports对应docker run -p5432:5432将容器内 5432 端口映射到宿主机 5432供 pgcli、摄取脚本或本地工具连接。pgadminWeb 管理界面image: dpage/pgadmin4官方 pgAdmin 镜像environment设置登录邮箱PGADMIN_DEFAULT_EMAILadminadmin.com与密码PGADMIN_DEFAULT_PASSWORDroot与 07-pgadmin.md 中的docker run -e参数完全一致volumespgadmin_data:/var/lib/pgadmin保存 pgAdmin 的服务器连接配置与偏好设置重启容器后无需重新配置ports8085:80pgAdmin 是 Web 应用、容器内默认端口 80映射到宿主机 8085 以避免与本地常见 80 端口冲突。volumes命名卷声明文件底部单独声明了ny_taxi_postgres_data与pgadmin_data两个命名卷。这样写的好处是让 Docker 知道这些卷属于本项目生命周期管理范围docker-compose down不会删除它们而docker-compose down -v会连同卷一起移除见下文其他常用命令。对比 docker run一条命令 vs 一份配置Compose 文件中的每一段都可以与前几节的docker run参数一一对应Compose 配置项对应 docker run 参数本例值image镜像名postgres:18/dpage/pgadmin4environment-e用户、密码、数据库名 / 邮箱、密码volumes-v数据持久化命名卷ports-p5432:5432/8085:80唯一不需要在文件里指定的是网络——这正是 Compose 相比手动docker run的关键差异。Compose 的自动网络容器按服务名互访在原文档的Explanation部分特别强调使用 Compose 时无需手动创建网络。Compose 会自动为项目创建一个默认网络所有服务都加入该网络并可通过服务名pgdatabase、pgadmin互相解析。这与 07-pgadmin.md 中手动执行docker network create pg-network的做法形成鲜明对比那里需要显式建网、给容器命名、逐个加--network参数而 Compose 把这一过程完全自动化——服务名天然成为容器在网络中的主机名。因此在 pgAdmin 中注册 Postgres 服务器时Connection 标签页的 Host 依然填pgdatabase服务名即容器名端口 5432用户名/密码root/root访问地址为http://localhost:8085。这套连接流程在 Compose 编排下与手动建网时完全一致只是省去了建网步骤。启动服务前台与分离模式在docker-compose.yaml所在目录仓库中为01-docker-terraform/docker-sql/pipeline/下执行docker-compose up前台模式会持续占用终端并实时输出所有容器的日志。启动前请确保之前手动docker run的容器已全部停止避免端口5432/8085冲突。若希望容器在后台运行、释放终端使用分离模式docker-compose up -d两种方式都会按配置同时拉起 Postgres 与 pgAdmin 两个服务。停止服务与常用管理命令前台模式下按CtrlC即可关闭容器更规范的做法是使用docker-compose downdown会停止并移除 Compose 管理的容器与默认网络但保留命名卷中的数据下次up时数据仍在。其他常用命令原文档Other Useful Commands一节# 查看所有服务的日志 docker-compose logs # 停止服务并同时删除命名卷数据将丢失谨慎使用 docker-compose down -vlogs集中查看各容器输出便于排查启动错误down -v额外移除volumes段声明的命名卷相当于把数据库数据一并清空适合完全重置实验环境。配合 11-cleanup.md 可进一步用docker container prune、docker image prune、docker volume prune等命令清理不再使用的资源。在 Compose 网络中运行摄取脚本前几节构建的摄取镜像taxi_ingest:v001构建过程见 08-dockerizing-ingestion.mdDockerfile 位于 pipeline/Dockerfile并不属于 Compose 管理的服务而是通过docker run独立运行的。要让脚本容器访问到 Compose 网络中的 Postgres必须显式指定网络。查找 Compose 自动创建的网络名docker network lsCompose 创建的默认网络命名规则为项目目录名_default。由于配置文件位于pipeline/目录网络名通常为pipeline_default若目录名不同则相应变化。运行摄取脚本docker run -it --rm \ --networkpipeline_default \ taxi_ingest:v001 \ --pg-userroot \ --pg-passroot \ --pg-hostpgdatabase \ --pg-port5432 \ --pg-dbny_taxi \ --target-tableyellow_taxi_trips要点说明--networkpipeline_default加入 Compose 创建的虚拟网络使脚本容器能与pgdatabase服务互相通信--pg-hostpgdatabasePostgres 在独立容器中运行主机参数必须填容器/服务名pgdatabase而不是localhost容器内localhost指向脚本容器自身--pg-user/--pg-pass/--pg-db/--target-table对应 ingest_data.py 中 click 定义的命令行参数其默认值分别为root、root、ny_taxi、yellow_taxi_data脚本内部以postgresqlpsycopg://连接串通过 SQLAlchemy 建引擎并按 100,000 行一批chunksize流式读取纽约出租车 CSV 数据首块以replace建表、后续块append追加见 ingest_data.py因此重复运行会自动替换已有表。这些连接参数与前几节手动建网时完全一致唯一区别是网络名从手动创建的pg-network换成了 Compose 生成的pipeline_default。Docker Compose 的工程收益原文档总结的收益包括单命令启动全部服务一个up同时拉起 Postgres 与 pgAdmin自动网络创建省去手动建网与命名服务名即可互访配置集中管理环境变量、卷、端口全部声明在 YAML 中可读、可版本化、可复用声明式基础设施配置即代码infrastructure as code新环境复现只需同一份文件。从数据工程实践角度看这标志着从记忆一串docker run命令迈向用声明式清单描述多容器数据环境是后续课程中编排更复杂管道如 Kestra、Spark 等的认知基础。课程其余 Docker 部分SQL 复习、资源清理可在此基础上继续深入。【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考