Getting started with Docker and building Postgres
初学 Docker 并轻松构建 Postgres
前言
刚接触后端时我还不清楚如何有效重现服务供其他开发者使用,直到遇见 Docker 才大幅简化各种设施的维护与重现的工作,是一项非常高回报的实用技能,本篇从实做角度透过 Docker 构建 Postgres 服务,了解它的便捷快速。
什么是 Docker?
Docker 是一套容器化技术工具,可以想像成是更轻量的虚拟机。
名称 | 解释 |
---|---|
Image(映像文件) | 就像应用程序的蓝图,定义了要安装什么、如何设置,是静态不可变的。 |
Container(容器) | 是根据映像文件的执行个体,可以有很多个彼此独立的容器。 |
Dockerfile | 描述如何一步步建立 Image,例如要安装什么软件、开哪些 port 等。 |
docker-compose.yml | 描述如何同时启动多个容器服务(如 web、数据库等),以及它们之间如何互相连接与设置环境参数。 |
Volume | 将数据储存在主机上的文件夹,用来实现数据持久化(不会因容器删除而遗失)。 |
Port Mapping | 将容器内的服务(例如 Postgres 的 5432 port)对应到本机可访问的 port,例如 localhost:5432 。 |
为什么需要 Docker?
如果可以直接在电脑上安装 Postgres,何必还要透过 Docker 构建?一开始会有懒得再额外使用 Docker 的想法,但当处理大量的服务成为日常,容器化技术就变得十分重要。
- 环境一致性:每个人的开发环境可能不一样,例如套件版本或其他相依软件的设置。使用 Docker 可以把「环境变因」通通封装起来,确保不论在哪台机器上跑,环境都是一致的,减少「在我机器上没问题」的情况。
- 安装与移除方便:传统安装 Postgres 可能会改动系统设置、占用系统资源或与其他服务冲突。使用 Docker 只要一个指令就能启动或移除 Postgres,干净利落,不会污染系统。
- 支援多版本并存:某些项目需要使用不同版本的数据库,手动切换版本不仅麻烦也容易出错。使用 Docker 可以在同一台机器上同时跑多个版本的 Postgres。
- 快速初始化数据与设置:透过 Docker 的 Volume 机制或是初始化脚本,我们可以快速建立数据表结构、塞入测试数据,甚至搭配 docker-compose 一次建立一整套服务环境(数据库、后端、前端)。
- 团队协作更容易:当你用 Docker 定义好环境,其他开发者只须执行一条指令就能启动数据库。不需要每个人都手动设置环境,大幅减少沟通成本与错误空间。
怎么执行 Postgres Docker
一、从 Docker Hub 下载 postgres 的 docker image。
docker pull postgres:latest
二、查看现有 docker image:docker images
REPOSITORY TAG IMAGE ID CREATED SIZEpostgres latest 7fb32a7ac3a9 4 days ago 438MB
三、启动新的 postgres container
docker run --name drizzle-postgres -e POSTGRES_PASSWORD=mypassword -d -p 5432:5432 postgres
--name
:将容器命名为 drizzle-postgres。-e
: 设置POSTGRES_PASSWORD
环境变量为指定的值。-d
:以「后台运行模式」(detached mode)运行。-p
:将容器内的5432
埠对应到主机上的5432
埠,让你可以透过这个埠从主机存取 Postgres。
四、访问 Postgres
(没有特别注明的话,user / database 默认都是 postgres
)
postgres://<user>:<password>@<host>:<port>/<database>
postgres://postgres:mypassword@localhost:5432/postgres
Docker Compose 整合 docker
既然在 Docker Hub 已有现成的 Postgres Image 可以使用,使用 docker-compose.yml
整合上述行为并透过 docker compose up
即可快速启动本地 Postgres 于特定 port。
# docker-compose 会自动读取项目根目录下的 `.env` 文件。services: db: image: postgres:latest environment: - POSTGRES_PASSWORD=${DB_PASSWORD} ports: - ${DB_PORT}:5432 volumes: - ./db-data:/var/lib/postgresql/data