如何在 Docker 上运行 PostgreSQL 和 pgAdmin?
目录:
先决条件
从这里安装适用于您计算机的所有 Docker 工具
设置 Docker 网络
我们将把 PostgreSQL 和 pgAdmin 安装在不同的容器中。
为了使这两个容器能够相互通信,它们需要位于同一个 Docker 网络中。
-
在终端中使用以下命令创建 Docker 网络:
docker network create my-network -
此命令使用以下选项创建一个新的 Docker 网络:
create my-network:将网络名称设置为“my-network”,但也可以将其设置为任何您喜欢的名称。
设置 PostgreSQL 容器
这里涉及两个步骤。请在终端上执行以下操作。
-
使用以下命令从Docker Hub 仓库拉取最新的 PostgreSQL Docker 镜像:
docker pull postgres -
等待镜像下载完成。Docker 会自动下载必要的层和依赖项。
-
使用以下命令基于刚刚拉取的镜像创建并运行一个新容器:
docker run --name my-postgres -e POSTGRES_PASSWORD=password -network my-network -d -p 5432:5432 postgres -
上述命令使用以下选项启动一个新的 PostgreSQL 容器:
--name my-postgres: 将容器名称设置为“my-postgres”,我们可以将其设置为我们喜欢的任何名称。-e POSTGRES_PASSWORD=password:将默认“postgres”用户的密码设置为“password”。-network my-network将 Docker 网络连接到“my-network”,这是我们之前创建的网络。-d:以分离模式(在后台)运行容器。-p 5432:5432:将容器的端口 5432 映射到主机的端口 5432,允许从容器外部访问 PostgreSQL 服务器。postgres: 指定用于创建容器的 Docker 镜像;在我们的例子中,它是我们在步骤 1中从 Docker Hub 拉取的镜像。
设置 pgAdmin 容器
这也包括两个步骤。
-
使用以下命令从Docker Hub 仓库拉取 pgAdmin 4 的官方 Docker 发行版:
docker pull dpage/pgadmin4 -
等待镜像下载完成。Docker 会自动下载必要的层和依赖项。
-
使用以下命令基于刚刚拉取的镜像创建并运行一个新容器:
docker run --name my-pgadmin -p 80:80 -v /path/to/local/directory:/var/lib/pgadmin -e PGADMIN_DEFAULT_EMAIL=your_email@example.com -e PGADMIN_DEFAULT_PASSWORD=your_password --network my-network -d dpage/pgadmin4 -
上述命令使用以下选项启动一个新的 PostgreSQL 容器:
--name my-pgadmin:将容器名称设置为“my-pgadmin”,我们可以将其设置为我们喜欢的任何名称。-p 80:80将容器的 80 端口映射到主机的 80 端口。这样就可以通过 Web 浏览器访问 pgAdmin。-v /path/to/local/directory:/var/lib/pgadmin:将主机上的本地目录(/path/to/local/directory)挂载到容器内的 /var/lib/pgadmin 目录。请将 /path/to/local/directory 替换为主机上您希望存储 pgAdmin 数据的实际路径。通过挂载卷,pgAdmin 数据将持久化到容器外部的主机上。即使您停止并移除容器,指定的本地目录中的数据仍将保持不变。-e PGADMIN_DEFAULT_EMAIL=your_email@example.com设置用于登录 pgAdmin 的默认电子邮件地址。请将your_email@example.com替换为您想要的电子邮件地址。-e PGADMIN_DEFAULT_PASSWORD=your_password设置 pgAdmin 的默认登录密码。请将 your_password 替换为您所需的密码。-network my-network将 Docker 网络连接到“my-network”,这是我们之前创建的网络。-d:以分离模式运行容器,这意味着它在后台运行。dpage/pgadmin4:指定用于创建容器的 Docker 镜像。
在容器化的 PostgreSQL 上创建新数据库
现在 PostgreSQL 容器已经设置并运行,让我们在其服务器上创建一个新的数据库。
-
请确保 PostgreSQL 容器正在运行:
- 打开终端或命令提示符。
- 运行以下命令列出正在运行的 Docker 容器,然后验证您的 PostgreSQL 容器是否已列出且状态为“正在运行”:
docker ps -
使用以下命令在 PostgreSQL 容器内打开一个 shell:
- 替换为 PostgreSQL 容器的实际名称或 ID(在本例中为 my-postgres)。
- 此命令会在容器内打开一个交互式 shell 会话。
docker exec -it <container_name_or_id> bash -
在容器的 shell 中,使用 psql 命令连接到 PostgreSQL 数据库,命令如下:
psql -U postgres -
接下来,使用以下 SQL 命令创建一个新数据库:
- 替换为新数据库所需的名称
CREATE DATABASE <database_name>;
在容器化的 pgAdmin 上访问新数据库
-
请确保 pgAdmin 容器正在运行:
- 打开终端或命令提示符。
- 运行以下命令列出正在运行的 Docker 容器,并验证 pgAdmin 容器是否已列出并正在运行。
docker ps -
在网页浏览器中访问http://localhost并输入设置过程中使用的用户名和密码。
-
在 pgAdmin 中,使用以下详细信息创建一个新的服务器连接:
Host name/address: my-postgres(PostgreSQL 容器的名称)Port:5432(容器内PostgreSQL的默认端口)Username: postgres(PostgreSQL 的默认用户名)Password运行 PostgreSQL 容器时指定的密码
-
现在你应该能够使用指定的服务器连接,从 pgAdmin 容器连接到 PostgreSQL 容器。两个容器都通过“my-network”网络进行通信。
尖端
-
如果本地已经运行了 PostgreSQL,那么它很可能已经配置为在默认端口 5432 上运行。
- 为防止冲突,请将 PostgreSQL 容器映射到不同的端口。
- 在下面的示例中,PostgreSQL 容器内部仍然使用 5432 端口,但它在主机上映射到 5433 端口。
docker run --name my-postgres -e POSTGRES_PASSWORD=password -network my-network -d -p 5433:5432 postgres -
与其通过http://localhost访问 pgAdmin ,我们可以将其映射到特定的 URL,例如http://local.pgadmin,以便更方便地访问。
- 我们通过在主机上使用像 Nginx 这样的反向代理服务器来实现这一点。我以后会专门写一篇文章来介绍这方面的内容。
-
如果我们需要从代码中以编程方式访问容器化数据库该怎么办?
- 这里没有任何变化,我们访问它的方式与访问本地数据库的方式相同,例如:
postgres://postgres:password@localhost:5433/<the_containerized_database_name>?sslmode=prefer