如何在Docker上开始使用PostgreSQL

13,224 阅读7分钟

在这篇文章中,我们将学习如何在Docker上开始使用PostgreSQL。PostgreSQL是最流行的开源数据库之一,被很多开发者所使用。它具有高度的稳定性,有一个庞大的社区来维护和支持数据库的开发周期。PostgreSQL可以安装在任何操作系统上,如Windows、macOS和Linux。随着容器化技术的兴起,PostgreSQL现在也可以使用Docker进行安装。

Docker是一个流行的应用程序,使用户能够将应用程序捆绑到容器中,帮助轻松部署资源。本文将向你介绍在Mac上安装和使用Docker的基本概念,然后从Docker Hub资源库中拉出一个PostgreSQL Docker镜像。除了PostgreSQL之外,我们还将使用Docker安装PgAmin4,它可以用来用Docker管理PostgreSQL实例。

什么是Docker,为什么我们需要它?

Docker是一种开源的容器化应用技术,使用它可以在企业内部或云端轻松部署你的应用。你可以将你的应用程序捆绑到docker镜像中,这些镜像已经存储了运行应用程序所需的必要配置。在部署过程中,你只需要在生产环境中运行docker镜像,所有的配置都会在镜像中。在我之前的文章《如何设置和运行SQL Server Docker镜像》中,我已经谈到了在本地机器上安装Docker。请参考安装程序,并跟着做。一旦Docker安装成功,你可以通过以下命令在终端上检查它。

docker –version

Checking Docker Version - PostgreSQL Docker

图1 - 检查Docker版本

你可以通过使用以下命令来检查所有安装在Docker上的镜像。

docker image ls

List all installed Docker Images - PostgreSQL Docker

图2 - 列出所有安装的Docker镜像

需要注意的是,PostgreSQL的Docker镜像不应该有活动的安装,否则在进一步进行之前需要将其删除。你可以通过在终端上使用以下命令来移除你现有的镜像。

docker image rm <<IMAGE_NAME>>

安装PostgreSQL Docker镜像

现在,我们可以开始把PostgreSQL Docker镜像拉到我们的本地机器上了。Docker镜像被托管在云端的仓库中,被称为Docker hub。你可以从Docker hub拉取镜像,也可以将你的镜像发布到Docker hub。官方的PostgreSQL Docker镜像可以在Docker Hub上找到。要把镜像拉到你的本地,你可以在终端上运行以下命令。

docker pull Postgres

Pulling the PostgreSQL Docker image on local

图3 - 拉动本地的PostgreSQL Docker镜像

一旦docker镜像被拉到本地机器上,你可以通过以下命令检查本地所有已安装的镜像。

docker image ls

Checking installed images on local

图4 - 检查本地已安装的映像

正如你在上图中看到的,PostgreSQL镜像已经安装在你的机器上。现在,镜像已经安装完毕,下一步将是运行这个镜像。当我们运行一个Docker镜像时,会给这个镜像创建一个新的容器。换句话说,一个容器是一个Docker镜像的运行实例。

运行PostgreSQL镜像

要运行PostgreSQL的Docker镜像,你可以使用以下命令。

docker run –name pgsql-dev -e POSTGRES_PASSWORD=Welcome4$ -p 5432:5432 Postgres

在上面的命令中,我们调用了docker的run方法,它将创建一个现有docker镜像的运行实例。与此同时,我们还需要传递一些参数,如下。

  • 名称 - 我们需要为容器提供一个名称,这个容器将在docker运行镜像时被创建。
  • 环境变量 - 当运行PostgreSQL的docker镜像时,我们唯一需要设置的强制性环境变量是数据库的密码。默认用户是 "Postgres"。
  • 端口 - 我们需要定义数据库在容器中运行的端口和主机上的哪个端口可以用来访问它。正如你所看到的,命令中提到了两个端口,其形式为HOST_PORT:DOCKER_PORT。

最后,我们提供创建容器的docker镜像的名称。

Running the PostgreSQL docker image

图5 - 运行PostgreSQL docker镜像

