跳过正文

在 Docker 容器中运行 PostgreSQL

DevOps Postgres Docker Database
作者
Harpal Singh
Software Engineer
翻译者
Namastecode
目录

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 RDS Google 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 文件来定义容器。最后,我们讨论了通过将本地文件夹挂载到容器来持久化数据。