如何在 Docker 中轻松创建 Postgres 数据库
你是否遇到过这样的问题:某个工具或软件在你的机器上运行良好,但当你把它安装到别人的机器上时,却遇到了各种各样的问题?没错,我就遇到过,而 Docker 正是为此而诞生的!在这篇博文中,我们将简要介绍 Docker 是什么,以及在 Docker 容器中运行数据库是多么简单。我保证,这个容器可以在任何机器上运行。在此过程中,你还会学习一些 Docker 特有的术语。
什么是 Docker?
根据官方文档,Docker 是一个“用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分离,从而快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础架构。 ”
为了完全理解 Docker,我们还需要讨论 Docker 和虚拟机 (VM) 之间的区别。后者通常在 AWS 和 Azure 等云环境中运行。每当您创建 VM 时,您都会与其他 VM 共享硬件。这些云环境所做的是“虚拟化”硬件。Docker 不会这样做,而且做法不同。在 VM 中,您可以在同一硬件上运行多个操作系统,而使用 Docker,您可以虚拟化操作系统。因此,VM 和 Docker 容器之间的最大区别在于前者可以在同一硬件上拥有多个(客户机)操作系统,例如通过 VMWare(称为虚拟机管理程序)。而当您安装 Docker 时,您将使用 Docker 引擎在操作系统上创建独立的实体。这些实体称为容器。因此,Docker 允许您在这些容器中自动部署应用程序。
让我们安装 Docker
理论讲得够多了,让我们开始安装 Docker 并启动 Postgres 数据库。要使用 Docker,首先需要安装它。您可以在台式机(Windows 和 Mac)上安装 Docker,也可以在服务器上安装(基于 Linux 的安装)。在本教程中,我们将在Mac上安装 Docker。Windows安装说明可以在这里找到。对于 Mac(我认为 Windows 也一样),安装相当简单。您下载应用程序并将其拖到应用程序。然后双击Docker.app,它就会启动。当右上角其他小图标旁边出现 Docker 图标(带有容器的鲸鱼或船状图像)时,您可以检查它是否正常工作。如果是这种情况,您可以快速按照“Hello World”示例启动并运行。
如何创建 Postgres 数据库
毫无疑问,运行干净的 Postgres 数据库的最简单方法是在终端窗口中运行此命令(在安装 Docker 之后):
docker run --name postgres-db -e POSTGRES_PASSWORD=docker -p 5432:5432 -d postgres
但它起什么作用呢?
- 该命令的最后一部分从Docker Hub获取最新的“postgres”Docker 镜像
- -d 表示允许 Docker 在后台运行容器
- -p 加上端口号意味着你将容器端口 5432 映射到外部端口 5432 - 这允许你从外部连接到它
- POSTGRES_PASSWORD 设置 docker 的密码。这是您访问数据库的密码
- —name 属性为您的容器提供了一个名称,意味着您可以轻松地找到它
现在,您可以使用任何允许您与数据库通信的工具连接到这个全新的 Postgres 数据库。我倾向于使用 RazorSQL 或 DBeaver。您需要使用以下连接详细信息才能实际连接到数据库:
- 主机:localhost
- 端口:5432
- 用户:postgres
- 密码:docker
连接后,您可以对数据库进行任何操作(创建表、加载数据等)。但正如您所见,数据库是空的。然而,Docker 的真正强大之处在于,您可以轻松配置一个已包含内容的数据库。这可以是简单或复杂的数据库结构和模式。选择权完全在您手中。这也意味着您可以轻松启动(或关闭)这样的容器。让我们看看下面如何操作:
创建 Dockerfile 和 Docker 镜像
为了创建预填充数据库,我们需要创建一个 Dockerfile。这是一个有点奇怪的文件,至少我第一次见到它的时候是这样的。它没有文件扩展名。它本质上是一个 Docker 使用的文本文档,描述了 Docker 需要执行的操作。本质上是一组指令。在我们的示例中,我们要执行以下操作:
- 从 Docker Hub 下载最新的 Postgres 镜像
- 将环境变量的密码设置为“docker”
- 创建一个数据库,我们称之为“世界”
- 使用 SQL 转储文件创建表模式并用数据填充它
上面我描述了我想要在这个文件中实现什么。现在让我们来创建它。创建一个新文件,并将其命名为“Dockerfile”。使用 VS Code 等文本编辑器打开它,并添加以下内容:
FROM postgres
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB world
COPY world.sql /docker-entrypoint-initdb.d/
最后一行指向一个 SQL 转储文件。你可以在这里找到我正在使用的那个。下载它并将 .sql 文件放在与 Dockerfile 相同的文件夹中。下一步是在终端中输入以下命令来创建我们的镜像:
docker build -t my-postgres-db ./
上面这行代码告诉 Docker 从 Dockerfile 构建一个镜像,并将其命名为“my-postgres-db”。要查看镜像,您可以运行
docker images -a
太好了,现在我们有了自己的镜像,名为“my-postgres-db”。我们可以按照以下步骤将其作为容器运行:
docker run -d --name my-postgresdb-container -p 5432:5432 my-postgres-db
您现在可以使用 Dockerfile 中指定的登录详细信息连接到此数据库。
如果您想删除图像,可以运行以下命令:
docker image rm 'nameOfTheImage'