一旦你运行该命令,你可以看到容器启动并准备接受数据库连接。这里需要注意的一点是,我们没有在分离模式下执行命令,这意味着只要终端打开,数据库或容器就会一直运行。

现在要连接到数据库,让我们打开一个新的终端窗口并输入以下命令。

docker exec -it pgsql-dev bash

这个命令将在容器内启动一个交互式终端。接下来,你可以通过在同一个终端上运行以下命令来启动PostgreSQL。

psql -h localhost _U postgres

Interacting with the PSQL command line utility from terminal

图6 - 从终端与PSQL命令行工具进行交互

一旦通过命令行工具连接,你可以列出所有正在运行的数据库并执行其他SQL语句。如果你喜欢通过GUI来使用PostgreSQL环境,那么请跟着做。我们还将安装PgAdmin4工具,并从它连接到PostgreSQL数据库。

安装PgAdmin4的docker镜像

你可以在拉取PgAdmin4的docker镜像时遵循类似的步骤。你可以在一个新的终端窗口运行以下命令。

docker pull dpage/pgadmin4

Installing Docker image for PgAdmin4

图7 - 安装PgAdmin4的Docker镜像

要运行PgAdmin4的docker镜像,你需要运行以下命令。

docker run -e ‘PGADMIN_DEFAULT_EMAIL=test@domain.local’ -e ‘PGADMIN_DEFAULT_PASSWORD=test1234’ -p 8080:80 –name pgadmin4-dev dpage/pgadmin4

PgAdmin4镜像接受了两个强制性的环境变量PGADMIN_DEFAULT_EMAIL和PGADMIN_DEFAULT_PASSWORD,使网络应用程序能够登录。除此之外,我们还指定了PgAdmin4的运行端口。我们指定docker的80端口将与主机的8080端口绑定。这意味着网络应用将在主机上的8080端口可用。

Running the PgAdmin4 image on local

图8 - 在本地运行PgAdmin4镜像

一旦docker容器启动并运行,你就可以前往网络浏览器并连接到http://localhost:8080。

Running the PgAdmin4 web application

图9 - 运行PgAdmin4网页应用程序

正如你所看到的,PgAdmin4网络应用程序已经启动并运行,并且在8080端口可用。你可以使用凭证登录到PgAdmin4控制台。

从 PgAdmin4 连接到 PostgreSQL 数据库

一旦你登录到PgAdmin4控制台,最后一步是通过连接到已经在机器上运行的PostgreSQL docker实例来创建一个服务器。为此,我们需要知道PostgreSQL数据库的确切IP地址。我们可以通过检查正在运行的容器来获取这一信息。打开一个新的终端窗口,输入以下命令。

docker inspect pgsql-dev

Inspecting PostgreSQL Docker container

图10 - 检查PostgreSQL Docker容器

向下滚动,直到你找到 Networks.bridge.IPAddress 部分。复制IPAddress并存储起来以备后用。

Fetching the IPAddress of the PostgreSQL Docker container

图11 - 获取PostgreSQL Docker容器的IPAddress

现在我们有了PostgreSQL数据库的IP地址,到PgAdmin4窗口去创建一个新的服务器。使用上一步中复制的IP地址和你在创建容器时使用的密码。点击 "保存"。

Connecting to the PostgreSQL database

图12 - 连接到PostgreSQL数据库

一旦连接成功,你会看到实例的仪表盘将打开,并显示默认的Postgres数据库。

Connected to PostgreSQL Docker container

图13 - 连接到PostgreSQL Docker容器

总结

在这篇文章中,我们已经了解了在Docker上安装PostgreSQL。我们已经了解了如何从资源库中提取PostgreSQL Docker镜像,然后创建一个容器,在其中运行和托管数据库应用程序。我们已经使用命令行界面与PostgreSQL数据库进行了交互。我们还安装了PgAdmin4,一个用于管理PostgreSQL实例的工具。PostgreSQL和PgAdmin4都可以独立安装,然而,使用Docker可以使它被容器化,你可以很容易地把捆绑的东西运送到其他机器上进行部署。