跳过正文

在 Docker 容器中运行 PostgreSQL

Profile picture
作者
Harpal Singh
Software Engineer
目录

1. 介绍

在本教程中,我们将学习如何在 Docker 容器中运行 PostgreSQL。这个技术简化了 postgres 的设置。因此,它是开发和测试环境的理想解决方案。

让我们开始吧。

2. 前提条件

首先,确保Docker已在您的机器上安装并运行。如果还没有安装,请按照官方的Docker安装指南进行设置。

接下来,从 Docker Hub 拉取 PostgreSQL Docker 镜像:

docker pull postgres:latest

此命令将获取 PostgreSQL 镜像的最新版本。或者,我们可以通过将 latest 替换为所需的标签(例如,13.2)来指定特定版本。所有可用的标签可以在 PostgreSQL Docker Hub 页面上找到。

3. 启动一个PostgreSQL容器

要启动一个PostgreSQL容器,请运行以下命令:

docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

让我们来解析这个命令:

  • –name my-postgres: 为容器指定一个名称。
  • -e POSTGRES_PASSWORD=mysecretpassword: 为默认的 postgres 用户设置密码。
  • -d: 使容器以分离模式运行。这意味着容器在后台启动。
  • postgres: 指定要使用的 Docker 镜像。在本例中,我们将使用最新版本。

4. 访问 PostgreSQL 实例

现在,我们应该在名为 my-postgres 的容器中有一个 PostgreSQL 实例。因此,我们不能直接从终端使用 psql 命令,因为这将不可用。相反,我们可以使用 docker exec 命令来访问容器内的 PostgreSQL 实例:

docker exec -it my-postgres psql -U postgres

现在,我们应该有一个可以用来与数据库交互的shell。
我们通常不会直接访问数据库。但是,目前,这是访问数据库的唯一方式。

让我们配置容器,以便将数据库暴露给主机。

5. 配置 PostgreSQL 容器

要从主机连接,我们需要配置容器使其暴露数据库端口。为此,我们可以使用 –publish-p 选项将容器的端口映射到主机端口:

docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres

现在,如果我们连接到 localhost:5432,就可以从主机访问数据库了。此外,我们为 postgres 用户设置了密码,这样我们就可以使用数据库客户端,例如 DBeaver,来连接数据库。

记住这些命令可能会很困难。相反,我们可以使用一个 docker-compose.yml 文件来定义我们的容器。这样做,我们还可以与团队共享配置。

让我们停止并删除当前的容器:

docker stop my-postgres
docker rm my-postgres

现在,我们可以创建我们的 docker-compose.yml 文件。

6. 使用 Docker Compose

一个 docker-compose 只是我们想要运行的容器的文件描述,格式为 YAML。 让我们为 Postgresql 容器创建一个 docker-compose.yml 文件:

version: '3.1'

services:
  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    ports:
      - 5432:5432

在上面的例子中,我们定义了一个名为 db 的服务,其配置与之前类似。唯一新增的部分是重启选项。简而言之,我们告诉 Docker,如果容器停止运行,例如由于错误或系统重启,则始终重新启动容器。

让我们在保存此文件的同一目录下使用 docker-compose 命令运行容器:

docker-compose up -d

再一次,我们使用 -d 选项在分离模式下运行容器。

要停止并移除容器,我们可以使用 docker-compose down 命令:

docker-compose down

现在,我们知道如何使用 Docker 轻松创建一个本地数据库了。但是请记住,这不适用于生产环境
我们需要为生产环境考虑其他事项。

如果我们有机会,我们应该选择一个托管数据库服务,例如 Amazon RDSGoogle Cloud SQLAzure Database for PostgreSQL

7. 持久化 PostgreSQL 容器数据

在当前设置下,如果我们删除PostgreSQL容器,我们也会丢失其中包含的数据。为了持久化数据,我们可以使用 –volume-v 选项将本地文件夹挂载到容器中。例如:

docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -v /path/to/local/folder:/var/lib/postgresql/data -d postgres

简而言之,PostgreSQL 数据将使用文件夹 path/to/local/folder 来存储其内容。因此,如果我们删除容器并使用相同的卷重新创建它,数据仍然会存在。

8. 结论

在本教程中,我们学习了如何在Docker容器中运行和配置PostgreSQL。我们首先展示了一个快速命令来启动数据库的运行实例。接下来,我们使用一个 docker-compose.yml 文件来定义容器。最后,我们讨论了通过将本地文件夹挂载到容器来持久化数据。